/******************************************************************************* * Copyright (c) 2005, 2007 Remy Suen * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Remy Suen <remy.suen@gmail.com> - initial API and implementation ******************************************************************************/ package org.eclipse.ecf.protocol.msn; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.eclipse.ecf.protocol.msn.events.IContactListListener; import org.eclipse.ecf.protocol.msn.internal.encode.StringUtils; /** * <p> * A ContactList stores a list of {@link Contact}s. * </p> * * <p> * <b>Note:</b> This class/interface is part of an interim API that is still * under development and expected to change significantly before reaching * stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this * API will almost certainly be broken (repeatedly) as the API evolves. * </p> */ public final class ContactList { private final Map groups; private final ArrayList contacts; /** * The list of listeners that is associated with this. */ private final ArrayList listeners; private final MsnClient client; /** * Creates a new ContactList to store Contacts. * * @param client * the client that this list is for */ ContactList(MsnClient client) { this.client = client; groups = new HashMap(); contacts = new ArrayList(); listeners = new ArrayList(); } /** * Notifies all listeners attached to this contact list that the given * contact has been added. * * @param contact * the contact that has been added */ private void fireContactAdded(Contact contact) { synchronized (listeners) { for (int i = 0; i < listeners.size(); i++) { ((IContactListListener) listeners.get(i)).contactAdded(contact); } } } void fireContactRemoved(String guid) { Contact contact = findContactByGuid(guid); if (!contact.getGroups().isEmpty()) { contact.remove(); } synchronized (listeners) { for (int i = 0; i < listeners.size(); i++) { ((IContactListListener) listeners.get(i)) .contactRemoved(contact); } } } void fireContactAddedUser(String email) { synchronized (listeners) { for (int i = 0; i < listeners.size(); i++) { ((IContactListListener) listeners.get(i)) .contactAddedUser(email); } } } void fireContactRemovedUser(String email) { synchronized (listeners) { for (int i = 0; i < listeners.size(); i++) { ((IContactListListener) listeners.get(i)) .contactRemovedUser(email); } } } private void fireGroupAdded(Group group) { synchronized (listeners) { for (int i = 0; i < listeners.size(); i++) { ((IContactListListener) listeners.get(i)).groupAdded(group); } } } void internalAddContact(String email, String contactName) { addContact(email, contactName, null); } void addContact(String email, String contactName, String guid) { Contact contact; if (guid == null) { contact = new Contact(email, contactName); contacts.add(contact); } else { contact = findContactByGuid(guid); if (contact == null) { contact = new Contact(email, contactName, guid); } contacts.add(contact); } fireContactAdded(contact); } void addContact(String contactName, String email, String guid, String groupGUID) { Contact contact = new Contact(email, contactName, guid); contacts.add(contact); String[] split = StringUtils.split(groupGUID, ','); for (int i = 0; i < split.length; i++) { ((Group) groups.get(split[i])).add(contact); } fireContactAdded(contact); } void addGroup(String guid, Group group) { groups.put(guid, group); fireGroupAdded(group); } /** * Adds the contact with the specified email to this list. * * @param email * the contact's email address * @param userName * the name to be assigned to this contact, or <tt>null</tt> if * one does not need to be assigned * @throws IOException * If an I/O error occurs while attempting to send the request * to the server */ public void addContact(String email, String userName) throws IOException { if (userName == null || userName.equals("")) { //$NON-NLS-1$ client.add(email, email); } else { client.add(email, userName); } } /** * Removes the specified contact from the user's list. * * @param contact * the contact to remove * @throws IOException * If an I/O error occurs while attempting to send the request * to the server */ public void removeContact(Contact contact) throws IOException { client.remove(contact); } /** * Removes the specified group from the user's list. * * @param group * the group to remove * @throws IOException * If an I/O error occurs while attempting to send the request * to the server */ public void removeGroup(Group group) throws IOException { String guid = getGuid(group); if (guid != null) { client.remove(guid); } } /** * Returns the contact that uses the specified email address. The search * performed is case-sensitive. * * @param email * the email address of the desired contact * @return the contact that is associated with the given email address, or * <code>null</code> if none could be found */ public Contact getContact(String email) { for (int i = 0; i < contacts.size(); i++) { Contact contact = (Contact) contacts.get(i); if (contact.getEmail().equals(email)) { return contact; } } return null; } private Contact findContactByGuid(String guid) { for (int i = 0; i < contacts.size(); i++) { Contact contact = (Contact) contacts.get(i); if (guid.equals(contact.getGuid())) { return contact; } } return null; } public Collection getContacts() { return Collections.unmodifiableCollection(contacts); } public Collection getGroups() { return Collections.unmodifiableCollection(groups.values()); } String getGuid(Group group) { for (Iterator it = groups.entrySet().iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry) it.next(); if (entry.getValue() == group) { return (String) entry.getKey(); } } return null; } /** * Adds a IContactListener to this. * * @param listener * the listener to be added */ public void addContactListListener(IContactListListener listener) { if (listener != null) { synchronized (listeners) { if (!listeners.contains(listener)) { listeners.add(listener); } } } } /** * Removes a IContactListener from this. * * @param listener * the listener to be removed */ public void removeContactsListListener(IContactListListener listener) { if (listener != null) { synchronized (listeners) { listeners.remove(listener); } } } public String toString() { return contacts.toString(); } }