26
26
import java.util.HashMap;
27
27
import java.util.HashSet;
28
import java.util.Locale;
29
30
public class ContactsCache
32
* Information that can be used to identify a contact within the cache
33
* A thing that can be used to identify (or lookup) a contact within the
34
* contacts cache. It is not a reference to a cache entry and may not
35
* identify an existing contact in the cache.
34
static public class CacheIdentifier
37
public static class CacheIdentifier
37
NONE, NAME, ORGANISATION, PRIMARY_NUMBER, PRIMARY_EMAIL }
39
public enum Type { NAME, ORGANISATION, PRIMARY_NUMBER, PRIMARY_EMAIL }
39
41
private Type _type;
40
42
private String _detail;
42
protected CacheIdentifier()
45
* Obtain a cache identifier. This routine is designed to be as robust
46
* as possible (in terms of bad or null detail values), and to return
47
* null when a cache identifier can not be created.
48
* @param type the detail type
49
* @param detail the detail
50
* @return the cache identifier, or null
52
public static CacheIdentifier factory( Type type, String detail )
56
case NAME: detail = normaliseName( detail ); break;
57
case ORGANISATION: detail = normaliseOrganisation( detail ); break;
58
case PRIMARY_NUMBER: detail = normalisePhoneNumber( detail ); break;
59
case PRIMARY_EMAIL: detail = normaliseEmailAddress( detail ); break;
62
if( detail == null ) return null;
63
return new CacheIdentifier( type, detail );
67
* Obtain a cache identifier from contact data. This routine is
68
* designed to be as robust as possible and may return null when a cache
69
* identifier can not be created.
70
* @param contact the contact data
71
* @return the cache identifier, or null
73
public static CacheIdentifier factory( Importer.ContactData contact )
75
CacheIdentifier identifier = null;
77
if( contact.hasName() )
78
identifier = factory( CacheIdentifier.Type.NAME,
80
if( identifier != null ) return identifier;
82
if( contact.hasPrimaryOrganisation() )
83
identifier = factory( CacheIdentifier.Type.ORGANISATION,
84
contact.getPrimaryOrganisation() );
85
if( identifier != null ) return identifier;
87
if( contact.hasPrimaryNumber() )
88
identifier = factory( CacheIdentifier.Type.PRIMARY_NUMBER,
89
contact.getPrimaryNumber() );
90
if( identifier != null ) return identifier;
92
if( contact.hasPrimaryEmail() )
93
identifier = factory( CacheIdentifier.Type.PRIMARY_EMAIL,
94
contact.getPrimaryEmail() );
95
if( identifier != null ) return identifier;
47
100
protected CacheIdentifier( Type type, String detail )
80
133
= new HashMap< Long, HashSet< String > >();
81
134
private HashMap< Long, HashSet< String > > _contactOrganisations
82
135
= new HashMap< Long, HashSet< String > >();
84
public static CacheIdentifier createIdentifier(
85
Importer.ContactData contact )
87
if( contact.hasName() ) {
88
String name = normaliseName( contact.getName() );
90
return new CacheIdentifier(
91
CacheIdentifier.Type.NAME, name );
94
if( contact.hasPrimaryOrganisation() ) {
95
String organisation = normaliseOrganisation(
96
contact.getPrimaryOrganisation() );
97
if( organisation != null )
98
return new CacheIdentifier(
99
CacheIdentifier.Type.ORGANISATION, organisation );
102
if( contact.hasPrimaryNumber() ) {
103
String number = normalisePhoneNumber( contact.getPrimaryNumber() );
105
return new CacheIdentifier(
106
CacheIdentifier.Type.PRIMARY_NUMBER, number );
109
if( contact.hasPrimaryEmail() ) {
110
String email = normaliseEmailAddress( contact.getPrimaryEmail() );
112
return new CacheIdentifier(
113
CacheIdentifier.Type.PRIMARY_EMAIL, email );
136
private HashMap< Long, HashSet< String > > _contactNotes
137
= new HashMap< Long, HashSet< String > >();
119
139
public boolean canLookup( CacheIdentifier identifier )
121
141
return lookup( identifier ) != null;
145
* Retrieve the contact id of a contact identified by the specified cache
146
* identifier, if it exists.
147
* @param identifier the cache identifier
148
* @return a contact id, or null
124
150
public Long lookup( CacheIdentifier identifier )
126
152
switch( identifier.getType() )
212
* Remove any data that is associated with an contact id.
175
215
public void removeAssociatedData( Long id )
177
217
_contactNumbers.remove( id );
178
218
_contactEmails.remove( id );
179
219
_contactAddresses.remove( id );
180
220
_contactOrganisations.remove( id );
221
_contactNotes.remove( id );
183
224
public boolean hasAssociatedNumber( Long id, String number )
266
306
set = new HashSet< String >();
267
307
_contactOrganisations.put( id, set );
269
set.add( normaliseOrganisation( organisation ) );
309
set.add( organisation );
312
public boolean hasAssociatedNote( Long id, String note )
314
note = normaliseNote( note );
315
if( note == null ) return false;
317
HashSet< String > set = _contactNotes.get( id );
318
return set != null && set.contains( note );
321
public void addAssociatedNote( Long id, String note )
323
note = normaliseNote( note );
324
if( note == null ) return;
326
HashSet< String > set = _contactNotes.get( id );
328
set = new HashSet< String >();
329
_contactNotes.put( id, set );
272
334
static public String normaliseName( String name )