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 }