1 15 package org.josql.contrib; 16 17 import java.util.List ; 18 import java.util.ArrayList ; 19 import java.util.Map ; 20 import java.util.LinkedHashMap ; 21 import java.util.Iterator ; 22 23 import org.jfree.data.general.PieDataset; 24 25 import org.jfree.data.general.DatasetGroup; 26 import org.jfree.data.general.DatasetChangeListener; 27 import org.jfree.data.general.DatasetChangeEvent; 28 29 import org.josql.Query; 30 import org.josql.QueryResults; 31 import org.josql.QueryExecutionException; 32 import org.josql.QueryParseException; 33 34 import org.josql.internal.Utilities; 35 36 import org.josql.expressions.SelectItemExpression; 37 38 public class JoSQLFreeChartPieDataset extends Query implements PieDataset 39 { 40 41 private Map values = new LinkedHashMap (); 42 private int key = 0; 43 private int value = 0; 44 private List listeners = new ArrayList (); 45 private DatasetGroup group = null; 46 47 public JoSQLFreeChartPieDataset () 48 { 49 50 } 51 52 public void addChangeListener (DatasetChangeListener l) 53 { 54 55 this.listeners.add (l); 56 57 } 58 59 public void removeChangeListener (DatasetChangeListener l) 60 { 61 62 this.listeners.remove (l); 63 64 } 65 66 public DatasetGroup getGroup () 67 { 68 69 return this.group; 70 71 } 72 73 public void setGroup (DatasetGroup g) 74 { 75 76 this.group = g; 77 78 } 79 80 public void setKeyValue (int keyCol, 81 int valueCol) 82 throws IllegalArgumentException , 83 IllegalStateException , 84 QueryParseException 85 { 86 87 if (!this.parsed ()) 88 { 89 90 throw new IllegalStateException ("Cannot specify the key and value columns until a query has been specified and parsed."); 91 92 } 93 94 if (keyCol < 1) 95 { 96 97 throw new IllegalArgumentException ("Key column index must be a minimum of 1."); 98 99 } 100 101 if (valueCol < 1) 102 { 103 104 throw new IllegalArgumentException ("Value column index must be a minimum of 1."); 105 106 } 107 108 List cols = this.getColumns (); 109 110 if (keyCol > cols.size ()) 111 { 112 113 throw new IllegalArgumentException ("Key column index must be a minimum of " + 114 cols.size () + 115 "."); 116 117 } 118 119 if (valueCol > cols.size ()) 120 { 121 122 throw new IllegalArgumentException ("Value column index must be a minimum of " + 123 cols.size () + 124 "."); 125 126 } 127 128 SelectItemExpression vexp = (SelectItemExpression) cols.get (valueCol - 1); 129 130 Class vc = vexp.getExpectedReturnType (this); 131 132 if (!Utilities.isNumber (vc)) 133 { 134 135 throw new IllegalArgumentException ("Value column: " + 136 valueCol + 137 " will evaluate to an instance of type: " + 138 vc.getName () + 139 ", but only columns that return numbers are allowed."); 140 141 } 142 143 this.key = keyCol; 144 this.value = valueCol; 145 146 } 147 148 158 public QueryResults executeQuery (List l) 159 throws QueryExecutionException 160 { 161 162 if (this.isWantObjects ()) 163 { 164 165 throw new QueryExecutionException ("Only SQL statements that return columns (not the objects passed in) can be used."); 166 167 } 168 169 if ((this.key == 0) 170 || 171 (this.value == 0) 172 ) 173 { 174 175 throw new IllegalStateException ("Key and/or value columns not specified."); 176 177 } 178 179 QueryResults qr = super.execute (l); 180 181 List res = qr.getResults (); 182 183 Map nValues = new LinkedHashMap (); 184 185 for (int i = 0; i < res.size (); i++) 186 { 187 188 List resR = (List ) res.get (i); 189 190 Object k = resR.get (this.key - 1); 192 193 Object v = resR.get (this.value - 1); 195 196 String kv = null + ""; 197 198 if (k == null) 199 { 200 201 nValues.put (kv, 202 v); 203 204 } 205 206 if (k instanceof Comparable ) 208 { 209 210 nValues.put (k, 211 v); 212 213 } else { 214 215 kv = k.toString (); 216 217 nValues.put (kv, 218 v); 219 220 } 221 222 } 223 224 this.values = nValues; 228 229 DatasetChangeEvent dce = new DatasetChangeEvent (this, 231 this); 232 233 for (int i = 0; i < this.listeners.size (); i++) 234 { 235 236 DatasetChangeListener d = (DatasetChangeListener) this.listeners.get (i); 237 238 d.datasetChanged (dce); 239 240 } 241 242 return qr; 243 244 } 245 246 public int getItemCount () 247 { 248 249 return this.values.size (); 250 251 } 252 253 public Number getValue (int index) 254 { 255 256 int c = 0; 257 258 Iterator iter = this.values.keySet ().iterator (); 259 260 while (iter.hasNext ()) 261 { 262 263 Object k = iter.next (); 264 265 if (index == c) 266 { 267 268 return (Number ) this.values.get (k); 269 270 } 271 272 c++; 273 274 } 275 276 return new Double (-1); 277 278 } 279 280 public int getIndex (Comparable k) 281 { 282 283 int c = 0; 284 285 Iterator iter = this.values.keySet ().iterator (); 286 287 while (iter.hasNext ()) 288 { 289 290 Comparable ko = (Comparable ) iter.next (); 291 292 if (ko.compareTo (k) == 0) 293 { 294 295 return c; 296 297 } 298 299 c++; 300 301 } 302 303 return -1; 304 305 } 306 307 public Comparable getKey (int index) 308 { 309 310 int c = 0; 311 312 Iterator iter = this.values.keySet ().iterator (); 313 314 while (iter.hasNext ()) 315 { 316 317 Object k = iter.next (); 318 319 if (index == c) 320 { 321 322 return (Comparable ) k; 323 324 } 325 326 c++; 327 328 } 329 330 return null; 331 332 } 333 334 public Number getValue (Comparable key) 335 { 336 337 return (Number ) this.values.get (key); 338 339 } 340 341 public List getKeys () 342 { 343 344 return new ArrayList (this.values.keySet ()); 345 346 } 347 348 } 349 | Popular Tags |