package org.jactr.eclipse.runtime.session.manager.internal;
/*
* default logging
*/
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.Executor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jactr.core.concurrent.ExecutorServices;
import org.jactr.eclipse.runtime.launching.session.AbstractSession;
import org.jactr.eclipse.runtime.session.ISession;
import org.jactr.eclipse.runtime.session.ISessionListener;
import org.jactr.eclipse.runtime.session.data.ISessionData;
import org.jactr.eclipse.runtime.session.impl.Session2SessionAdapter;
import org.jactr.eclipse.runtime.session.manager.ISessionManager;
import org.jactr.eclipse.runtime.session.manager.ISessionManagerListener;
import org.jactr.eclipse.runtime.session.stream.ISessionDataStream;
import org.jactr.eclipse.runtime.trace.impl.GeneralEventManager;
import org.jactr.eclipse.runtime.trace.impl.GeneralEventManager.INotifier;
public class SessionManager implements ISessionManager
{
/**
* Logger definition
*/
static private final transient Log LOGGER = LogFactory
.getLog(SessionManager.class);
private final Set<ISession> _activeSessions;
private final Map<UUID, ISession> _sessionById;
private final GeneralEventManager<ISessionManagerListener, Object[]> _eventManager;
private final ISessionListener _sessionListener;
public SessionManager()
{
_activeSessions = new HashSet<ISession>();
_sessionById = new HashMap<UUID, ISession>();
_eventManager = new GeneralEventManager<ISessionManagerListener, Object[]>(
new INotifier<ISessionManagerListener, Object[]>() {
public void notify(ISessionManagerListener listener, Object[] event)
{
Boolean add = (Boolean) event[0];
ISession session = (ISession) event[1];
if (add)
listener.sessionAdded(session);
else
listener.sessionRemoved(session);
}
});
_sessionListener = new ISessionListener() {
public void sessionDestroyed(ISession session)
{
}
public void sessionClosed(ISession session)
{
removeSession(session);
}
public void newSessionData(ISessionData sessionData)
{
}
public void newSessionDataStream(ISessionData sessionData,
ISessionDataStream sessionDataStream)
{
}
};
}
public Set<ISession> getSessions(Set<ISession> container)
{
if (container == null) container = new HashSet<ISession>();
synchronized (_activeSessions)
{
container.addAll(_activeSessions);
}
return container;
}
public ISession getSession(UUID sessionId)
{
synchronized (_sessionById)
{
return _sessionById.get(sessionId);
}
}
public void addListener(ISessionManagerListener listener, Executor executor)
{
_eventManager.addListener(listener, executor);
}
public Collection<ISessionManagerListener> getListeners()
{
Collection<ISessionManagerListener> listeners = new ArrayList<ISessionManagerListener>();
_eventManager.getListeners(listeners);
return listeners;
}
public void removeListener(ISessionManagerListener listener)
{
_eventManager.removeListener(listener);
}
public void addSession(ISession session)
{
synchronized (_sessionById)
{
_sessionById.put(session.getSessionId(), session);
}
synchronized (_activeSessions)
{
_activeSessions.add(session);
}
/*
* add our own listener
*/
session.addListener(_sessionListener, ExecutorServices.INLINE_EXECUTOR);
_eventManager.notify(new Object[] { Boolean.TRUE, session });
}
public void addSession(AbstractSession session)
{
ISession newSession = new Session2SessionAdapter(session);
session.setSession(newSession);
addSession(newSession);
}
public void removeSession(ISession session)
{
session.removeListener(_sessionListener);
synchronized (_sessionById)
{
_sessionById.remove(session.getSessionId());
}
synchronized (_activeSessions)
{
_activeSessions.remove(session);
}
_eventManager.notify(new Object[] { Boolean.FALSE, session });
}
}