/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License, version 2 as published by the Free Software * Foundation. * * You should have received a copy of the GNU General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * * Copyright 2006 - 2008 Pentaho Corporation. All rights reserved. * * Created Feb 13, 2006 * @author wseyler */ package org.pentaho.platform.uifoundation.chart; import java.util.Date; import org.jfree.chart.imagemap.StandardURLTagFragmentGenerator; import org.jfree.data.general.Dataset; import org.jfree.data.xy.XYDataset; import org.pentaho.commons.connection.IPentahoResultSet; import org.pentaho.platform.engine.core.system.PentahoSystem; import org.pentaho.platform.engine.services.runtime.TemplateUtil; public class PentahoChartURLTagFragmentGenerator extends StandardURLTagFragmentGenerator { private static final String SERIES_TAG = "series="; //$NON-NLS-1$ private static final String CATEGORY_TAG = "category="; //$NON-NLS-1$ private static final String ITEM_TAG = "item="; //$NON-NLS-1$ String urlFragment; Dataset dataset; String parameterName; String seriesName; String urlTarget; boolean useBaseUrl; IPentahoResultSet data; int i =0; public PentahoChartURLTagFragmentGenerator(final String urlFragment, final Dataset dataset, final String parameterName, final String outerParameterName) { super(); this.urlFragment = urlFragment; this.dataset = dataset; this.parameterName = parameterName; this.seriesName = outerParameterName; this.urlTarget = "pentaho_popup";//$NON-NLS-1$ this.useBaseUrl = true; } public PentahoChartURLTagFragmentGenerator(final String urlFragment, final String urlTarget, final boolean useBaseUrl, final Dataset dataset, final String parameterName, final String outerParameterName) { super(); this.urlFragment = urlFragment; this.dataset = dataset; this.parameterName = parameterName; this.seriesName = outerParameterName; this.urlTarget = urlTarget; this.useBaseUrl = useBaseUrl; } public PentahoChartURLTagFragmentGenerator(final String urlTemplate, final Dataset dataDefinition, final String paramName) { this(urlTemplate, dataDefinition, paramName, ""); //$NON-NLS-1$ } @Override public String generateURLFragment(final String urlText) { if (urlFragment != null) { String urlTemplate = " href=\""; //$NON-NLS-1$ // do not add ase URL if script boolean isScript = urlFragment.startsWith("javascript:"); //$NON-NLS-1$ // If isScript is true, ignore useBaseURL parameter... if (!isScript) { if (useBaseUrl) { urlTemplate += PentahoSystem.getApplicationContext().getBaseUrl(); } } // Handle " in the urlFragment urlTemplate += urlFragment.replaceAll("\"", "%22") + "\""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ String value = null; String itemValue = null; // Do we have a 'category=' as part of the urlText in? If so, grab the value from the urlText // this is the replacement value for the paramName parameter (when categorical). value = retrieveValue(PentahoChartURLTagFragmentGenerator.CATEGORY_TAG, urlText); if (value != null){ urlTemplate = TemplateUtil.applyTemplate(urlTemplate, parameterName, value); // <paramName> replacement value } // Do we have a 'series=' as part of the urlText in? If so, grab the value from the urlText // this is the replacement value for the series-name parameter. value = retrieveValue(PentahoChartURLTagFragmentGenerator.SERIES_TAG, urlText); if (value != null){ if ((dataset instanceof CategoryDatasetChartDefinition)|| (dataset instanceof XYZSeriesCollectionChartDefinition)) { urlTemplate = TemplateUtil.applyTemplate(urlTemplate, seriesName, value); // <series-name> replacement value }else if (dataset instanceof XYDataset) { XYDataset set = (XYDataset)dataset; Comparable <?> seriesKey = set.getSeriesKey(Integer.parseInt(value)); urlTemplate = TemplateUtil.applyTemplate(urlTemplate, seriesName, seriesKey.toString()); // <series-name> replacement value // Do we have an 'item=' as part of the urlText in? If so, grab the value from the urlText // this is the replacement value for the paramName parameter, when the chart is an x/y plot. itemValue = retrieveValue(PentahoChartURLTagFragmentGenerator.ITEM_TAG, urlText); if(itemValue != null){ int itemVal = Integer.parseInt(itemValue); int val = Integer.parseInt(value); Object x = null; Number xNum = set.getX(val, itemVal); x = (xNum instanceof Long)? new Date((Long)xNum):xNum; urlTemplate = TemplateUtil.applyTemplate(urlTemplate, parameterName, x.toString()); // <paramName> replacement value // This value is NEW. We have never returned more than 2 parameters in the url-template. // A logical extension for x/y plots is to return the series, the x value and the y value. // However, the item value is not plumbed through to the chart definition yet. Object y = null; Number yNum = set.getY(val, itemVal); y = (yNum instanceof Long)? new Date((Long)yNum):yNum; urlTemplate = TemplateUtil.applyTemplate(urlTemplate, "ITEM", y.toString()); // {ITEM} replacement value, in the // url-template. There is no parameter // plumbed for this. } } } if (!isScript) { urlTemplate = urlTemplate + " target=\"" + urlTarget + "\""; //$NON-NLS-1$//$NON-NLS-2$ } return urlTemplate; } else { return super.generateURLFragment(urlText); } } private String retrieveValue(String tag, String urlText) { String returnValue = null; int startIdx, endIdx; if (urlText.contains(tag)) { startIdx = urlText.indexOf(tag) + tag.length(); if (urlText.indexOf('&', startIdx) != -1) { endIdx = urlText.indexOf('&', startIdx); } else { endIdx = urlText.length(); } returnValue = urlText.substring(startIdx, endIdx).trim(); } return returnValue; } }