code: 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;
  
      }
  }
  