/******************************************************************************* * Copyright (c) 2006 Mountainminds GmbH & Co. KG * This software is provided under the terms of the Eclipse Public License v1.0 * See http://www.eclipse.org/legal/epl-v10.html. * * $Id: SessionManager.java 103 2006-09-21 11:13:05Z mho $ ******************************************************************************/ package com.mountainminds.eclemma.internal.core; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import com.mountainminds.eclemma.core.ICoverageSession; import com.mountainminds.eclemma.core.ISessionListener; import com.mountainminds.eclemma.core.ISessionManager; /** * ISessionManager implementation. * * @author Marc R. Hoffmann * @version $Revision: 103 $ */ public class SessionManager implements ISessionManager { private List sessions = new ArrayList(); private Map keymap = new HashMap(); private ICoverageSession activeSession = null; private List listeners = new ArrayList(); public void addSession(ICoverageSession session, boolean activate, Object key) { if (session == null) throw new NullPointerException(); if (!sessions.contains(session)) { sessions.add(session); if (key != null) { keymap.put(key, session); } fireSessionAdded(session); if (activate) { activeSession = session; fireSessionActivated(session); } } } public void removeSession(ICoverageSession session) { if (sessions.contains(session)) { boolean sessionActivated = false; if (session.equals(activeSession)) { activeSession = null; for (int i = sessions.size(); --i >= 0;) { if (!session.equals(sessions.get(i))) { activeSession = (ICoverageSession) sessions.get(i); break; } } sessionActivated = true; } sessions.remove(session); keymap.values().remove(session); fireSessionRemoved(session); if (sessionActivated) { fireSessionActivated(activeSession); } } } public void removeSession(Object key) { removeSession(getSession(key)); } public void removeAllSessions() { while (!sessions.isEmpty()) { ICoverageSession session = (ICoverageSession) sessions.remove(0); keymap.values().remove(session); fireSessionRemoved(session); } if (activeSession != null) { activeSession = null; fireSessionActivated(null); } } public ICoverageSession[] getSessions() { return (ICoverageSession[]) sessions.toArray(new ICoverageSession[sessions.size()]); } public ICoverageSession getSession(Object key) { return (ICoverageSession) keymap.get(key); } public void activateSession(ICoverageSession session) { if (sessions.contains(session) && !session.equals(activeSession)) { activeSession = session; fireSessionActivated(session); } } public void activateSession(Object key) { activateSession(getSession(key)); } public ICoverageSession getActiveSession() { return activeSession; } public void refreshActiveSession() { if (activeSession != null) { fireSessionActivated(activeSession); } } public void addSessionListener(ISessionListener listener) { if (listener == null) throw new NullPointerException(); if (!listeners.contains(listener)) { listeners.add(listener); } } public void removeSessionListener(ISessionListener listener) { listeners.remove(listener); } protected void fireSessionAdded(ICoverageSession session) { // avoid concurrent modification issues Iterator i = new ArrayList(listeners).iterator(); while (i.hasNext()) { ((ISessionListener) i.next()).sessionAdded(session); } } protected void fireSessionRemoved(ICoverageSession session) { // avoid concurrent modification issues Iterator i = new ArrayList(listeners).iterator(); while (i.hasNext()) { ((ISessionListener) i.next()).sessionRemoved(session); } } private void fireSessionActivated(ICoverageSession session) { // avoid concurrent modification issues Iterator i = new ArrayList(listeners).iterator(); while (i.hasNext()) { ((ISessionListener) i.next()).sessionActivated(session); } } }