1 /* 2 * This file is a part of CAST project. 3 * (c) Copyright 2007, AGH University of Science & Technology 4 * https://caribou.iisg.agh.edu.pl/trac/cast 5 * 6 * Licensed under the Eclipse Public License, Version 1.0 (the "License"). 7 * You may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * http://www.eclipse.org/legal/epl-v10.html 10 */ 11 /* 12 * File: Statistic.java 13 * Created: 2007-00-00 14 * Author: apohllo 15 * $Id: Statistic.java 3105 2009-08-03 12:21:28Z czerwin $ 16 */ 17 18 package pl.edu.agh.cast.model.visual.backward; 19 20 /** 21 * The Statistics class represents single row of statistics of given domain model, which corresponds to single graph 22 * node. The important properties of the default statistics are: 23 * <ul> 24 * <li>the name of the node (accessible by {@link #getNodeName()}) 25 * <li>the number of target edges (i.e. the node is their end; accessible by {@link #getTarget()}) 26 * <li>the number of source edges (i.e. the node is their beginning; accessible by {@link #getSource()}) 27 * <li>the sum of edges (i.e. target + source edges; accessible by {@link #getTotal()}) 28 * </ul> 29 * 30 * There are helper methods which provide string representations of the properties, which are numbers. 31 * 32 * Domain statistics may provide different meaning for these properties (e.g. the number of sent and received short 33 * messages, the amount of money transfered, etc.) 34 * 35 * There is also one special type of statistics - the summary row. It doesn't correspond to any graph node, but 36 * summarizes the statistics. It appears at the end of the statistics, and by default contains the total number of nodes 37 * and total number of source and target edges. This row is indicated by the <tt>isSummary</tt> flag. The row is 38 * constructed by the statistics dialog, so should not be provided by domain-specific statistic providers. 39 * 40 * 41 * @author AGH CAST Team 42 */ 43 public class Statistic { 44 45 private String nodeName; 46 47 private double sourceValue; 48 49 private double targetValue; 50 51 private boolean isSummary; 52 53 /** 54 * Creates new statistics of integer values. 55 * 56 * @param nodeName 57 * the name of the node which correspond to this statistics row; may not be null 58 * @param outgoing 59 * the value of the statistics for the source edges 60 * @param incoming 61 * the value of the statistics for the target edges 62 * @throws IllegalArgumentException 63 * if node name is null 64 */ 65 public Statistic(String nodeName, int outgoing, int incoming) { 66 setNodeName(nodeName); 67 this.sourceValue = outgoing; 68 this.targetValue = incoming; 69 } 70 71 /** 72 * Creates new statistics of double values. 73 * 74 * @param nodeName 75 * the name of the node which correspond to this statistics row; may not be null 76 * @param outgoing 77 * the value of the statistics for the source edges 78 * @param incoming 79 * the value of the statistics for the target edges 80 * @throws IllegalArgumentException 81 * if node name is null 82 */ 83 public Statistic(String nodeName, double outgoing, double incoming) { 84 super(); 85 setNodeName(nodeName); 86 this.sourceValue = outgoing; 87 this.targetValue = incoming; 88 } 89 90 /** 91 * Creates new statistics with no values. 92 * 93 * @param nodeName 94 * the name of the node which correspond to this statistics row 95 */ 96 public Statistic(String nodeName) { 97 setNodeName(nodeName); 98 } 99 100 /** 101 * Set the summary flag. 102 * 103 * @param value 104 * the new flag value 105 */ 106 public void setSummary(boolean value) { 107 this.isSummary = value; 108 } 109 110 /** 111 * Is the statistic row a special (summary) row? It will always appear at the end of the statistics dialog. 112 * 113 * @return the summary flag 114 */ 115 public boolean isSummary() { 116 return isSummary; 117 } 118 119 /** 120 * Returns the name of the node which correspond to this statistics row. 121 * 122 * @return the name of the node which correspond to this statistics row 123 */ 124 public String getNodeName() { 125 return nodeName; 126 } 127 128 /** 129 * Sets the name of the node which correspond to this statistics row. 130 * 131 * @param nodeName 132 * the name of the node which correspond to this statistics row; may not be null 133 * @throws IllegalArgumentException 134 * if node name is null 135 */ 136 public void setNodeName(String nodeName) { 137 if (nodeName == null) { 138 throw new IllegalArgumentException("node name may not be null"); //$NON-NLS-1$ 139 } 140 this.nodeName = nodeName; 141 } 142 143 /** 144 * Returns the value of the statistics for the source edges. 145 * 146 * @return the value of the statistics for the source edges 147 */ 148 public double getSource() { 149 return sourceValue; 150 } 151 152 /** 153 * Sets the value of the statistics for the source edges. 154 * 155 * @param outgoing 156 * the value of the statistics for the source edges 157 */ 158 public void setSource(double outgoing) { 159 this.sourceValue = outgoing; 160 } 161 162 /** 163 * Returns the value of the statistics for the target edges. 164 * 165 * @return the value of the statistics for the target edges 166 */ 167 public double getTarget() { 168 return targetValue; 169 } 170 171 /** 172 * Sets the value of the statistics for the target edges. 173 * 174 * @param incoming 175 * the value of the statistics for the target edges 176 */ 177 public void setTarget(double incoming) { 178 this.targetValue = incoming; 179 } 180 181 /** 182 * {@inheritDoc} 183 * 184 * @see java.lang.Object#hashCode() 185 */ 186 @Override 187 public int hashCode() { 188 return (int)Math.floor(targetValue * 13 + sourceValue * 17 + nodeName.hashCode() * 19); 189 } 190 191 /** 192 * {@inheritDoc} 193 * 194 * @see java.lang.Object#equals(java.lang.Object) 195 */ 196 @Override 197 public boolean equals(Object other) { 198 if (this == other) { 199 return true; 200 } 201 if (!(other instanceof Statistic)) { 202 return false; 203 } 204 205 Statistic that = (Statistic)other; 206 207 if (this.targetValue != that.targetValue) { 208 return false; 209 } 210 if (this.sourceValue != that.sourceValue) { 211 return false; 212 } 213 if (!this.nodeName.equals(that.nodeName)) { 214 return false; 215 } 216 return true; 217 } 218 219 /** 220 * {@inheritDoc} 221 * 222 * @see java.lang.Object#toString() 223 */ 224 @Override 225 public String toString() { 226 return String.format("%1$s:%2$s:%3$s", nodeName, targetValue, sourceValue); //$NON-NLS-1$ 227 } 228 229 /** 230 * Returns the label (i.e. string representation) of the value of the statistics of the target edges. 231 * 232 * @return the label of the statistics for the target edge 233 */ 234 public String getTargetLabel() { 235 return valueRepresentation(targetValue); 236 } 237 238 /** 239 * Returns the label (i.e. string representation) of the value of the statistics of the source edges. 240 * 241 * @return the label of the statistics for the source edge 242 */ 243 public String getSourceLabel() { 244 return valueRepresentation(sourceValue); 245 } 246 247 /** 248 * Converts given double value to pretty string. 249 * 250 * @param value 251 * the value to be converted 252 * @return formatted value 253 */ 254 private String valueRepresentation(double value) { 255 String result = String.valueOf(value); 256 if (value - Math.floor(value) == 0) { 257 // this is an integer - cut the dot and zero 258 return result.substring(0, result.length() - 2); 259 } 260 return result; 261 } 262 263 /** 264 * Returns the total value of the statistics row. 265 * 266 * @return the total value of the statistics row 267 */ 268 public double getTotal() { 269 return getSource() + getTarget(); 270 } 271 272 /** 273 * Returns the label of the total value of the statistics row. 274 * 275 * @return the label of the total value of the statistics row 276 */ 277 public String getTotalLabel() { 278 return valueRepresentation(getTotal()); 279 } 280 281 }