1 16 17 package org.pentaho.ui.component.charting; 18 19 import java.io.IOException ; 20 import java.io.PrintWriter ; 21 import java.io.StringWriter ; 22 import java.io.UnsupportedEncodingException ; 23 import java.net.URLEncoder ; 24 import java.util.ArrayList ; 25 import java.util.Iterator ; 26 import java.util.List ; 27 import org.dom4j.Document; 28 import org.dom4j.DocumentHelper; 29 import org.dom4j.Element; 30 import org.dom4j.Node; 31 import org.jfree.chart.ChartRenderingInfo; 32 import org.jfree.chart.entity.CategoryItemEntity; 33 import org.jfree.chart.entity.ChartEntity; 34 import org.jfree.chart.entity.PieSectionEntity; 35 import org.jfree.chart.entity.StandardEntityCollection; 36 import org.jfree.chart.imagemap.ImageMapUtilities; 37 import org.jfree.data.category.DefaultCategoryDataset; 38 import org.jfree.data.general.Dataset; 39 import org.pentaho.core.connection.IPentahoResultSet; 40 import org.pentaho.messages.Messages; 41 import org.pentaho.core.solution.ActionResource; 42 import org.pentaho.core.solution.IActionResource; 43 import org.pentaho.core.system.PentahoSystem; 44 import org.pentaho.core.ui.IPentahoUrlFactory; 45 import org.pentaho.core.util.TemplateUtil; 46 import org.pentaho.core.util.XmlHelper; 47 import org.pentaho.messages.util.LocaleHelper; 48 import org.pentaho.plugin.jfreechart.CategoryDatasetChartDefinition; 49 import org.pentaho.plugin.jfreechart.JFreeChartEngine; 50 51 public class CategoryDatasetChartComponent extends AbstractJFreeChartComponent { 52 private static final long serialVersionUID = -6268840271596447555L; 53 54 protected String seriesName = null; 55 56 public CategoryDatasetChartComponent(int chartType, String definitionPath, int width, int height, IPentahoUrlFactory urlFactory, List messages) { 57 super(chartType, definitionPath, width, height, urlFactory, messages); 58 setXsl("text/html", "Chart.xsl"); } 61 62 public CategoryDatasetChartComponent(String definitionPath, IPentahoUrlFactory urlFactory, ArrayList messages) { 63 super(definitionPath, urlFactory, messages); 64 setXsl("text/html", "Chart.xsl"); } 67 68 public CategoryDatasetChartComponent(IPentahoUrlFactory urlFactory, List messages) { 69 super(urlFactory, messages); 70 setXsl("text/html", "Chart.xsl"); } 73 74 public void setSeriesName( String seriesName ) { 75 this.seriesName = seriesName; 76 } 77 78 public Dataset createChart(Document doc) { 79 if (solution != null) { values = getActionData(); 81 } else { 82 } 84 85 if( values == null ) { 86 return null; 88 } 89 Node chartAttributes = doc.selectSingleNode("//" + CHART_NODE_NAME); CategoryDatasetChartDefinition chartDefinition = new CategoryDatasetChartDefinition((IPentahoResultSet) values, byRow, chartAttributes, getSession()); 93 94 setChartType(chartDefinition.getChartType()); 96 setTitle(chartDefinition.getTitle()); 97 98 Node urlTemplateNode = chartAttributes.selectSingleNode(URLTEMPLE_NODE_NAME); 100 if (urlTemplateNode != null) { 101 setUrlTemplate(urlTemplateNode.getText()); 102 } 103 104 Node paramName2Node = chartAttributes.selectSingleNode(PARAM2_NODE_NAME); 106 if (paramName2Node != null) { 107 seriesName = paramName2Node.getText(); 108 } 109 110 if (chartDefinition.getWidth() != -1 && (width == -1 )) { 111 setWidth(chartDefinition.getWidth()); 112 } 113 if (chartDefinition.getHeight() != -1 && (height == -1 )) { 114 setHeight(chartDefinition.getHeight()); 115 } 116 117 return chartDefinition; 118 } 119 120 public boolean setDataAction(String chartDefinition) { 121 ActionResource resource = new ActionResource("", IActionResource.SOLUTION_FILE_RESOURCE, "text/xml", chartDefinition); 123 try { 124 Document dataActionDocument = PentahoSystem.getSolutionRepository(getSession()).getResourceAsDocument(resource); 125 if (dataActionDocument == null) { 126 return false; 127 } 128 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 ) { 136 width = (int) XmlHelper.getNodeText("chart/width", dataActionDocument, 125); } 138 if( height == 0 ) { 139 height = (int) XmlHelper.getNodeText("chart/height", dataActionDocument, 125); } 141 } catch (Exception e) { 142 error(Messages.getString("CategoryDatasetChartComponent.ERROR_0001_INVALID_CHART_DEFINITION", chartDefinition), e); return false; 144 } 145 return true; 146 } 147 148 public Document getXmlContent() { 149 150 Document result = DocumentHelper.createDocument(); 152 String baseUrl = PentahoSystem.getApplicationContext().getBaseUrl(); 153 setXslProperty("baseUrl", baseUrl); 155 ActionResource resource = new ActionResource(title, IActionResource.SOLUTION_FILE_RESOURCE, "text/xml", definitionPath); 158 Document chartDefinition = null; 159 String mapName = "chart" + chartCount++; try { 161 chartDefinition = PentahoSystem.getSolutionRepository(getSession()).getResourceAsDocument(resource); 162 } catch (IOException e) { 163 } 164 165 if( chartDefinition == null ) { 166 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 ); 171 return result; 172 } 173 dataDefinition = createChart(chartDefinition); 175 176 if( dataDefinition == null ) { 177 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; 183 } 184 185 PrintWriter printWriter = new PrintWriter (new StringWriter ()); 187 String chartTitle = ""; try { 192 if( width == -1 ) { 193 width = Integer.parseInt(chartDefinition.selectSingleNode("/chart/width").getText()); } 195 if( height == -1 ) { 196 height = Integer.parseInt(chartDefinition.selectSingleNode("/chart/height").getText()); } 198 } catch (Exception e) { 199 } 201 if (chartDefinition.selectSingleNode("/chart/"+URLTEMPLE_NODE_NAME) != null) { urlTemplate = chartDefinition.selectSingleNode("/chart/"+URLTEMPLE_NODE_NAME).getText(); } 204 205 if (chartDefinition.selectSingleNode("/chart/paramName") != null) { paramName = chartDefinition.selectSingleNode("/chart/paramName").getText(); } 208 209 Element root = result.addElement("charts"); DefaultCategoryDataset chartDataDefinition = (DefaultCategoryDataset) dataDefinition; 211 if (chartDataDefinition.getRowCount() > 0) { 212 String [] tempFileInfo = createTempFile(); 214 String fileName = tempFileInfo[AbstractChartComponent.FILENAME_INDEX]; 215 String filePathWithoutExtension = tempFileInfo[AbstractChartComponent.FILENAME_WITHOUT_EXTENSION_INDEX]; 216 217 ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection()); 218 JFreeChartEngine.saveChart(chartDataDefinition, chartTitle, "", filePathWithoutExtension, width, height, JFreeChartEngine.OUTPUT_PNG, printWriter, info, this); applyOuterURLTemplateParam(); 220 popultateInfo(info); 221 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.getRowCount(); row++) { 226 for (int column = 0; column < chartDataDefinition.getColumnCount(); column++) { 227 Number value = chartDataDefinition.getValue(row, column); 228 Comparable rowKey = chartDataDefinition.getRowKey(row); 229 Comparable columnKey = chartDataDefinition.getColumnKey(column); 230 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()); } 235 } 236 String mapString = ImageMapUtilities.getImageMap(mapName, info); 237 chartElement.addElement("imageMap").setText(mapString); chartElement.addElement("image").setText(fileName); } 240 return result; 241 } 242 243 private void popultateInfo(ChartRenderingInfo info) { 244 if( urlTemplate == null ) { 245 return; 246 } 247 ArrayList seriesListArray = null; 248 int seriesListIndex = 0; 249 Iterator iter = info.getEntityCollection().iterator(); 250 while (iter.hasNext()) { 251 ChartEntity entity = (ChartEntity) iter.next(); 252 if (entity instanceof PieSectionEntity) { 253 PieSectionEntity pieSectionEntity = (PieSectionEntity) entity; 254 String value = pieSectionEntity.getSectionKey().toString(); 255 if (paramName == null) { 256 pieSectionEntity.setURLText(value); 257 } else { 258 try { 259 String encodedVal = URLEncoder.encode(value, LocaleHelper.getSystemEncoding()); 260 String drillURL = TemplateUtil.applyTemplate(urlTemplate, paramName, encodedVal); 261 pieSectionEntity.setURLText(drillURL); 262 263 } catch (UnsupportedEncodingException e) { 264 e.printStackTrace(); 266 } 267 } 268 } else if (entity instanceof CategoryItemEntity) { 269 CategoryItemEntity categoryItemEntity = (CategoryItemEntity) entity; 270 if (seriesListArray == null) { 271 seriesListArray = new ArrayList (categoryItemEntity.getDataset().getRowKeys()); 272 } 273 String category = categoryItemEntity.getCategory().toString(); 274 if (paramName == null) { 275 categoryItemEntity.setURLText(category); 276 } else { 277 try { 278 String encodedVal = URLEncoder.encode(category, LocaleHelper.getSystemEncoding()); 279 String drillURL = TemplateUtil.applyTemplate(urlTemplate, paramName, encodedVal); 280 if (seriesListIndex >= seriesListArray.size()) { 281 seriesListIndex = 0; 282 } 283 encodedVal = URLEncoder.encode(seriesListArray.get(seriesListIndex).toString(), LocaleHelper.getSystemEncoding()); 284 seriesListIndex++; 285 if( seriesName == null ) { 286 drillURL = TemplateUtil.applyTemplate(drillURL, "SERIES", encodedVal); } else { 288 drillURL = TemplateUtil.applyTemplate(drillURL, seriesName, encodedVal); 289 } 290 categoryItemEntity.setURLText(drillURL); 291 292 } catch (UnsupportedEncodingException e) { 293 e.printStackTrace(); 295 } 296 } 297 } 298 } 299 } 300 301 public boolean validate() { 302 return true; 304 } 305 306 } 307 | Popular Tags |