diff options
Diffstat (limited to 'src/net/java/sip/communicator/plugin/phonenumbercontactsource/PhoneNumberContactQuery.java')
-rw-r--r-- | src/net/java/sip/communicator/plugin/phonenumbercontactsource/PhoneNumberContactQuery.java | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/src/net/java/sip/communicator/plugin/phonenumbercontactsource/PhoneNumberContactQuery.java b/src/net/java/sip/communicator/plugin/phonenumbercontactsource/PhoneNumberContactQuery.java new file mode 100644 index 0000000..e65ba51 --- /dev/null +++ b/src/net/java/sip/communicator/plugin/phonenumbercontactsource/PhoneNumberContactQuery.java @@ -0,0 +1,228 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.plugin.phonenumbercontactsource; + +import java.util.*; +import java.util.regex.*; + +import net.java.sip.communicator.service.contactsource.*; +import net.java.sip.communicator.service.protocol.*; +import net.java.sip.communicator.service.protocol.ServerStoredDetails.*; + +/** + * The <tt>PhoneNumberContactQuery</tt> is a query over the + * <tt>PhoneNumberContactSource</tt>. + * + * @author Yana Stamcheva + */ +public class PhoneNumberContactQuery + extends AsyncContactQuery<PhoneNumberContactSource> +{ + /** + * The query string. + */ + private String queryString; + + /** + * The contact count. + */ + private int contactCount; + + /** + * Creates an instance of <tt>PhoneNumberContactQuery</tt> by specifying + * the parent contact source, the query string to match and the maximum + * result contacts to return. + * + * @param contactSource the parent contact source + * @param queryString the query string to match + * @param contactCount the maximum result contact count + */ + public PhoneNumberContactQuery( PhoneNumberContactSource contactSource, + String queryString, + int contactCount) + { + super(contactSource, + Pattern.compile(queryString, Pattern.CASE_INSENSITIVE + | Pattern.LITERAL)); + + this.queryString = queryString; + this.contactCount = contactCount; + } + + /** + * Do all the work in different thread. + */ + public void run() + { + Iterator<ProtocolProviderService> providers + = PNContactSourceActivator + .getPhoneNumberProviders().iterator(); + + while (providers.hasNext()) + { + if(contactCount > 0 && getQueryResultCount() > contactCount) + break; + + ProtocolProviderService provider = providers.next(); + + OperationSetPersistentPresence persPresOpSet + = provider.getOperationSet( + OperationSetPersistentPresence.class); + + // If there's no presence operation set continue to the + // next protocol provider. + if (persPresOpSet == null) + continue; + + ContactGroup rootGroup + = persPresOpSet.getServerStoredContactListRoot(); + + addResultContactsForGroup(rootGroup); + + Iterator<ContactGroup> subgroups = rootGroup.subgroups(); + + while (subgroups.hasNext()) + { + ContactGroup group = subgroups.next(); + + addResultContactsForGroup(group); + } + } + + if (getStatus() != QUERY_CANCELED) + setStatus(QUERY_COMPLETED); + } + + /** + * Adss the result contacts for the given group. + * + * @param group the <tt>ContactGroup</tt> to check for matching contacts + */ + private void addResultContactsForGroup(ContactGroup group) + { + Iterator<Contact> contacts = group.contacts(); + while (contacts.hasNext()) + { + if(contactCount > 0 && getQueryResultCount() > contactCount) + break; + + Contact contact = contacts.next(); + + addAdditionalNumbers(contact); + } + } + + /** + * Returns all additional phone numbers corresponding to the given + * contact. + * + * @param contact the <tt>contact</tt>, which phone details we're + * looking for + * @return a list of all additional phone numbers corresponding to the + * given contact + */ + private void addAdditionalNumbers(Contact contact) + { + OperationSetServerStoredContactInfo infoOpSet + = contact.getProtocolProvider().getOperationSet( + OperationSetServerStoredContactInfo.class); + + Iterator<GenericDetail> details; + + if(infoOpSet != null) + { + details = infoOpSet.getAllDetailsForContact(contact); + + while(details.hasNext()) + { + if(contactCount > 0 && getQueryResultCount() > contactCount) + break; + + GenericDetail d = details.next(); + if(d instanceof PhoneNumberDetail && + !(d instanceof PagerDetail) && + !(d instanceof FaxDetail)) + { + PhoneNumberDetail pnd = (PhoneNumberDetail)d; + if(pnd.getNumber() != null && + pnd.getNumber().length() > 0) + { + String localizedType = null; + + if(d instanceof WorkPhoneDetail) + { + localizedType = + PNContactSourceActivator.getResources() + .getI18NString("service.gui.WORK_PHONE"); + } + else if(d instanceof MobilePhoneDetail) + { + localizedType = + PNContactSourceActivator.getResources() + .getI18NString("service.gui.MOBILE_PHONE"); + } + else + { + localizedType = + PNContactSourceActivator.getResources() + .getI18NString("service.gui.PHONE"); + } + + String contactName = contact.getDisplayName(); + String contactAddress = contact.getAddress(); + String numberString = pnd.getNumber(); + + if(queryString == null + || (queryString != null + && (numberString.startsWith( + queryString) + || contactName.startsWith(queryString) + || contactAddress.startsWith(queryString) + ))) + { + ArrayList<ContactDetail> contactDetails + = new ArrayList<ContactDetail>(); + + ContactDetail detail + = new ContactDetail(pnd.getNumber()); + ArrayList<Class<? extends OperationSet>> + supportedOpSets + = new ArrayList<Class<? extends OperationSet>>(); + supportedOpSets + .add(OperationSetBasicTelephony.class); + detail.setSupportedOpSets(supportedOpSets); + + contactDetails.add(detail); + + PhoneNumberSourceContact numberSourceContact + = new PhoneNumberSourceContact( + getContactSource(), + contact, + contactDetails, + pnd.getNumber() + + "(" + localizedType + ")"); + + addQueryResult(numberSourceContact); + } + } + } + } + } + } + + @Override + protected String normalizePhoneNumber(String phoneNumber) + { + return null; + } + + @Override + protected boolean phoneNumberMatches(String phoneNumber) + { + return false; + } +}
\ No newline at end of file |