1 /*
   2  * Copyright (c) 2014, 2015, Dynatrace and/or its affiliates. All rights reserved.
   3  * 
   4  * This file is part of the Lock Contention Tracing Subsystem for the HotSpot
   5  * Virtual Machine, which is developed at Christian Doppler Laboratory on
   6  * Monitoring and Evolution of Very-Large-Scale Software Systems. Please
   7  * contact us at <http://mevss.jku.at/> if you need additional information
   8  * or have any questions.
   9  *
  10  * This code is free software; you can redistribute it and/or modify it
  11  * under the terms of the GNU General Public License version 2 only, as
  12  * published by the Free Software Foundation.
  13  *
  14  * This code is distributed in the hope that it will be useful, but WITHOUT
  15  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  16  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  17  * version 2 for more details (a copy is included in the LICENSE file that
  18  * accompanied this code).
  19  *
  20  * You should have received a copy of the GNU General Public License version
  21  * 2 along with this work. If not, see <http://www.gnu.org/licenses/>.
  22  *
  23  */ 
  24 package sun.evtracing.processing.statistics.aggregator;
  25 
  26 import java.util.Map;
  27 
  28 import sun.evtracing.processing.statistics.NumberStatistic;
  29 import sun.evtracing.processing.statistics.metadata.Contention;
  30 
  31 public abstract class Aggregator implements ContentionProcessor {
  32         private final AggregatorFactory<? extends Aggregator> factory;
  33         private final NumberStatistic statistic;
  34         
  35         public Aggregator(AggregatorFactory<? extends Aggregator> factory) {
  36                 this.factory = factory;
  37                 statistic = new NumberStatistic();
  38         }
  39 
  40         public Aggregator(Aggregator x, Aggregator y) {
  41                 assert x.factory == y.factory;
  42                 factory = x.factory;
  43 
  44                 statistic = NumberStatistic.merge(x.statistic, y.statistic);
  45         }
  46 
  47         public AggregatorFactory<? extends Aggregator> factory() {
  48                 return factory;
  49         }
  50 
  51         public NumberStatistic statistic() {
  52                 return statistic;
  53         }
  54 
  55         @Override
  56         public void submit(Contention c) {
  57                 statistic.add(c.duration);
  58                 submitToChildren(c);
  59         }
  60 
  61         public abstract void submitToChildren(Contention c);
  62 
  63         @Override
  64         public abstract void merge();
  65 
  66         public abstract Map<?, Aggregator> children();
  67         
  68         public abstract <R> R accept(AggregatorVisitor<R> v, Object element);
  69 }