1 16 package org.pentaho.plugin.jfreereport.reportcharts; 17 18 import java.util.ArrayList ; 19 import java.util.Arrays ; 20 import org.apache.commons.logging.Log; 21 import org.apache.commons.logging.LogFactory; 22 import org.jfree.data.category.DefaultCategoryDataset; 23 import org.jfree.report.DataRow; 24 import org.jfree.report.event.ReportEvent; 25 import org.jfree.report.function.AbstractFunction; 26 import org.jfree.report.function.Expression; 27 import org.jfree.report.function.FunctionUtilities; 28 import org.pentaho.messages.Messages; 29 30 35 public class CategorySetCollectorFunction extends AbstractFunction { 36 private static final long serialVersionUID = -8138304452870844825L; 37 38 private ArrayList seriesNames; 39 40 private String categoryColumn; 41 42 private ArrayList valueColumns; 43 44 private ArrayList ignoreColumns; 45 46 private DefaultCategoryDataset categoryDataset; 47 48 private String group; 49 50 private String resetGroup; 51 52 private ArrayList results; 53 54 private int currentIndex; 55 56 private boolean summaryOnly = true; 57 58 private boolean generatedReport = false; 59 60 private int categoryStartColumn; 61 62 private boolean seriesColumn = false; 63 64 private static final Log logger = LogFactory.getLog(CategorySetCollectorFunction.class); 65 66 public CategorySetCollectorFunction() { 67 this.results = new ArrayList (); 68 this.seriesNames = new ArrayList (); 69 this.valueColumns = new ArrayList (); 70 this.ignoreColumns = new ArrayList (); 71 } 72 73 public void setCategoryStartColumn(int value) { 74 categoryStartColumn = value; 75 } 76 77 public int getCategoryStartColumn() { 78 return categoryStartColumn; 79 } 80 81 public void setGeneratedReport(boolean value) { 82 generatedReport = value; 83 } 84 85 public boolean isGeneratedReport() { 86 return generatedReport; 87 } 88 89 public void setIgnoreColumn(final int index, final String field) { 90 if (ignoreColumns.size() == index) { 91 ignoreColumns.add(field); 92 } else { 93 ignoreColumns.set(index, field); 94 } 95 } 96 97 public String getIgnoreColumn(final int index) { 98 return (String ) ignoreColumns.get(index); 99 } 100 101 public int getIgnoreColumnCount() { 102 return ignoreColumns.size(); 103 } 104 105 public String [] getIgnoreColumn() { 106 return (String []) ignoreColumns.toArray(new String [ignoreColumns.size()]); 107 } 108 109 public void setIgnoreColumn(final String [] fields) { 110 this.ignoreColumns.clear(); 111 this.ignoreColumns.addAll(Arrays.asList(fields)); 112 } 113 114 118 119 public void setSeriesName(final int index, final String field) { 120 if (seriesNames.size() == index) { 121 seriesNames.add(field); 122 } else { 123 seriesNames.set(index, field); 124 } 125 } 126 127 public String getSeriesName(final int index) { 128 return (String ) seriesNames.get(index); 129 } 130 131 public int getSeriesNameCount() { 132 return seriesNames.size(); 133 } 134 135 public String [] getSeriesName() { 136 return (String []) seriesNames.toArray(new String [seriesNames.size()]); 137 } 138 139 public void setSeriesName(final String [] fields) { 140 this.seriesNames.clear(); 141 this.seriesNames.addAll(Arrays.asList(fields)); 142 } 143 144 public void setValueColumn(final int index, final String field) { 145 if (valueColumns.size() == index) { 146 valueColumns.add(field); 147 } else { 148 valueColumns.set(index, field); 149 } 150 } 151 152 public boolean isSummaryOnly() { 153 return summaryOnly; 154 } 155 156 public void setSummaryOnly(boolean value) { 157 summaryOnly = value; 158 } 159 160 public boolean isSeriesColumn() { 161 return seriesColumn; 162 } 163 164 public void setSeriesColumn(boolean value) { 165 seriesColumn = value; 166 } 167 168 public String getValueColumn(final int index) { 169 return (String ) valueColumns.get(index); 170 } 171 172 public int getValueColumnCount() { 173 return valueColumns.size(); 174 } 175 176 public String [] getValueColumn() { 177 return (String []) valueColumns.toArray(new String [valueColumns.size()]); 178 } 179 180 public void setValueColumn(final String [] fields) { 181 this.valueColumns.clear(); 182 this.valueColumns.addAll(Arrays.asList(fields)); 183 } 184 185 public String getCategoryColumn() { 186 return categoryColumn; 187 } 188 189 public void setCategoryColumn(final String categoryColumn) { 190 this.categoryColumn = categoryColumn; 191 } 192 193 public String getGroup() { 194 return group; 195 } 196 197 public void setGroup(final String group) { 198 this.group = group; 199 } 200 201 public String getResetGroup() { 202 return resetGroup; 203 } 204 205 public void setResetGroup(final String resetGroup) { 206 this.resetGroup = resetGroup; 207 } 208 209 213 214 219 public Object getValue() { 220 return categoryDataset; 221 } 222 223 public void reportInitialized(ReportEvent event) { 224 currentIndex = -1; 225 logger.debug(Messages.getString("CATEGORYSETCOLL.USER_DEBUG_REPORT_INITIALIZED")); if (FunctionUtilities.isDefinedPrepareRunLevel(this, event)) { 227 categoryDataset = null; 228 results.clear(); 229 if (getResetGroup() == null) { 230 categoryDataset = new DefaultCategoryDataset(); 231 results.add(categoryDataset); 232 } 233 } else { 234 if (getResetGroup() == null) { 236 categoryDataset = (DefaultCategoryDataset) results.get(0); 237 } 238 } 239 } 240 241 public void groupStarted(ReportEvent event) { 242 logger.debug(Messages.getString("CATEGORYSETCOLL.USER_DEBUG_GROUP_STARTED")); if (FunctionUtilities.isDefinedGroup(getResetGroup(), event)) { 244 if (FunctionUtilities.isDefinedPrepareRunLevel(this, event)) { 246 categoryDataset = new DefaultCategoryDataset(); 247 results.add(categoryDataset); 248 } else { 249 if (FunctionUtilities.isLayoutLevel(event)) { 250 currentIndex += 1; 253 categoryDataset = (DefaultCategoryDataset) results.get(currentIndex); 254 } 255 } 256 } 257 } 258 259 public void itemsAdvanced(ReportEvent reportEvent) { 260 logger.debug(Messages.getString("CATEGORYSETCOLL.USER_DEBUG_ITEMS_ADVANCED")); if (FunctionUtilities.isDefinedPrepareRunLevel(this, reportEvent) == false) { 262 return; 265 } 266 if (!summaryOnly) { 267 final Object categoryObject = getDataRow().get(getCategoryColumn()); 268 final Comparable categoryComparable; 269 if (categoryObject instanceof Comparable ) { 270 categoryComparable = (Comparable ) categoryObject; 271 } else { 272 categoryComparable = Messages.getString("CATEGORYSETCOLL.USER_ERROR_CATEGORY_NOT_COMPARABLE"); } 276 final int maxIndex = Math.min(this.seriesNames.size(), this.valueColumns.size()); 278 for (int i = 0; i < maxIndex; i++) { 279 String seriesName = (String ) seriesNames.get(i); 280 final String column = (String ) valueColumns.get(i); 281 final Object valueObject = getDataRow().get(column); 282 if (isSeriesColumn()) { 283 Object tmp = getDataRow().get(seriesName); 284 if (tmp != null) { 285 seriesName = tmp.toString(); 286 } 287 } 288 double value; 289 if (valueObject instanceof Number ) { 290 Number n = (Number ) valueObject; 291 value = n.doubleValue(); 292 } else { 293 value = Double.NaN; 294 } 295 Object isThere = null; 296 try { 297 isThere = categoryDataset.getValue(seriesName, categoryComparable); 298 } catch (Exception ignored) { 299 } 300 if (isThere != null) { 301 value += ((Number ) isThere).doubleValue(); 302 categoryDataset.setValue(value, seriesName, categoryComparable); 303 } else { 304 categoryDataset.addValue(value, seriesName, categoryComparable); 305 } 306 } 307 } 308 } 309 310 public void groupFinished(ReportEvent reportEvent) { 311 logger.debug(Messages.getString("CATEGORYSETCOLL.USER_DEBUG_GROUPS_FINISHED")); if (FunctionUtilities.isDefinedPrepareRunLevel(this, reportEvent) == false) { 313 return; 316 } 317 if (summaryOnly) { 318 if (FunctionUtilities.isDefinedGroup(getGroup(), reportEvent)) { 319 if (!generatedReport) { 323 final Object categoryObject = getDataRow().get(getCategoryColumn()); 324 final Comparable categoryComparable; 325 if (categoryObject instanceof Comparable ) { 326 categoryComparable = (Comparable ) categoryObject; 327 } else { 328 categoryComparable = Messages.getString("CATEGORYSETCOLL.USER_ERROR_CATEGORY_NOT_COMPARABLE"); } 332 333 final int maxIndex = Math.min(this.seriesNames.size(), this.valueColumns.size()); 335 for (int i = 0; i < maxIndex; i++) { 336 String seriesName = (String ) seriesNames.get(i); 337 final String column = (String ) valueColumns.get(i); 338 final Object valueObject = getDataRow().get(column); 339 if (isSeriesColumn()) { 340 Object tmp = getDataRow().get(seriesName); 341 if (tmp != null) { 342 seriesName = tmp.toString(); 343 } 344 } 345 final double value; 346 if (valueObject instanceof Number ) { 347 Number n = (Number ) valueObject; 348 value = n.doubleValue(); 349 } else { 350 value = Double.NaN; 351 } 352 categoryDataset.addValue(value, seriesName, categoryComparable); 353 } 354 } else { 355 DataRow theRow = getDataRow(); 356 int colCount = theRow.getColumnCount(); 357 for (int i = categoryStartColumn; i < colCount; i++) { 358 String seriesName = theRow.getColumnName(i); 359 if (seriesName.startsWith("Summary_")) { if (ignoreColumns.indexOf(seriesName) >= 0) { 361 continue; 362 } 363 seriesName = seriesName.substring(8, seriesName.length() - 10); 364 Object valueObject = theRow.get(i); 365 double value; 366 if (valueObject instanceof Number ) { 367 Number n = (Number ) valueObject; 368 value = n.doubleValue(); 369 } else { 370 value = Double.NaN; 371 } 372 categoryDataset.addValue(value, seriesName, seriesName); 373 } 374 } 375 } 376 } 377 } 378 } 379 380 386 public Expression getInstance() { 387 final CategorySetCollectorFunction fn = (CategorySetCollectorFunction) super.getInstance(); 388 fn.categoryDataset = null; 389 fn.results = new ArrayList (); 390 return fn; 391 } 392 393 } 394 | Popular Tags |