package glug.model; import com.google.common.base.Function; import com.madgag.interval.Interval; import com.madgag.interval.collections.IntervalMap; import glug.model.time.LogInstant; import glug.model.time.LogInterval; import glug.parser.ThreadId; import java.util.Collection; import java.util.HashMap; import java.util.Map; import static com.google.common.collect.Collections2.transform; import static com.google.common.collect.Maps.newHashMap; import static com.madgag.interval.SimpleInterval.union; public class ThreadModel { private Map<Object, IntervalMap<LogInstant, SignificantInterval>> map = new HashMap<Object, IntervalMap<LogInstant, SignificantInterval>>(); private final ThreadedSystem threadedSystem; private final ThreadId threadId; public ThreadModel(String name, ThreadedSystem threadedSystem) { this.threadId = new ThreadId(name); this.threadedSystem = threadedSystem; } public ThreadId getThreadId() { return threadId; } public void add(SignificantInterval significantInterval) { Object intervalTypeDescriptor = significantInterval.getIntervalTypeDescriptor(); if (!map.containsKey(intervalTypeDescriptor)) { map.put(intervalTypeDescriptor, IntervalMap.<LogInstant, SignificantInterval>newConcurrentIntervalMap()); } map.get(intervalTypeDescriptor).put(significantInterval.getLogInterval(),significantInterval); } public Interval<LogInstant> getInterval() { return union(transform(map.values(), new Function<IntervalMap<LogInstant, SignificantInterval>, Interval<LogInstant>>() { public Interval<LogInstant> apply(IntervalMap<LogInstant, SignificantInterval> significantInstants) { return significantInstants.getSpannedInterval(); } } )); } public IntervalMap<LogInstant, SignificantInterval> significantIntervalsFor(Object intervalTypeDescriptor) { return map.get(intervalTypeDescriptor); } public SignificantInterval getSignificantIntervalsFor(Object intervalTypeDescriptor, LogInstant instant) { IntervalMap<LogInstant, SignificantInterval> significantInstants = significantIntervalsFor(intervalTypeDescriptor); return significantInstants==null?null:significantInstants.getEventAt(instant); } public String getName() { return threadId.getName(); } public Map<Object, SignificantInterval> getSignificantIntervalsFor(final LogInstant instant) { Map<Object, SignificantInterval> significantIntervals = newHashMap(); for (IntervalMap<LogInstant, SignificantInterval> significantInstants : map.values()) { SignificantInterval significantIntervalAtInstant = significantInstants.getEventAt(instant); if (significantIntervalAtInstant!=null) { significantIntervals.put(significantIntervalAtInstant.getIntervalTypeDescriptor(),significantIntervalAtInstant); } } return significantIntervals; } public ThreadedSystem getThreadedSystem() { return threadedSystem; } @Override public String toString() { return getClass().getSimpleName()+"["+getInterval()+"]"; } public Map<Object, Integer> countOccurencesDuring(LogInterval logInterval, Object... typesOfIntervalsToCount) { Map<Object, Integer> countMap = new HashMap<Object, Integer>(typesOfIntervalsToCount.length); for (Object intervalType : typesOfIntervalsToCount) { IntervalMap<LogInstant, SignificantInterval> significantInstants = map.get(intervalType); if (significantInstants!=null) { int occurences = significantInstants.getEventsDuring(logInterval).size(); if (occurences>0) { countMap.put(intervalType, occurences); } } } return countMap; } public Collection<Object> getIntervalTypes() { return map.keySet(); } }