package org.gridkit.jvmtool.stacktrace.analytics; import java.util.Map; import java.util.TreeMap; import org.gridkit.jvmtool.stacktrace.ThreadSnapshot; public class ThreadSplitAggregator { private ThreadDumpAggregatorFactory[] aggregators; private Map<Long, ThreadTrack> data = new TreeMap<Long, ThreadTrack>(); public ThreadSplitAggregator(ThreadDumpAggregatorFactory... aggregators) { this.aggregators = aggregators; } public void feed(ThreadSnapshot threadDump) { ThreadTrack tt = track(threadDump.threadId()); process(tt, threadDump); } private ThreadTrack track(long threadId) { ThreadTrack tt = data.get(threadId); if (tt == null) { tt = new ThreadTrack(); tt.aggregations = new ThreadDumpAggregator[aggregators.length]; for(int i = 0; i != tt.aggregations.length; ++i) { tt.aggregations[i] = aggregators[i].newInstance(); } data.put(threadId, tt); } return tt; } private void process(ThreadTrack tt, ThreadSnapshot threadDump) { for(ThreadDumpAggregator tda: tt.aggregations) { tda.aggregate(threadDump); } tt.threadName = threadDump.threadName(); } public Object[][] report() { Object[][] result = new Object[data.size()][]; int n = 0; for(long threadId: data.keySet()) { result[n] = new Object[aggregators.length + 2]; ThreadTrack tt = data.get(threadId); result[n][0] = tt.threadName; result[n][1] = threadId; for(int i = 0; i != aggregators.length; ++i) { result[n][2 + i] = tt.aggregations[i].info(); } ++n; } return result; } private static class ThreadTrack { String threadName; ThreadDumpAggregator[] aggregations; } }