package org.jactr.eclipse.runtime.marker; /* * default logging */ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.TreeSet; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jactr.eclipse.runtime.session.data.ISessionData; import org.jactr.eclipse.runtime.session.stream.AbstractRollingSessionDataStream; import org.jactr.tools.marker.tracer.MarkerTransformedEvent; public class OpenMarkerSessionDataStream extends AbstractRollingSessionDataStream<MarkerTransformedEvent, OpenMarkers> { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(OpenMarkerSessionDataStream.class); private final MarkerSessionDataStream _msds; private final Set<Long> _currentlyOpen; private final Set<OpenMarkers> _knownModified; public OpenMarkerSessionDataStream(ISessionData sessionData, int windowSize, MarkerSessionDataStream msds) { super("openMarkers", sessionData, windowSize); _msds = msds; _currentlyOpen = new TreeSet<Long>(); _knownModified = new HashSet<OpenMarkers>(); } public MarkerSessionDataStream getRawMarkerDataStream() { return _msds; } @Override public void clear() { _knownModified.clear(); _currentlyOpen.clear(); super.clear(); } @Override protected Collection<OpenMarkers> getModifiedData() { Collection<OpenMarkers> modified = Collections.EMPTY_LIST; if (_knownModified.size() > 0) { modified = new ArrayList<OpenMarkers>(_knownModified); _knownModified.clear(); } return modified; } @Override protected Collection<OpenMarkers> toOutputData(MarkerTransformedEvent marker) { long markerId = marker.getMarkerId(); double eventTime = marker.getSimulationTime(); double lastDataTime = Double.MIN_VALUE; OpenMarkers lastData = getLastData(); if (lastData != null) lastDataTime = lastData.getTime(); Collection<OpenMarkers> rtn = Collections.EMPTY_LIST; /* * new time frame? create a new OpenMarkers */ if (eventTime > lastDataTime) { lastData = new OpenMarkers(eventTime, _currentlyOpen); rtn = Collections.singleton(lastData); } else /* * reusing, mark it as modified */ _knownModified.add(lastData); /* * now update the currentlyOpen set, that is, deal with this marker directly */ if (marker.isClosed()) { _currentlyOpen.remove(markerId); lastData.remove(markerId); } else { _currentlyOpen.add(markerId); if (lastData != null) lastData.add(markerId); } return rtn; } @Override protected double getTime(OpenMarkers id) { return id.getTime(); } }