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.xy.XYSeriesCollection; 51 import org.pentaho.core.connection.IPentahoResultSet; 52 import org.pentaho.core.solution.ActionResource; 53 import org.pentaho.core.solution.IActionResource; 54 import org.pentaho.core.system.PentahoSystem; 55 import org.pentaho.core.ui.IPentahoUrlFactory; 56 import org.pentaho.core.util.TemplateUtil; 57 import org.pentaho.core.util.XmlHelper; 58 import org.pentaho.messages.Messages; 59 import org.pentaho.messages.util.LocaleHelper; 60 import org.pentaho.plugin.jfreechart.JFreeChartEngine; 61 import org.pentaho.plugin.jfreechart.XYSeriesCollectionChartDefinition; 62 63 public class XYSeriesCollectionChartComponent extends AbstractJFreeChartComponent { 64 private static final long serialVersionUID = -6268840271596447555L; 65 66 protected String seriesName = null; 67 68 public XYSeriesCollectionChartComponent(int chartType, String definitionPath, int width, int height, IPentahoUrlFactory urlFactory, List messages) { 69 super(chartType, definitionPath, width, height, urlFactory, messages); 70 setXsl("text/html", "Chart.xsl"); } 73 74 public XYSeriesCollectionChartComponent(String definitionPath, IPentahoUrlFactory urlFactory, ArrayList messages) { 75 super(definitionPath, urlFactory, messages); 76 setXsl("text/html", "Chart.xsl"); } 79 80 public XYSeriesCollectionChartComponent(IPentahoUrlFactory urlFactory, List messages) { 81 super(urlFactory, messages); 82 setXsl("text/html", "Chart.xsl"); } 85 86 public void setSeriesName( String seriesName ) { 87 this.seriesName = seriesName; 88 } 89 90 public Dataset createChart(Document doc) { 91 if (solution != null) { values = getActionData(); 93 } else { 94 } 96 97 if( values == null ) { 98 return null; 100 } 101 Node chartAttributes = doc.selectSingleNode("//" + CHART_NODE_NAME); XYSeriesCollectionChartDefinition chartDefinition = new XYSeriesCollectionChartDefinition((IPentahoResultSet) values, byRow, chartAttributes, getSession()); 105 106 setChartType(chartDefinition.getChartType()); 108 setTitle(chartDefinition.getTitle()); 109 110 Node urlTemplateNode = chartAttributes.selectSingleNode(URLTEMPLE_NODE_NAME); 112 if (urlTemplateNode != null) { 113 setUrlTemplate(urlTemplateNode.getText()); 114 } 115 116 Node paramName2Node = chartAttributes.selectSingleNode(PARAM2_NODE_NAME); 118 if (paramName2Node != null) { 119 seriesName = paramName2Node.getText(); 120 } 121 122 if (chartDefinition.getWidth() != -1 && (width == -1 )) { 123 setWidth(chartDefinition.getWidth()); 124 } 125 if (chartDefinition.getHeight() != -1 && (height == -1 )) { 126 setHeight(chartDefinition.getHeight()); 127 } 128 129 return chartDefinition; 130 } 131 132 public boolean setDataAction(String chartDefinition) { 133 ActionResource resource = new ActionResource("", IActionResource.SOLUTION_FILE_RESOURCE, "text/xml", chartDefinition); 135 try { 136 Document dataActionDocument = PentahoSystem.getSolutionRepository(getSession()).getResourceAsDocument(resource); 137 if (dataActionDocument == null) { 138 return false; 139 } 140 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 ) { 148 width = (int) XmlHelper.getNodeText("chart/width", dataActionDocument, 125); } 150 if( height == 0 ) { 151 height = (int) XmlHelper.getNodeText("chart/height", dataActionDocument, 125); } 153 } catch (Exception e) { 154 error(Messages.getString("XYSeriesCollectionChartComponent.ERROR_0001_INVALID_CHART_DEFINITION", chartDefinition), e); return false; 156 } 157 return true; 158 } 159 160 public Document getXmlContent() { 161 162 Document result = DocumentHelper.createDocument(); 164 String baseUrl = PentahoSystem.getApplicationContext().getBaseUrl(); 165 setXslProperty("baseUrl", baseUrl); 167 ActionResource resource = new ActionResource(title, IActionResource.SOLUTION_FILE_RESOURCE, "text/xml", definitionPath); 170 Document chartDefinition = null; 171 String mapName = "chart" + chartCount++; try { 173 chartDefinition = PentahoSystem.getSolutionRepository(getSession()).getResourceAsDocument(resource); 174 } catch (IOException e) { 175 } 176 177 if( chartDefinition == null ) { 178 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 ); 183 return result; 184 } 185 dataDefinition = createChart(chartDefinition); 187 188 if( dataDefinition == null ) { 189 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; 195 } 196 197 PrintWriter printWriter = new PrintWriter (new StringWriter ()); 199 String chartTitle = ""; try { 204 if( width == -1 ) { 205 width = Integer.parseInt(chartDefinition.selectSingleNode("/chart/width").getText()); } 207 if( height == -1 ) { 208 height = Integer.parseInt(chartDefinition.selectSingleNode("/chart/height").getText()); } 210 } catch (Exception e) { 211 } 213 if (chartDefinition.selectSingleNode("/chart/"+URLTEMPLE_NODE_NAME) != null) { urlTemplate = chartDefinition.selectSingleNode("/chart/"+URLTEMPLE_NODE_NAME).getText(); } 216 217 if (chartDefinition.selectSingleNode("/chart/paramName") != null) { paramName = chartDefinition.selectSingleNode("/chart/paramName").getText(); } 220 221 Element root = result.addElement("charts"); XYSeriesCollection chartDataDefinition = (XYSeriesCollection) dataDefinition; 223 if (chartDataDefinition.getSeriesCount() > 0) { 224 String [] tempFileInfo = createTempFile(); 226 String fileName = tempFileInfo[AbstractChartComponent.FILENAME_INDEX]; 227 String filePathWithoutExtension = tempFileInfo[AbstractChartComponent.FILENAME_WITHOUT_EXTENSION_INDEX]; 228 229 ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection()); 230 JFreeChartEngine.saveChart(chartDataDefinition, chartTitle, "", filePathWithoutExtension, width, height, JFreeChartEngine.OUTPUT_PNG, printWriter, info, this); applyOuterURLTemplateParam(); 232 popultateInfo(info); 233 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++) { 238 for (int column = 0; column < chartDataDefinition.getItemCount(row); column++) { 239 Number value = chartDataDefinition.getY(row, column); 240 Comparable rowKey = chartDataDefinition.getSeriesKey(row); 241 Number columnKey = chartDataDefinition.getX(row, column); 242 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()); } 247 } 248 String mapString = ImageMapUtilities.getImageMap(mapName, info); 249 chartElement.addElement("imageMap").setText(mapString); chartElement.addElement("image").setText(fileName); } 252 return result; 253 } 254 255 private void popultateInfo(ChartRenderingInfo info) { 256 if( urlTemplate == null ) { 257 return; 258 } 259 Iterator iter = info.getEntityCollection().iterator(); 260 while (iter.hasNext()) { 261 ChartEntity entity = (ChartEntity) iter.next(); 262 if (entity instanceof XYItemEntity) { 263 if (urlTemplate != null) { 264 XYItemEntity xyItemEntity = (XYItemEntity) entity; 265 if (paramName == null) { 266 xyItemEntity.setURLText(urlTemplate); 267 } else { 268 try { 269 int seriesIndex = xyItemEntity.getSeriesIndex(); 270 int itemIndex = xyItemEntity.getItem(); 271 String xySeriesKey = (String ) ((XYSeriesCollection) xyItemEntity.getDataset()).getSeriesKey(seriesIndex); 272 String encodedVal = URLEncoder.encode(xySeriesKey, LocaleHelper.getSystemEncoding()); 273 String drillURL = TemplateUtil.applyTemplate(urlTemplate, paramName, encodedVal); 274 String itemValueStr = ((XYSeriesCollection) xyItemEntity.getDataset()).getX(seriesIndex, itemIndex).toString(); 275 encodedVal = URLEncoder.encode(itemValueStr, LocaleHelper.getSystemEncoding()); 276 if( seriesName == null ) { 277 drillURL = TemplateUtil.applyTemplate(drillURL, "SERIES", encodedVal); } else { 279 drillURL = TemplateUtil.applyTemplate(drillURL, seriesName, encodedVal); 280 } 281 xyItemEntity.setURLText(drillURL); 282 } catch (UnsupportedEncodingException e) { 283 e.printStackTrace(); 285 } 286 } 287 } 288 } 289 } 290 } 291 292 public boolean validate() { 293 return true; 295 } 296 297 } 298 | Popular Tags |