1 16 package org.pentaho.plugin.jfreereport.reportcharts; 17 18 import org.jfree.report.event.ReportEvent; 19 import org.jfree.report.function.AbstractFunction; 20 import org.jfree.report.function.Expression; 21 import org.jfree.report.function.FunctionUtilities; 22 23 import java.util.ArrayList ; 24 import org.apache.commons.logging.Log; 25 import org.apache.commons.logging.LogFactory; 26 import org.jfree.data.general.DefaultPieDataset; 27 import org.pentaho.messages.Messages; 28 29 public class PieSetCollectorFunction extends AbstractFunction { 30 31 private static final long serialVersionUID = -5778788510651234706L; 32 33 DefaultPieDataset pieDataset; 34 35 private ArrayList results; 36 37 private String seriesColumn; 38 39 private String valueColumn; 40 41 private String group; 42 43 private String resetGroup; 44 45 private boolean summaryOnly; 46 47 private int currentIndex; 48 49 private static final Log logger = LogFactory.getLog(PieSetCollectorFunction.class); 50 51 public String getSeriesColumn() { 52 return seriesColumn; 53 } 54 55 public String getValueColumn() { 56 return valueColumn; 57 } 58 59 public String getGroup() { 60 return group; 61 } 62 63 public String getResetGroup() { 64 return resetGroup; 65 } 66 67 public void setSeriesColumn(String value) { 68 seriesColumn = value; 69 } 70 71 public void setValueColumn(String value) { 72 valueColumn = value; 73 } 74 75 public void setGroup(String value) { 76 group = value; 77 } 78 79 public void setResetGroup(String value) { 80 resetGroup = value; 81 } 82 83 public boolean isSummaryOnly() { 84 return summaryOnly; 85 } 86 87 public void setSummaryOnly(boolean value) { 88 summaryOnly = value; 89 } 90 91 public PieSetCollectorFunction() { 92 results = new ArrayList (); 93 } 94 95 98 public Object getValue() { 99 return pieDataset; 100 } 101 102 public void reportInitialized(ReportEvent event) { 103 currentIndex = -1; 104 logger.debug(Messages.getString("PIESETCOLL.USER_DEBUG_REPORT_INITIALIZED")); if (FunctionUtilities.isDefinedPrepareRunLevel(this, event)) { 106 pieDataset = null; 107 results.clear(); 108 if (getResetGroup() == null) { 109 pieDataset = new DefaultPieDataset(); 110 results.add(pieDataset); 111 } 112 } else { 113 if (getResetGroup() == null) { 115 pieDataset = (DefaultPieDataset) results.get(0); 116 } 117 } 118 } 119 120 public void groupStarted(ReportEvent event) { 121 logger.debug(Messages.getString("PIESETCOLL.USER_DEBUG_GROUP_STARTED")); if (FunctionUtilities.isDefinedGroup(getResetGroup(), event)) { 123 if (FunctionUtilities.isDefinedPrepareRunLevel(this, event)) { 125 pieDataset = new DefaultPieDataset(); 126 results.add(pieDataset); 127 } else { 128 if (FunctionUtilities.isLayoutLevel(event)) { 129 currentIndex += 1; 132 pieDataset = (DefaultPieDataset) results.get(currentIndex); 133 } 134 } 135 } 136 } 137 138 public void itemsAdvanced(ReportEvent reportEvent) { 139 logger.debug(Messages.getString("PIESETCOLL.USER_DEBUG_ITEMS_ADVANCED")); if (FunctionUtilities.isDefinedPrepareRunLevel(this, reportEvent) == false) { 141 return; 144 } 145 if (!summaryOnly) { 146 final Object seriesObject = getDataRow().get(getSeriesColumn()); 147 final Comparable seriesComparable; 148 if (seriesObject instanceof Comparable ) { 149 seriesComparable = (Comparable ) seriesObject; 150 } else { 151 seriesComparable = Messages.getString("PIESETCOLL.USER_ERROR_CATEGORY_NOT_COMPARABLE"); } 155 final Object valueObject = getDataRow().get(getValueColumn()); 156 double value; 157 if (valueObject instanceof Number ) { 158 Number n = (Number ) valueObject; 159 value = n.doubleValue(); 160 } else { 161 value = Double.NaN; 162 } 163 Object isThere = null; 164 try { 165 isThere = pieDataset.getValue(seriesComparable); 166 } catch (Exception ignored) { 167 } 168 if (isThere != null) { 169 value += ((Number ) isThere).doubleValue(); 170 } 171 pieDataset.setValue(seriesComparable, value); 172 173 } 174 } 175 176 public void groupFinished(ReportEvent reportEvent) { 177 logger.debug(Messages.getString("PIESETCOLL.USER_DEBUG_GROUPS_FINISHED")); if (FunctionUtilities.isDefinedPrepareRunLevel(this, reportEvent) == false) { 179 return; 182 } 183 if (summaryOnly) { 184 if (FunctionUtilities.isDefinedGroup(getGroup(), reportEvent)) { 185 final Object seriesObject = getDataRow().get(getSeriesColumn()); 189 final Comparable seriesComparable; 190 if (seriesObject instanceof Comparable ) { 191 seriesComparable = (Comparable ) seriesObject; 192 } else { 193 seriesComparable = Messages.getString("PIESETCOLL.USER_ERROR_SERIES_NOT_COMPARABLE"); } 197 final Object valueObject = getDataRow().get(getValueColumn()); 198 double value; 199 if (valueObject instanceof Number ) { 200 Number n = (Number ) valueObject; 201 value = n.doubleValue(); 202 } else { 203 value = Double.NaN; 204 } 205 pieDataset.setValue(seriesComparable, value); 206 } 207 } 208 } 209 210 216 public Expression getInstance() { 217 final PieSetCollectorFunction fn = (PieSetCollectorFunction) super.getInstance(); 218 fn.pieDataset = null; 219 fn.results = new ArrayList (); 220 return fn; 221 } 222 223 } 224 | Popular Tags |