package org.jactr.eclipse.runtime.trace.impl; /* * default logging */ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jactr.eclipse.runtime.session.ISession; import org.jactr.eclipse.runtime.session.ISessionListener; import org.jactr.tools.tracer.transformer.ITransformedEvent; public abstract class RuntimeTraceDataManager<T> implements ISessionListener { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(RuntimeTraceDataManager.class); private Map<ISession, Map<String, T>> _data; private Map<ISession, Map<String, String>> _commonModelNameMap; private int _executedSessions; protected RuntimeTraceDataManager() { _data = new HashMap<ISession, Map<String, T>>(); _commonModelNameMap = new HashMap<ISession, Map<String, String>>(); // ACTRSession.getACTRSessionTracker().addListener(this); // RuntimePlugin.getDefault().getSessionManager().addListener(this, null); } protected T getRuntimeTraceData(ISession session, String modelName, boolean create) { boolean added = false; T data = null; String commonName = null; synchronized (_data) { Map<String, T> container = _data.get(session); Map<String, String> commonNames = _commonModelNameMap.get(session); if (container == null) { if (!create) return null; container = new TreeMap<String, T>(); commonNames = new TreeMap<String, String>(); _commonModelNameMap.put(session, commonNames); _data.put(session, container); _executedSessions++; } /* * translation from the session specific modelname, to the system specific */ commonName = commonNames.get(modelName); if (commonName == null) { commonName = modelName + (_data.size() == 1 ? "" : "." + _data.size()); commonNames.put(modelName, commonName); } data = container.get(commonName); if (data == null) { if (!create) return null; data = createRuntimeTraceData(session, commonName, modelName); container.put(commonName, data); added = true; } } if (added) modelAdded(session, data, commonName); return data; } /** * hook to fire an event when a model is added * * @param session * @param data * @param modelName */ protected void modelAdded(ISession session, T data, String commonName) { } /** * hook to fire an event when a model is removed * * @param session * @param data * @param modelName */ protected void modelRemoved(ISession session, T data, String modelName) { } public T getRuntimeTraceData(ISession session, String modelName) { return getRuntimeTraceData(session, modelName, false); } public Collection<T> getAllRuntimeTraceData(Collection<T> container) { if (container == null) container = new ArrayList<T>(); synchronized (_data) { for (Map<String, T> sessionData : _data.values()) container.addAll(sessionData.values()); } return container; } public Collection<T> getAllRuntimeTraceData(ISession session, Collection<T> container) { if (container == null) container = new ArrayList<T>(); Map<String, T> data = null; synchronized (_data) { data = _data.get(session); } if (data != null) container.addAll(data.values()); return container; } abstract protected T createRuntimeTraceData(ISession session, String commonModelName, String trueName); abstract protected void disposeRuntimeTraceData(ISession session, String commonModelName, T data); public void process(ITransformedEvent event, ISession session) { String modelName = event.getModelName(); T data = getRuntimeTraceData(session, modelName, true); process(session, modelName, data, event); } abstract protected void process(ISession session, String modelName, T data, ITransformedEvent event); public void sessionOpened(ISession session) { // noop } public void sessionClosed(ISession session, boolean normal) { // noop } public void sessionDestroyed(ISession session) { Map<String, T> container = null; synchronized (_data) { container = _data.remove(session); _commonModelNameMap.remove(session); } if (container != null) for (Map.Entry<String, T> data : container.entrySet()) { modelRemoved(session, data.getValue(), data.getKey()); disposeRuntimeTraceData(session, data.getKey(), data.getValue()); } } }