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 }