001    /*
002     @license.text@
003      */
004    package biz.hammurapi.metrics;
005    
006    import java.io.Serializable;
007    import java.util.ArrayList;
008    import java.util.Collection;
009    import java.util.Date;
010    import java.util.Iterator;
011    import java.util.List;
012    
013    import org.w3c.dom.Element;
014    
015    import biz.hammurapi.xml.dom.DomSerializable;
016    
017    /**
018     * @author Pavel Vlasov
019     *
020     * @version $Revision: 1.4 $
021     */
022    public class SimpleSlice implements Slice, Serializable, DomSerializable {
023    
024            /**
025             * Comment for <code>serialVersionUID</code>
026             */
027            private static final long serialVersionUID = 6148347920575353798L;
028    
029            private String name;
030            private boolean keepMeasurements;
031        private int measurements;
032        private double total;
033        private double min;
034        private double max;
035        private double deviation;
036        private List measurementsList;
037            private long from;
038            private long to;
039    
040            public SimpleSlice(String name) {
041                    this(name, false);
042            }
043            
044            public SimpleSlice(String name, boolean keepMeasurements) {
045                    this.name=name;
046                    this.keepMeasurements=keepMeasurements;
047                    measurementsList=new ArrayList();
048            }       
049            
050            /**
051             * Constructs a copy of master slice.
052             * @param master
053             */
054            public SimpleSlice(Slice master) {
055                    name = master.getName();
056                measurements = master.getNumber();
057                total = master.getTotal();
058                min = master.getMin();
059                max = master.getMax();
060                deviation = master.getDeviation();
061                    from = master.getFrom();
062                    to = master.getTo();            
063    
064                    if (master.getMeasurements()!=null && !master.getMeasurements().isEmpty()) {
065                            keepMeasurements = true;
066                            measurementsList = new ArrayList();
067                            Iterator it = master.getMeasurements().iterator();
068                            while (it.hasNext()) {
069                                    measurementsList.add(new SimpleMeasurement((Measurement) it.next()));
070                            }
071                    }
072            }
073        
074        public int getNumber() {
075            return measurements;
076        }
077        
078        public double getMin() {
079            return min;
080        }
081        
082        public double getMax() {
083            return max;
084        }
085        
086        public double getAvg() {
087            return total/measurements;
088        }
089        
090        public double getTotal() {
091            return total;
092        }
093        
094        public void add(final double value, final long time) {
095            if (measurements==0 || value<min) {
096                min=value;
097            }
098            
099            if (measurements==0 || value>max) {
100                max=value;
101            }
102            
103            if (measurements==0 || from>time) {
104                    from=time;
105            }
106            
107            if (measurements==0 || to<time) {
108                    to=time;
109            }
110            
111            total+=value;        
112            measurements++;
113            deviation+=Math.abs(value-total/measurements);
114           
115            if (keepMeasurements) {
116                    class PrivateMeasurement implements Measurement, Serializable {
117                                    public double getValue() {
118                                            return value;
119                                    }
120    
121                                    public long getTime() {
122                                            return time;
123                                    }                                       
124                    }
125                    
126                            measurementsList.add(new PrivateMeasurement());
127            }
128        }
129        
130        public void add(Metric metric) {
131            if (measurements==0 || metric.getMin()<min) {
132                min=metric.getMin();
133            }
134            
135            if (measurements==0 || metric.getMax()>max) {
136                max=metric.getMax();
137            }
138            
139            if (metric instanceof Slice) {
140                    Slice slice=(Slice) metric;
141                    if (measurements==0 || from>slice.getFrom()) {
142                            from=slice.getFrom();
143                    }
144                    
145                    if (measurements==0 || to<slice.getTo()) {
146                            to=slice.getTo();
147                    }
148            }
149            
150            measurements+=metric.getNumber();
151            total+=metric.getTotal();
152            deviation+=metric.getDeviation()*metric.getNumber();
153            
154            if (keepMeasurements) {
155                    measurementsList.addAll(metric.getMeasurements());
156            }
157        }
158        
159            public Collection getMeasurements() {
160                    return measurementsList;
161            }
162    
163            public String getName() {
164                    return name;
165            }    
166            
167            public String toString() {
168                    StringBuffer ret=new StringBuffer();
169                    ret.append(measurements)
170                            .append("/")
171                            .append(total)
172                            .append(" <= ")
173                            .append(name)
174                            .append("\n");
175                    if (measurementsList!=null) {
176                            Iterator it=measurementsList.iterator();
177                            while (it.hasNext()) {
178                                    Measurement m=(Measurement) it.next();
179                                    ret.append("\t");
180                                    ret.append(m.getValue());
181                                    ret.append(" <- ");
182                                    ret.append(new Date(m.getTime()));
183                                    ret.append("\n");
184                            }
185                    }
186                    return ret.toString();
187            }
188    
189            public int compareTo(Object o) {
190                    if (o instanceof Slice) {
191                            return Double.compare(((Slice) o).getTotal(), total);  
192                    }
193                    
194                    return 1;
195            }
196            
197            public long getFrom() {
198                    return from;
199            }
200    
201            public long getTo() {
202                    return to;
203            }
204    
205        public double getDeviation() {
206            return deviation/measurements;
207        }
208    
209            public void toDom(Element holder) {
210                    holder.setAttribute("name", getName());
211            holder.setAttribute("avg", String.valueOf(getAvg()));
212            holder.setAttribute("min", String.valueOf(getMin()));
213                    holder.setAttribute("max", String.valueOf(getMax()));
214                    
215            holder.setAttribute("total", String.valueOf(getTotal()));
216            holder.setAttribute("number", String.valueOf(getNumber()));
217                    holder.setAttribute("deviation", String.valueOf(getDeviation()));
218           
219            Collection measurements = getMeasurements();
220                    if (measurements!=null) {
221                    Iterator it=measurements.iterator();
222                    while (it.hasNext()) {
223                            Measurement ms=(Measurement) it.next();
224                            Element me = holder.getOwnerDocument().createElement("measurement");
225                                    holder.appendChild(me);
226                                    me.setAttribute("value", String.valueOf(ms.getValue()));
227                                    me.setAttribute("time", String.valueOf(ms.getTime()));
228                    }
229            }
230            }
231    }