/**************************************************************************** * Copyright (c) 2004 Composent, Inc. and others. * 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: * Composent, Inc. - initial API and implementation *****************************************************************************/ package org.eclipse.ecf.presence.roster; import java.util.*; import org.eclipse.core.runtime.IAdapterManager; import org.eclipse.ecf.core.identity.ID; import org.eclipse.ecf.internal.presence.PresencePlugin; import org.eclipse.ecf.presence.IPresence; import org.eclipse.ecf.presence.IPresenceSender; public abstract class AbstractRosterManager implements IRosterManager { protected IRoster roster; private List rosterSubscriptionListeners = new ArrayList(); private List rosterUpdateListeners = new ArrayList(); public AbstractRosterManager() { // null constructor } public AbstractRosterManager(IRoster roster) { this.roster = roster; } public synchronized void addRosterSubscriptionListener(IRosterSubscriptionListener listener) { if (listener != null) { synchronized (rosterSubscriptionListeners) { rosterSubscriptionListeners.add(listener); } } } public synchronized void addRosterListener(IRosterListener listener) { if (listener != null) { synchronized (rosterUpdateListeners) { rosterUpdateListeners.add(listener); } } } protected void fireRosterUpdate(IRosterItem changedItem) { List toNotify = null; synchronized (rosterUpdateListeners) { toNotify = new ArrayList(rosterUpdateListeners); } for (Iterator i = toNotify.iterator(); i.hasNext();) ((IRosterListener) i.next()).handleRosterUpdate(roster, changedItem); } protected void fireRosterAdd(IRosterEntry entry) { List toNotify = null; synchronized (rosterUpdateListeners) { toNotify = new ArrayList(rosterUpdateListeners); } for (Iterator i = toNotify.iterator(); i.hasNext();) ((IRosterListener) i.next()).handleRosterEntryAdd(entry); } protected void fireRosterRemove(IRosterEntry entry) { List toNotify = null; synchronized (rosterUpdateListeners) { toNotify = new ArrayList(rosterUpdateListeners); } for (Iterator i = toNotify.iterator(); i.hasNext();) ((IRosterListener) i.next()).handleRosterEntryRemove(entry); } protected void fireSubscriptionListener(ID fromID, IPresence.Type presencetype) { List toNotify = null; synchronized (rosterSubscriptionListeners) { toNotify = new ArrayList(rosterSubscriptionListeners); } for (Iterator i = toNotify.iterator(); i.hasNext();) { IRosterSubscriptionListener l = (IRosterSubscriptionListener) i.next(); if (presencetype.equals(IPresence.Type.SUBSCRIBE)) { l.handleSubscribeRequest(fromID); } else if (presencetype.equals(IPresence.Type.SUBSCRIBED)) { l.handleSubscribed(fromID); } else if (presencetype.equals(IPresence.Type.UNSUBSCRIBED)) { l.handleUnsubscribed(fromID); } } } public abstract IPresenceSender getPresenceSender(); public IRoster getRoster() { return roster; } public abstract IRosterSubscriptionSender getRosterSubscriptionSender(); public synchronized void removeRosterSubscriptionListener(IRosterSubscriptionListener listener) { if (listener != null) { synchronized (rosterSubscriptionListeners) { rosterSubscriptionListeners.remove(listener); } } } public synchronized void removeRosterListener(IRosterListener listener) { if (listener != null) { synchronized (rosterUpdateListeners) { rosterUpdateListeners.remove(listener); } } } public Object getAdapter(Class adapter) { if (adapter.isInstance(this)) { return this; } IAdapterManager adapterManager = PresencePlugin.getDefault().getAdapterManager(); if (adapterManager != null) { return adapterManager.loadAdapter(this, adapter.getName()); } return null; } public void disconnect() { roster.getItems().clear(); fireRosterUpdate(roster); synchronized (rosterUpdateListeners) { rosterUpdateListeners.clear(); } synchronized (rosterSubscriptionListeners) { rosterSubscriptionListeners.clear(); } } }