package org.jactr.eclipse.runtime.marker;
/*
* default logging
*/
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
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.impl.DefaultMarker;
import org.jactr.tools.marker.tracer.MarkerTransformedEvent;
public class MarkerSessionDataStream extends
AbstractRollingSessionDataStream<MarkerTransformedEvent, Long>
{
/**
* Logger definition
*/
static private final transient Log LOGGER = LogFactory
.getLog(MarkerSessionDataStream.class);
private SortedMap<Long, Map<String, String>> _markerProperties;
private Set<Long> _knownModifiedMarkers;
public MarkerSessionDataStream(ISessionData sessionData, int windowSize)
{
super("marker", sessionData, windowSize);
_markerProperties = new TreeMap<Long, Map<String, String>>();
_knownModifiedMarkers = new TreeSet<Long>();
}
@Override
public void clear()
{
_knownModifiedMarkers.clear();
_markerProperties.clear();
super.clear();
}
@Override
protected double getTime(Long id)
{
try
{
return Double.parseDouble(getMarkerPropertiesInternal(id).get(
DefaultMarker.OPEN_TIME));
}
catch (Exception e)
{
LOGGER
.error(String.format("Failed to get proper open time for marker %d ",
id), e);
return 0;
}
}
@Override
protected Collection<Long> toOutputData(MarkerTransformedEvent input)
{
long id = input.getMarkerId();
Map<String, String> newProperties = input
.getProperties(new TreeMap<String, String>());
Map<String, String> oldProperties = _markerProperties
.put(id, newProperties);
if (oldProperties != null) _knownModifiedMarkers.add(id);
return Collections.singleton(id);
}
@Override
protected Collection<Long> getModifiedData()
{
Collection<Long> modified = Collections.EMPTY_LIST;
if (_knownModifiedMarkers.size() > 0)
{
modified = new ArrayList<Long>(_knownModifiedMarkers);
_knownModifiedMarkers.clear();
}
return modified;
}
public double getCloseTime(long markerId)
{
return getDouble(markerId, DefaultMarker.CLOSE_TIME, Double.NaN);
}
public double getOpenTime(long markerId)
{
return getDouble(markerId, DefaultMarker.OPEN_TIME, Double.NaN);
}
public String getName(long markerId)
{
return getString(markerId, DefaultMarker.NAME, null);
}
public String getType(long markerId)
{
return getString(markerId, DefaultMarker.TYPE, null);
}
public String getDescription(long markerId)
{
return getString(markerId, DefaultMarker.DESCRIPTION, null);
}
public String getModelName(long markerId)
{
return getString(markerId, DefaultMarker.MODEL_NAME, null);
}
protected double getDouble(long markerId, String propertyName,
double defaultValue)
{
try
{
Map<String, String> properties = getMarkerPropertiesInternal(markerId);
String value = properties.get(propertyName);
if (value == null) return defaultValue;
return Double.parseDouble(value);
}
catch (Exception e)
{
if (LOGGER.isWarnEnabled())
LOGGER.warn(String.format(
"Could not extract %s from marker:%d, setting to %.2f ",
propertyName, markerId, defaultValue), e);
return defaultValue;
}
}
protected String getString(long markerId, String propertyName,
String defaultValue)
{
try
{
Map<String, String> properties = getMarkerPropertiesInternal(markerId);
String value = properties.get(propertyName);
if (value == null) return defaultValue;
return value;
}
catch (Exception e)
{
if (LOGGER.isWarnEnabled())
LOGGER.warn(String.format(
"Could not extract %s from marker:%d, setting to %s ",
propertyName, markerId, defaultValue), e);
return defaultValue;
}
}
public Map<String, String> getMarkerProperties(long markerId,
Map<String, String> container)
{
if (container == null) container = new TreeMap<String, String>();
Map<String, String> properties = _markerProperties.get(markerId);
if (properties != null) container.putAll(properties);
return container;
}
protected Map<String, String> getMarkerPropertiesInternal(long markerId)
{
return _markerProperties.get(markerId);
}
/**
* zip through the data, looking for any that are closed. We only remove
* expired and closed markers
*/
@Override
protected void removeSubset(double timeOfData, double cullToTime,
Collection<Long> data, Collection<Long> removed)
{
Iterator<Long> itr = data.iterator();
while (itr.hasNext())
{
long markerId = itr.next();
double closeTime = getCloseTime(markerId);
if (!Double.isNaN(closeTime) && closeTime < cullToTime)
{
removed.add(markerId);
itr.remove();
}
}
}
@Override
protected void removed(Collection<Long> removed)
{
for (Long toBeRemoved : removed)
_markerProperties.remove(toBeRemoved);
}
}