blob: bc73fcd434f55453fd114447f1c5c66d1b01e8d5 [file] [log] [blame]
/*******************************************************************************
* 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();
}
}