package org.jactr.tools.marker; /* * default logging */ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.concurrent.Executor; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jactr.core.event.ACTREventDispatcher; import org.jactr.core.logging.Logger; import org.jactr.core.model.IModel; import org.jactr.tools.marker.impl.MarkerEvent; /** * singleton manager for IMarker's associated with the current runtime * * @author harrison */ public class MarkerManager { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(MarkerManager.class); static final MarkerManager _instance = new MarkerManager(); private final ACTREventDispatcher<MarkerManager, IMarkerListener> _dispatcher; private long _lastId = 0; private Map<IModel, Set<IMarker>> _activeMarkers; static public MarkerManager get() { return _instance; } protected MarkerManager() { _dispatcher = new ACTREventDispatcher<MarkerManager, IMarkerListener>(); _activeMarkers = new HashMap<IModel, Set<IMarker>>(); } public void addListener(IMarkerListener listener, Executor executor) { _dispatcher.addListener(listener, executor); } public void removeListener(IMarkerListener listener) { _dispatcher.removeListener(listener); } public Set<IMarker> getMarkers(IModel model, Set<IMarker> container) { if (container == null) container = new HashSet<IMarker>(); Set<IMarker> forModel = _activeMarkers.get(model); if (forModel != null) container.addAll(forModel); return container; } public long newId() { return ++_lastId; } public void opened(IMarker marker) { IModel markerModel = marker.getModel(); if (LOGGER.isDebugEnabled()) LOGGER.debug(String.format("%s opened @ %.2f", marker.getName(), marker.getStartTime())); Set<IMarker> markers = _activeMarkers.get(markerModel); if (markers == null) { markers = new HashSet<IMarker>(); _activeMarkers.put(markerModel, markers); } markers.add(marker); if (Logger.hasLoggers(markerModel)) Logger.log(markerModel, "MARKERS", String.format("+ %s(%d)[%s]", marker.getName(), marker.getId(), marker.getType())); if (_dispatcher.hasListeners()) _dispatcher.fire(new MarkerEvent(this, marker.getModel().getAge(), MarkerEvent.Type.OPENED, marker)); } public void closed(IMarker marker) { IModel markerModel = marker.getModel(); if (LOGGER.isDebugEnabled()) LOGGER.debug(String.format("%s closed @ %.2f", marker.getName(), marker.getEndTime())); Set<IMarker> markers = _activeMarkers.get(markerModel); if (markers != null) { markers.remove(marker); if (markers.size() == 0) _activeMarkers.remove(markerModel); } if (Logger.hasLoggers(markerModel)) Logger.log(markerModel, "MARKERS", String.format("- %s(%d)[%s]", marker.getName(), marker.getId(), marker.getType())); if (_dispatcher.hasListeners()) _dispatcher.fire(new MarkerEvent(this, marker.getModel().getAge(), MarkerEvent.Type.CLOSED, marker)); } }