001    /*
002    @license.text@
003     */
004    
005    package biz.hammurapi.metrics;
006    
007    import java.io.Serializable;
008    import java.util.ArrayList;
009    import java.util.Collection;
010    import java.util.Iterator;
011    import java.util.List;
012    
013    /**
014     *
015     * @author  Pavel Vlasov
016     * @version $Revision: 1.8 $
017     */
018    public class SimpleMetric implements Metric, Comparable, Serializable {
019            /**
020             * Comment for <code>serialVersionUID</code>
021             */
022            private static final long serialVersionUID = -3636560361707914006L;
023            private String name;
024            private boolean keepMeasurements;
025    
026            public SimpleMetric(String name) {
027                    this.name=name;
028            }
029            
030            public SimpleMetric(String name, boolean keepMeasurements) {
031                    this.name=name;
032                    this.keepMeasurements=keepMeasurements;
033            }
034            
035        private int measurements;
036        private double total;
037        private double min;
038        private double max;
039        private double deviation;
040        
041        public int getNumber() {
042            return measurements;
043        }
044        
045        public double getMin() {
046            return min;
047        }
048        
049        public double getMax() {
050            return max;
051        }
052        
053        public double getAvg() {
054            return total/measurements;
055        }
056        
057        public double getTotal() {
058            return total;
059        }
060        
061        public void add(final double value, final long time) {
062            addMeasurement(new Measurement() {
063                            public double getValue() {
064                                    return value;
065                            }
066                    
067                            public long getTime() {
068                                    return time;
069                            }               
070                    });
071        }
072        
073        /**
074             * @param value
075             * @param measurement
076             */
077            protected void addMeasurement(Measurement measurement) {
078                    if (measurements==0 || measurement.getValue()<min) {
079                min=measurement.getValue();
080            }
081            
082            if (measurements==0 || measurement.getValue()>max) {
083                max=measurement.getValue();
084            }
085            
086            measurements++;        
087            total+=measurement.getValue();        
088            deviation+=Math.abs(measurement.getValue()-total/measurements);
089            
090            if (keepMeasurements) {
091                            measurementsList.add(measurement);
092            }
093            }
094    
095            /**
096             * @param value
097             * @param time
098             * @return
099             */
100            protected Measurement newMeasurement(final double value, final long time) {
101                    return new Measurement() {
102                            public double getValue() {
103                                    return value;
104                            }
105    
106                            public long getTime() {
107                                    return time;
108                            }               
109                    };
110            }
111    
112            public void add(Metric metric) {
113            if (measurements==0 || metric.getMin()<min) {
114                min=metric.getMin();
115            }
116            
117            if (measurements==0 || metric.getMax()>max) {
118                max=metric.getMax();
119            }
120            
121            measurements+=metric.getNumber();
122            total+=metric.getTotal();
123            deviation+=metric.getDeviation()*metric.getNumber();
124            
125            if (keepMeasurements) {
126                    measurementsList.addAll(metric.getMeasurements());
127            }
128        }
129        
130        private List measurementsList=new ArrayList();
131    
132            public Collection getMeasurements() {
133                    return measurementsList;
134            }
135    
136            public String getName() {
137                    return name;
138            }    
139            
140            public String toString() {
141                    StringBuffer ret=new StringBuffer();
142                    ret.append(measurements)
143                            .append("/")
144                            .append(total)
145                            .append(" <= ")
146                            .append(name)
147                            .append("\n");
148                    Iterator it=measurementsList.iterator();
149                    while (it.hasNext()) {
150                            Measurement m=(Measurement) it.next();
151                            ret.append("\t");
152                            ret.append(m.getValue());
153                            ret.append(" <- ");
154                            ret.append("\n");
155                    }
156                    return ret.toString();
157            }
158    
159            public int compareTo(Object o) {
160                    if (o instanceof Metric) {
161                            return Double.compare(((Metric) o).getTotal(), total);  
162                    }
163                    
164                    return 1;
165            }
166    
167        public double getDeviation() {
168            return deviation/measurements;
169        }
170    
171    }