1 13 28 29 package org.pentaho.ui.component.charting; 30 31 import java.io.IOException ; 32 import java.io.PrintWriter ; 33 import java.io.StringWriter ; 34 import java.io.UnsupportedEncodingException ; 35 import java.net.URLEncoder ; 36 import java.util.ArrayList ; 37 import java.util.Iterator ; 38 import java.util.List ; 39 40 import org.dom4j.Document; 41 import org.dom4j.DocumentHelper; 42 import org.dom4j.Element; 43 import org.dom4j.Node; 44 import org.jfree.chart.ChartRenderingInfo; 45 import org.jfree.chart.entity.ChartEntity; 46 import org.jfree.chart.entity.StandardEntityCollection; 47 import org.jfree.chart.entity.XYItemEntity; 48 import org.jfree.chart.imagemap.ImageMapUtilities; 49 import org.jfree.data.general.Dataset; 50 import org.jfree.data.time.RegularTimePeriod; 51 import org.jfree.data.time.TimeSeriesCollection; 52 import org.pentaho.core.connection.IPentahoResultSet; 53 import org.pentaho.core.solution.ActionResource; 54 import org.pentaho.core.solution.IActionResource; 55 import org.pentaho.core.system.PentahoSystem; 56 import org.pentaho.core.ui.IPentahoUrlFactory; 57 import org.pentaho.core.util.TemplateUtil; 58 import org.pentaho.core.util.XmlHelper; 59 import org.pentaho.messages.Messages; 60 import org.pentaho.messages.util.LocaleHelper; 61 import org.pentaho.plugin.jfreechart.JFreeChartEngine; 62 import org.pentaho.plugin.jfreechart.TimeSeriesCollectionChartDefinition; 63 64 public class TimeSeriesCollectionChartComponent extends AbstractJFreeChartComponent { 65 private static final long serialVersionUID = -6268840271596447555L; 66 67 protected String seriesName = null; 68 69 public TimeSeriesCollectionChartComponent(int chartType, String definitionPath, int width, int height, IPentahoUrlFactory urlFactory, List messages) { 70 super(chartType, definitionPath, width, height, urlFactory, messages); 71 setXsl("text/html", "Chart.xsl"); } 74 75 public TimeSeriesCollectionChartComponent(String definitionPath, IPentahoUrlFactory urlFactory, ArrayList messages) { 76 super(definitionPath, urlFactory, messages); 77 setXsl("text/html", "Chart.xsl"); } 80 81 public TimeSeriesCollectionChartComponent(IPentahoUrlFactory urlFactory, List messages) { 82 super(urlFactory, messages); 83 setXsl("text/html", "Chart.xsl"); } 86 87 public void setSeriesName(String seriesName) { 88 this.seriesName = seriesName; 89 } 90 91 public Dataset createChart(Document doc) { 92 if (solution != null) { values = getActionData(); 94 } else { 95 } 97 98 if (values == null) { 99 return null; 101 } 102 Node chartAttributes = doc.selectSingleNode("//" + CHART_NODE_NAME); TimeSeriesCollectionChartDefinition chartDefinition = new TimeSeriesCollectionChartDefinition((IPentahoResultSet) values, byRow, chartAttributes, getSession()); 106 107 setChartType(chartDefinition.getChartType()); 109 setTitle(chartDefinition.getTitle()); 110 111 Node urlTemplateNode = chartAttributes.selectSingleNode(URLTEMPLE_NODE_NAME); 113 if (urlTemplateNode != null) { 114 setUrlTemplate(urlTemplateNode.getText()); 115 } 116 117 Node paramName2Node = chartAttributes.selectSingleNode(PARAM2_NODE_NAME); 119 if (paramName2Node != null) { 120 seriesName = paramName2Node.getText(); 121 } 122 123 if (chartDefinition.getWidth() != -1 && (width == -1)) { 124 setWidth(chartDefinition.getWidth()); 125 } 126 if (chartDefinition.getHeight() != -1 && (height == -1)) { 127 setHeight(chartDefinition.getHeight()); 128 } 129 130 return chartDefinition; 131 } 132 133 public boolean setDataAction(String chartDefinition) { 134 ActionResource resource = new ActionResource("", IActionResource.SOLUTION_FILE_RESOURCE, "text/xml", chartDefinition); 136 try { 137 Document dataActionDocument = PentahoSystem.getSolutionRepository(getSession()).getResourceAsDocument(resource); 138 if (dataActionDocument == null) { 139 return false; 140 } 141 Node dataNode = dataActionDocument.selectSingleNode("chart/data"); chartType = (int) XmlHelper.getNodeText("chart-type", dataNode, -1); solution = XmlHelper.getNodeText("data-solution", dataNode); actionPath = XmlHelper.getNodeText("data-path", dataNode); actionName = XmlHelper.getNodeText("data-action", dataNode); actionOutput = XmlHelper.getNodeText("data-output", dataNode); byRow = XmlHelper.getNodeText("data-orientation", dataNode, "rows").equals("rows"); if (width == 0) { 149 width = (int) XmlHelper.getNodeText("chart/width", dataActionDocument, 125); } 151 if (height == 0) { 152 height = (int) XmlHelper.getNodeText("chart/height", dataActionDocument, 125); } 154 } catch (Exception e) { 155 error(Messages.getString("TimeSeriesCollectionChartComponent.ERROR_0001_INVALID_CHART_DEFINITION", chartDefinition), e); return false; 157 } 158 return true; 159 } 160 161 public Document getXmlContent() { 162 163 Document result = DocumentHelper.createDocument(); 165 String baseUrl = PentahoSystem.getApplicationContext().getBaseUrl(); 166 setXslProperty("baseUrl", baseUrl); 168 ActionResource resource = new ActionResource(title, IActionResource.SOLUTION_FILE_RESOURCE, "text/xml", definitionPath); 171 Document chartDefinition = null; 172 String mapName = "chart" + chartCount++; try { 174 chartDefinition = PentahoSystem.getSolutionRepository(getSession()).getResourceAsDocument(resource); 175 } catch (IOException e) { 176 } 177 178 if (chartDefinition == null) { 179 Element errorElement = result.addElement("error"); errorElement.addElement("title").setText(Messages.getString("ABSTRACTCHARTEXPRESSION.ERROR_0001_ERROR_GENERATING_CHART")); String message = Messages.getString("CHARTS.ERROR_0001_CHART_DEFINIION_MISSING", definitionPath); errorElement.addElement("message").setText(message); error(message); 184 return result; 185 } 186 dataDefinition = createChart(chartDefinition); 188 189 if (dataDefinition == null) { 190 Element errorElement = result.addElement("error"); errorElement.addElement("title").setText(Messages.getString("ABSTRACTCHARTEXPRESSION.ERROR_0001_ERROR_GENERATING_CHART")); String message = Messages.getString("CHARTS.ERROR_0002_CHART_DATA_MISSING", solution + "/" + actionPath + "/" + actionName); errorElement.addElement("message").setText(message); return result; 196 } 197 198 PrintWriter printWriter = new PrintWriter (new StringWriter ()); 200 String chartTitle = ""; try { 205 if (width == -1) { 206 width = Integer.parseInt(chartDefinition.selectSingleNode("/chart/width").getText()); } 208 if (height == -1) { 209 height = Integer.parseInt(chartDefinition.selectSingleNode("/chart/height").getText()); } 211 } catch (Exception e) { 212 } 214 if (chartDefinition.selectSingleNode("/chart/" + URLTEMPLE_NODE_NAME) != null) { urlTemplate = chartDefinition.selectSingleNode("/chart/" + URLTEMPLE_NODE_NAME).getText(); } 217 218 if (chartDefinition.selectSingleNode("/chart/paramName") != null) { paramName = chartDefinition.selectSingleNode("/chart/paramName").getText(); } 221 222 Element root = result.addElement("charts"); TimeSeriesCollection chartDataDefinition = (TimeSeriesCollection) dataDefinition; 224 if (chartDataDefinition.getSeriesCount() > 0) { 225 String [] tempFileInfo = createTempFile(); 227 String fileName = tempFileInfo[AbstractChartComponent.FILENAME_INDEX]; 228 String filePathWithoutExtension = tempFileInfo[AbstractChartComponent.FILENAME_WITHOUT_EXTENSION_INDEX]; 229 230 ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection()); 231 JFreeChartEngine.saveChart(chartDataDefinition, chartTitle, 232 "", filePathWithoutExtension, width, height, JFreeChartEngine.OUTPUT_PNG, printWriter, info, this); applyOuterURLTemplateParam(); 234 popultateInfo(info); 235 Element chartElement = root.addElement("chart"); chartElement.addElement("mapName").setText(mapName); chartElement.addElement("width").setText(Integer.toString(width)); chartElement.addElement("height").setText(Integer.toString(height)); for (int row = 0; row < chartDataDefinition.getSeriesCount(); row++) { 240 for (int column = 0; column < chartDataDefinition.getItemCount(row); column++) { 241 Number value = chartDataDefinition.getY(row, column); 242 Comparable rowKey = chartDataDefinition.getSeriesKey(row); 243 RegularTimePeriod columnKey = chartDataDefinition.getSeries(row).getTimePeriod(column); 244 Element valueElement = chartElement.addElement("value2D"); valueElement.addElement("value").setText(value.toString()); valueElement.addElement("row-key").setText(rowKey.toString()); valueElement.addElement("column-key").setText(columnKey.toString()); } 249 } 250 String mapString = ImageMapUtilities.getImageMap(mapName, info); 251 chartElement.addElement("imageMap").setText(mapString); chartElement.addElement("image").setText(fileName); } 254 return result; 255 } 256 257 private void popultateInfo(ChartRenderingInfo info) { 258 if (urlTemplate == null) { 259 return; 260 } 261 Iterator iter = info.getEntityCollection().iterator(); 262 while (iter.hasNext()) { 263 ChartEntity entity = (ChartEntity) iter.next(); 264 if (entity instanceof XYItemEntity) { 265 if (urlTemplate != null) { 266 XYItemEntity xyItemEntity = (XYItemEntity) entity; 267 if (paramName == null) { 268 xyItemEntity.setURLText(urlTemplate); 269 } else { 270 try { 271 int seriesIndex = xyItemEntity.getSeriesIndex(); 272 int itemIndex = xyItemEntity.getItem(); 273 String xySeriesKey = (String ) ((TimeSeriesCollection) xyItemEntity.getDataset()).getSeriesKey(seriesIndex); 274 String encodedVal = URLEncoder.encode(xySeriesKey, LocaleHelper.getSystemEncoding()); 275 String drillURL = TemplateUtil.applyTemplate(urlTemplate, paramName, encodedVal); 276 String itemValueStr = ((TimeSeriesCollection) xyItemEntity.getDataset()).getX(seriesIndex, itemIndex).toString(); 277 encodedVal = URLEncoder.encode(itemValueStr, LocaleHelper.getSystemEncoding()); 278 if (seriesName == null) { 279 drillURL = TemplateUtil.applyTemplate(drillURL, "SERIES", encodedVal); } else { 281 drillURL = TemplateUtil.applyTemplate(drillURL, seriesName, encodedVal); 282 } 283 xyItemEntity.setURLText(drillURL); 284 } catch (UnsupportedEncodingException e) { 285 e.printStackTrace(); 287 } 288 } 289 } 290 } 291 } 292 } 293 294 public boolean validate() { 295 return true; 297 } 298 299 } 300 | Popular Tags |