/* * Copyright (C) 2004-2008 Jive Software. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.xmpp.workgroup.event; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import org.jivesoftware.xmpp.workgroup.AgentSession; import org.jivesoftware.xmpp.workgroup.Workgroup; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Dispatches workgroup events. Since the dispatching is done on the "main" thread * it is important that WorkgroupEventListeners finish their jobs as soon as possible * or otherwise their jobs should be executed in another thread. * * @author Gaston Dombiak */ public class WorkgroupEventDispatcher { private static final Logger Log = LoggerFactory.getLogger(WorkgroupEventDispatcher.class); private static List<WorkgroupEventListener> listeners = new CopyOnWriteArrayList<WorkgroupEventListener>(); private WorkgroupEventDispatcher() { // Not instantiable. } /** * Registers a listener to receive events. * * @param listener the listener. */ public static void addListener(WorkgroupEventListener listener) { if (listener == null) { throw new NullPointerException(); } listeners.add(listener); } /** * Unregisters a listener to receive events. * * @param listener the listener. */ public static void removeListener(WorkgroupEventListener listener) { listeners.remove(listener); } /** * Notification message that a workgroup has been created. * * @param workgroup the workgroup that has just been created. */ public static void workgroupCreated(Workgroup workgroup) { for (WorkgroupEventListener listener : listeners) { try { listener.workgroupCreated(workgroup); } catch (Exception e) { Log.error(e.getMessage(), e); } } } /** * Notification message that a workgroup is being removed. * * @param workgroup the workgroup being removed. */ public static void workgroupDeleting(Workgroup workgroup) { for (WorkgroupEventListener listener : listeners) { try { listener.workgroupDeleting(workgroup); } catch (Exception e) { Log.error(e.getMessage(), e); } } } /** * Notification message that a workgroup has been removed. * * @param workgroup the removed workgroup. */ public static void workgroupDeleted(Workgroup workgroup) { for (WorkgroupEventListener listener : listeners) { try { listener.workgroupDeleted(workgroup); } catch (Exception e) { Log.error(e.getMessage(), e); } } } /** * Notification message that a workgroup was closed and is now opened since * an agent is now available and the schedule is ok. * * @param workgroup the workgroup that has opened. */ public static void workgroupOpened(Workgroup workgroup) { for (WorkgroupEventListener listener : listeners) { try { listener.workgroupOpened(workgroup); } catch (Exception e) { Log.error(e.getMessage(), e); } } } /** * Notification message that a workgroup has closed since no agent is available * or because of its schedule. * * @param workgroup the workgroup that has just closed. */ public static void workgroupClosed(Workgroup workgroup) { for (WorkgroupEventListener listener : listeners) { try { listener.workgroupClosed(workgroup); } catch (Exception e) { Log.error(e.getMessage(), e); } } } /** * Notification message that an Agent has joined a Workgroup. * * @param workgroup the workgroup where the agent has joined. * @param agentSession the session of the agent that has started. */ public static void agentJoined(Workgroup workgroup, AgentSession agentSession) { for (WorkgroupEventListener listener : listeners) { try { listener.agentJoined(workgroup, agentSession); } catch (Exception e) { Log.error(e.getMessage(), e); } } } /** * Notification message that an Agent has left a Workgroup. * * @param workgroup the workgroup where the agent has left. * @param agentSession the session of the agent that has ended. */ public static void agentDeparted(Workgroup workgroup, AgentSession agentSession) { for (WorkgroupEventListener listener : listeners) { try { listener.agentDeparted(workgroup, agentSession); } catch (Exception e) { Log.error(e.getMessage(), e); } } } /** * Notification message that a support chat has been started. * * @param workgroup the workgroup providing the support. * @param sessionID the ID of the session that uniquely identifies the chat. */ public static void chatSupportStarted(Workgroup workgroup, String sessionID) { for (WorkgroupEventListener listener : listeners) { try { listener.chatSupportStarted(workgroup, sessionID); } catch (Exception e) { Log.error(e.getMessage(), e); } } } /** * Notification message that a support chat has been finished. * * @param workgroup the workgroup that was providing the support. * @param sessionID the ID of the session that uniquely identifies the chat. */ public static void chatSupportFinished(Workgroup workgroup, String sessionID) { for (WorkgroupEventListener listener : listeners) { try { listener.chatSupportFinished(workgroup, sessionID); } catch (Exception e) { Log.error(e.getMessage(), e); } } } /** * Notification message that an agent has joined a chat session. The agent could * be the initial agent that accepted the initial offer or may be an agent that * was invited to participate in the chat or maybe an agent that accepted a chat * tranfer. * * @param workgroup the workgroup providing the support. * @param sessionID the ID of the session that uniquely identifies the chat. * @param agentSession the session of the agent that joined the chat. */ public static void agentJoinedChatSupport(Workgroup workgroup, String sessionID, AgentSession agentSession) { for (WorkgroupEventListener listener : listeners) { try { listener.agentJoinedChatSupport(workgroup, sessionID, agentSession); } catch (Exception e) { Log.error(e.getMessage(), e); } } } /** * Notification message that an agent has left a chat session. * * @param workgroup the workgroup providing the support. * @param sessionID the ID of the session that uniquely identifies the chat. * @param agentSession the session of the agent that left the chat. */ public static void agentLeftChatSupport(Workgroup workgroup, String sessionID, AgentSession agentSession) { for (WorkgroupEventListener listener : listeners) { try { listener.agentLeftChatSupport(workgroup, sessionID, agentSession); } catch (Exception e) { Log.error(e.getMessage(), e); } } } }