All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.jasperreports.engine.JRExpressionCollector Maven / Gradle / Ivy

There is a newer version: 7.0.1
Show newest version
/*
 * JasperReports - Free Java Reporting Library.
 * Copyright (C) 2001 - 2019 TIBCO Software Inc. All rights reserved.
 * http://www.jaspersoft.com
 *
 * Unless you have purchased a commercial license agreement from Jaspersoft,
 * the following license terms apply:
 *
 * This program is part of JasperReports.
 *
 * JasperReports is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * JasperReports 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 Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with JasperReports. If not, see .
 */
package net.sf.jasperreports.engine;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import net.sf.jasperreports.charts.JRAreaPlot;
import net.sf.jasperreports.charts.JRBar3DPlot;
import net.sf.jasperreports.charts.JRBarPlot;
import net.sf.jasperreports.charts.JRBubblePlot;
import net.sf.jasperreports.charts.JRCandlestickPlot;
import net.sf.jasperreports.charts.JRCategoryDataset;
import net.sf.jasperreports.charts.JRCategorySeries;
import net.sf.jasperreports.charts.JRDataRange;
import net.sf.jasperreports.charts.JRGanttDataset;
import net.sf.jasperreports.charts.JRGanttSeries;
import net.sf.jasperreports.charts.JRHighLowDataset;
import net.sf.jasperreports.charts.JRHighLowPlot;
import net.sf.jasperreports.charts.JRLinePlot;
import net.sf.jasperreports.charts.JRMeterPlot;
import net.sf.jasperreports.charts.JRPieDataset;
import net.sf.jasperreports.charts.JRPieSeries;
import net.sf.jasperreports.charts.JRScatterPlot;
import net.sf.jasperreports.charts.JRThermometerPlot;
import net.sf.jasperreports.charts.JRTimePeriodDataset;
import net.sf.jasperreports.charts.JRTimePeriodSeries;
import net.sf.jasperreports.charts.JRTimeSeries;
import net.sf.jasperreports.charts.JRTimeSeriesDataset;
import net.sf.jasperreports.charts.JRTimeSeriesPlot;
import net.sf.jasperreports.charts.JRValueDataset;
import net.sf.jasperreports.charts.JRXyDataset;
import net.sf.jasperreports.charts.JRXySeries;
import net.sf.jasperreports.charts.JRXyzDataset;
import net.sf.jasperreports.charts.JRXyzSeries;
import net.sf.jasperreports.charts.util.JRMeterInterval;
import net.sf.jasperreports.crosstabs.JRCellContents;
import net.sf.jasperreports.crosstabs.JRCrosstab;
import net.sf.jasperreports.crosstabs.JRCrosstabBucket;
import net.sf.jasperreports.crosstabs.JRCrosstabCell;
import net.sf.jasperreports.crosstabs.JRCrosstabColumnGroup;
import net.sf.jasperreports.crosstabs.JRCrosstabDataset;
import net.sf.jasperreports.crosstabs.JRCrosstabMeasure;
import net.sf.jasperreports.crosstabs.JRCrosstabParameter;
import net.sf.jasperreports.crosstabs.JRCrosstabRowGroup;
import net.sf.jasperreports.crosstabs.design.JRDesignCrosstab;
import net.sf.jasperreports.engine.analytics.dataset.DataAxis;
import net.sf.jasperreports.engine.analytics.dataset.DataAxisLevel;
import net.sf.jasperreports.engine.analytics.dataset.DataLevelBucket;
import net.sf.jasperreports.engine.analytics.dataset.DataLevelBucketProperty;
import net.sf.jasperreports.engine.analytics.dataset.DataMeasure;
import net.sf.jasperreports.engine.analytics.dataset.MultiAxisData;
import net.sf.jasperreports.engine.analytics.dataset.MultiAxisDataset;
import net.sf.jasperreports.engine.component.Component;
import net.sf.jasperreports.engine.component.ComponentCompiler;
import net.sf.jasperreports.engine.component.ComponentKey;
import net.sf.jasperreports.engine.component.ComponentManager;
import net.sf.jasperreports.engine.component.ComponentsEnvironment;
import net.sf.jasperreports.engine.design.JRAbstractCompiler;
import net.sf.jasperreports.engine.part.PartComponent;
import net.sf.jasperreports.engine.part.PartComponentManager;
import net.sf.jasperreports.engine.part.PartComponentsEnvironment;
import net.sf.jasperreports.engine.type.ExpressionTypeEnum;


/**
 * An expression collector traverses a report and collects report expressions
 * out of it.
 * 
 * 

* The expressions are then included into evaluator classes which are compiled * and used at report fill time to evaluate expressions. * * @author Teodor Danciu ([email protected]) */ public class JRExpressionCollector { private static final Log log = LogFactory.getLog(JRExpressionCollector.class); public static final String EXCEPTION_MESSAGE_KEY_EXPRESSION_NOT_FOUND = "engine.expression.collector.expression.not.found"; public static final String EXCEPTION_MESSAGE_KEY_TWO_GENERATED_IDS = "engine.expression.collector.two.generated.ids"; public static JRExpressionCollector collector(JasperReportsContext jasperReportsContext, JRReport report) { JRExpressionCollector collector = new JRExpressionCollector(jasperReportsContext, null, report); collector.collect(); return collector; } public static List collectExpressions(JasperReportsContext jasperReportsContext, JRReport report) { return collector(jasperReportsContext, report).getExpressions(); } public static JRExpressionCollector collector(JasperReportsContext jasperReportsContext, JRReport report, JRCrosstab crosstab) { JRExpressionCollector collector = new JRExpressionCollector(jasperReportsContext, null, report); collector.collect(crosstab); return collector; } public static List collectExpressions(JasperReportsContext jasperReportsContext, JRReport report, JRCrosstab crosstab) { return collector(jasperReportsContext, report, crosstab).getExpressions(crosstab); } private final JasperReportsContext jasperReportsContext; private final JRReport report; private final JRExpressionCollector parent; private Map expressionIds; private LinkedList contextStack; private Map expressionContextMap; protected static class GeneratedIds { private final TreeMap ids = new TreeMap(); private int nextId; private List expressions; public JRExpression get(Integer id) { return ids.get(id); } public JRExpression put(Integer id, JRExpression expression) { expressions = null; return ids.put(id, expression); } public void move(Integer id, Integer newId) { expressions = null; JRExpression expression = ids.remove(id); if (expression != null) { ids.put(newId, expression); } } public Integer nextId() { Integer id = nextId; while (ids.containsKey(id)) { id = ++nextId; } return id; } public List expressions() { if (expressions == null) { expressions = new ArrayList(ids.values()); } return expressions; } public JRExpression expression(int id) { return ids.get(id); } } private GeneratedIds generatedIds = new GeneratedIds(); private Map crosstabIds; /** * Collectors for sub datasets indexed by dataset name. */ private Map datasetCollectors; /** * Collectors for crosstabs. */ private Map crosstabCollectors; private final Set collectedStyles; protected JRExpressionCollector(JasperReportsContext jasperReportsContext, JRExpressionCollector parent, JRReport report) { this.jasperReportsContext = jasperReportsContext; this.parent = parent; this.report = report; if (parent == null) { expressionIds = new HashMap(); datasetCollectors = new HashMap(); crosstabCollectors = new HashMap(); contextStack = new LinkedList(); expressionContextMap = new HashMap(); crosstabIds = new HashMap(); } else { expressionIds = this.parent.expressionIds; contextStack = this.parent.contextStack; expressionContextMap = this.parent.expressionContextMap; crosstabIds = parent.crosstabIds; } collectedStyles = new HashSet(); } /** * Collects an expression. * * @param expression the expression to collect */ public void addExpression(JRExpression expression) { if (expression != null) { Integer id = getExpressionId(expression); if (id == null) { id = generatedIds.nextId(); setGeneratedId(expression, id); generatedIds.put(id, expression); if (log.isTraceEnabled()) { log.trace(hashCode() + " generated id " + id + " for expression " + expression.hashCode() + " " + expression.getText()); } } else { if (log.isTraceEnabled()) { log.trace(hashCode() + " found id " + id + " for expression " + expression.hashCode() + " " + expression.getText()); } if (canUseId(expression, id)) { generatedIds.put(id, expression); } else { reassignId(expression, id); } } setExpressionContext(expression); } } private void setGeneratedId(JRExpression expression, Integer id) { Object existingId = expressionIds.put(expression, id); if (existingId != null && !existingId.equals(id)) { throw new JRRuntimeException( EXCEPTION_MESSAGE_KEY_TWO_GENERATED_IDS, new Object[]{expression.getText()}); } } private void updateGeneratedId(JRExpression expression, Integer currentId, Integer newId) { Object existingId = expressionIds.put(expression, newId); if (existingId == null || !existingId.equals(currentId)) { throw new JRRuntimeException( EXCEPTION_MESSAGE_KEY_TWO_GENERATED_IDS, new Object[]{expression.getText(), currentId}); } } protected boolean canUseId(JRExpression expression, Integer id) { JRExpression existingExpression = generatedIds.get(id); return existingExpression == null || existingExpression.equals(expression); } protected void reassignId(JRExpression expression, Integer id) { List collectors = collectorsForExpression(id, expression); Integer newId = generatedIds.nextId(); while (!canUseId(collectors, expression, newId)) { ++newId; } if (log.isTraceEnabled()) { log.trace(hashCode() + " updated id to " + newId + " for expression " + expression.hashCode() + " " + expression.getText()); } generatedIds.put(newId, expression); for (JRExpressionCollector collector : collectors) { collector.generatedIds.move(id, newId); } updateGeneratedId(expression, id, newId); } protected boolean canUseId(List collectors, JRExpression expression, Integer id) { boolean canUse = canUseId(expression, id); if (canUse) { for (JRExpressionCollector collector : collectors) { if (!collector.canUseId(expression, id)) { canUse = false; } } } return canUse; } protected JRExpressionCollector rootCollector() { return parent == null ? this : parent; } protected boolean hasExpression(Integer id, JRExpression expression) { JRExpression existingExpression = generatedIds.get(id); return existingExpression != null && existingExpression.equals(expression); } protected List collectorsForExpression(Integer id, JRExpression expression) { JRExpressionCollector root = rootCollector(); List collectors = new ArrayList(); if (root.hasExpression(id, expression)) { collectors.add(root); } for (JRExpressionCollector collector : root.datasetCollectors.values()) { if (collector.hasExpression(id, expression)) { collectors.add(collector); } } for (JRExpressionCollector collector : root.crosstabCollectors.values()) { if (collector.hasExpression(id, expression)) { collectors.add(collector); } } return collectors; } protected void pushContextObject(Object context) { contextStack.addLast(context); } protected Object popContextObject() { return contextStack.removeLast(); } protected void setExpressionContext(JRExpression expression) { if (!contextStack.isEmpty()) { Object context = contextStack.getLast(); expressionContextMap.put(expression, context); } } /** * Returns the expression collector to which expressions in an element * dataset belong. * *

* If the element dataset includes a subdataset run, a (sub) expression * collector that corresponds to the subdataset will be returned. * Otherwise, this/the main expression collector will be returned. * * @param elementDataset an element dataset * @return the expression collector to be used for the element dataset */ public JRExpressionCollector getCollector(JRElementDataset elementDataset) { JRExpressionCollector collector; JRDatasetRun datasetRun = elementDataset.getDatasetRun(); if (datasetRun == null) { collector = this; } else { collector = getDatasetCollector(datasetRun.getDatasetName()); } return collector; } /** * Returns the expression collector for a report subdataset. * * @param datasetName the subdataset name * @return the expression collector for the subdataset */ public JRExpressionCollector getDatasetCollector(String datasetName) { JRExpressionCollector collector; if (parent == null) { collector = datasetCollectors.get(datasetName); if (collector == null) { collector = new JRExpressionCollector(jasperReportsContext, this, report); datasetCollectors.put(datasetName, collector); if (log.isTraceEnabled()) { log.trace(this.hashCode() + " created collector " + collector.hashCode() + " for dataset " + datasetName); } } } else { collector = parent.getDatasetCollector(datasetName); } return collector; } /** * Returns the expression collector for a dataset. * * @param dataset the dataset * @return the dataset expression collector */ public JRExpressionCollector getCollector(JRDataset dataset) { JRExpressionCollector collector; if (parent == null) { if (dataset.isMainDataset() || datasetCollectors == null) { collector = this; } else { collector = getDatasetCollector(dataset.getName()); } } else { collector = parent.getCollector(dataset); } return collector; } /** * Returns the expression collector for a crosstab. * * @param crosstab the crosstab * @return the crosstab expression collector */ public JRExpressionCollector getCollector(JRCrosstab crosstab) { JRExpressionCollector collector; if (parent == null) { collector = crosstabCollectors.get(crosstab); if (collector == null) { collector = new JRExpressionCollector(jasperReportsContext, this, report); crosstabCollectors.put(crosstab, collector); } } else { collector = parent.getCollector(crosstab); } return collector; } /** * Returns the collected expressions. * * @return the collected expressions */ public List getExpressions() { return new ArrayList(generatedIds.expressions()); } /** * Returns the list of expressions that should be compiled. * * @return the list of expressions that should be compiled * @see #getExpressions() * @see JRExpression#getType() * @deprecated {@link JRAbstractCompiler} internally filters expressions to be compiled */ @Deprecated public List getCompiledExpressions() { List expressions = generatedIds.expressions(); List compiledExpressions = new ArrayList<>(expressions.size()); for (JRExpression expression : expressions) { if (expression.getType() != ExpressionTypeEnum.SIMPLE_TEXT) { compiledExpressions.add(expression); } } return compiledExpressions; } /** * Return all the expressions collected from the report. * * @return all the expressions collected from the report */ public Collection getReportExpressions() { return Collections.unmodifiableSet(expressionIds.keySet()); } /** * Returns the expressions collected for a dataset. * * @param dataset the dataset * @return the expressions */ public List getExpressions(JRDataset dataset) { return getCollector(dataset).getExpressions(); } /** * Returns the expressions collected for a crosstab. * * @param crosstab the crosstab * @return the expressions */ public List getExpressions(JRCrosstab crosstab) { return getCollector(crosstab).getExpressions(); } public Integer getExpressionId(JRExpression expression) { return expressionIds.get(expression); } public JRExpression getExpression(int expressionId) { return generatedIds.expression(expressionId); } public Integer getCrosstabId(JRCrosstab crosstab) { return crosstabIds.get(crosstab); } public Object getExpressionContext(JRExpression expression) { return expressionContextMap.get(expression); } /** * */ public Collection collect() { collectTemplates(); collect(report.getDefaultStyle()); collect(report.getMainDataset()); JRDataset[] datasets = report.getDatasets(); if (datasets != null && datasets.length > 0) { for (int i = 0; i < datasets.length; i++) { JRExpressionCollector collector = getCollector(datasets[i]); collector.collect(datasets[i]); } } collect(report.getBackground()); collect(report.getTitle()); collect(report.getPageHeader()); collect(report.getColumnHeader()); collect(report.getDetailSection()); collect(report.getColumnFooter()); collect(report.getPageFooter()); collect(report.getLastPageFooter()); collect(report.getSummary()); collect(report.getNoData()); return getExpressions(); } protected void collectTemplates() { JRReportTemplate[] templates = report.getTemplates(); if (templates != null) { for (int i = 0; i < templates.length; i++) { JRReportTemplate template = templates[i]; collect(template); } } } protected void collect(JRReportTemplate template) { addExpression(template.getSourceExpression()); } /** * Collects expressions used in a style definition. * * @param style the style to collect expressions from */ public void collect(JRStyle style) { if (style != null && collectedStyles.add(style)) { JRConditionalStyle[] conditionalStyles = style.getConditionalStyles(); if (conditionalStyles != null && conditionalStyles.length > 0) { for (int i = 0; i < conditionalStyles.length; i++) { addExpression(conditionalStyles[i].getConditionExpression()); } } collect(style.getStyle()); } } /** * */ private void collect(JRParameter[] parameters) { if (parameters != null && parameters.length > 0) { for(int i = 0; i < parameters.length; i++) { addExpression(parameters[i].getDefaultValueExpression()); } } } /** * */ private void collect(JRField[] fields) { if (fields != null && fields.length > 0) { for (JRField field : fields) { collectPropertyExpressions(field.getPropertyExpressions()); } } } /** * */ private void collect(JRVariable[] variables) { if (variables != null && variables.length > 0) { for(int i = 0; i < variables.length; i++) { JRVariable variable = variables[i]; addExpression(variable.getExpression()); addExpression(variable.getInitialValueExpression()); } } } /** * */ private void collect(JRGroup[] groups) { if (groups != null && groups.length > 0) { for(int i = 0; i < groups.length; i++) { JRGroup group = groups[i]; addExpression(group.getExpression()); collect(group.getGroupHeaderSection()); collect(group.getGroupFooterSection()); } } } /** * */ private void collect(JRSection section) { if (section != null) { JRBand[] bands = section.getBands(); if (bands != null && bands.length > 0) { for(int i = 0; i < bands.length; i++) { collect(bands[i]); } } JRPart[] parts = section.getParts(); if (parts != null && parts.length > 0) { for(int i = 0; i < parts.length; i++) { collect(parts[i]); } } } } /** * */ private void collect(JRBand band) { if (band != null) { addExpression(band.getPrintWhenExpression()); JRElement[] elements = band.getElements(); if (elements != null && elements.length > 0) { for(int i = 0; i < elements.length; i++) { elements[i].collectExpressions(this); } } List returnValues = band.getReturnValues(); if (returnValues != null && returnValues.size() > 0) { for (ExpressionReturnValue returnValue : returnValues) { addExpression(returnValue.getExpression()); } } } } /** * */ private void collect(JRPart part) { if (part != null) { addExpression(part.getPrintWhenExpression()); addExpression(part.getPartNameExpression()); ComponentKey componentKey = part.getComponentKey(); PartComponentManager manager = PartComponentsEnvironment.getInstance(jasperReportsContext).getManager(componentKey); PartComponent component = part.getComponent(); manager.getComponentCompiler(jasperReportsContext).collectExpressions(component, this); } } /** * */ private void collectElement(JRElement element) { collect(element.getStyle()); addExpression(element.getPrintWhenExpression()); collectPropertyExpressions(element.getPropertyExpressions()); } public void collectPropertyExpressions( JRPropertyExpression[] propertyExpressions) { if (propertyExpressions != null && propertyExpressions.length > 0) { for (int i = 0; i < propertyExpressions.length; i++) { collectPropertyExpression(propertyExpressions[i]); } } } protected void collectPropertyExpression( JRPropertyExpression propertyExpression) { addExpression(propertyExpression.getValueExpression()); } /** * */ private void collectAnchor(JRAnchor anchor) { addExpression(anchor.getAnchorNameExpression()); addExpression(anchor.getBookmarkLevelExpression()); } public void collectHyperlink(JRHyperlink hyperlink) { if (hyperlink != null) { addExpression(hyperlink.getHyperlinkReferenceExpression()); addExpression(hyperlink.getHyperlinkWhenExpression()); addExpression(hyperlink.getHyperlinkAnchorExpression()); addExpression(hyperlink.getHyperlinkPageExpression()); addExpression(hyperlink.getHyperlinkTooltipExpression()); JRHyperlinkParameter[] hyperlinkParameters = hyperlink.getHyperlinkParameters(); if (hyperlinkParameters != null) { for (int i = 0; i < hyperlinkParameters.length; i++) { JRHyperlinkParameter parameter = hyperlinkParameters[i]; collectHyperlinkParameter(parameter); } } } } protected void collectHyperlinkParameter(JRHyperlinkParameter parameter) { if (parameter != null) { addExpression(parameter.getValueExpression()); } } /** * */ public void collect(JRBreak breakElement) { collectElement(breakElement); } /** * */ public void collect(JRLine line) { collectElement(line); } /** * */ public void collect(JRRectangle rectangle) { collectElement(rectangle); } /** * */ public void collect(JREllipse ellipse) { collectElement(ellipse); } /** * */ public void collect(JRImage image) { collectElement(image); addExpression(image.getExpression()); collectAnchor(image); collectHyperlink(image); } /** * */ public void collect(JRStaticText staticText) { collectElement(staticText); } /** * */ public void collect(JRTextField textField) { collectElement(textField); addExpression(textField.getExpression()); addExpression(textField.getPatternExpression()); collectAnchor(textField); collectHyperlink(textField); } /** * */ public void collect(JRSubreport subreport) { collectElement(subreport); addExpression(subreport.getParametersMapExpression()); JRSubreportParameter[] parameters = subreport.getParameters(); if (parameters != null && parameters.length > 0) { for(int j = 0; j < parameters.length; j++) { addExpression(parameters[j].getExpression()); } } addExpression(subreport.getConnectionExpression()); addExpression(subreport.getDataSourceExpression()); addExpression(subreport.getExpression()); } /** * */ public void collect(JRChart chart) { collectElement(chart); collectAnchor(chart); collectHyperlink(chart); addExpression(chart.getTitleExpression()); addExpression(chart.getSubtitleExpression()); chart.getDataset().collectExpressions(this); chart.getPlot().collectExpressions(this); } /** * */ public void collect(JRPieDataset pieDataset) { collect((JRElementDataset) pieDataset); JRPieSeries[] pieSeries = pieDataset.getSeries(); if (pieSeries != null && pieSeries.length > 0) { JRExpressionCollector collector = getCollector(pieDataset); for(int j = 0; j < pieSeries.length; j++) { collector.collect(pieSeries[j]); } } JRExpressionCollector collector = getCollector(pieDataset); collector.addExpression(pieDataset.getOtherKeyExpression()); collector.addExpression(pieDataset.getOtherLabelExpression()); collector.collectHyperlink(pieDataset.getOtherSectionHyperlink()); } /** * */ public void collect(JRCategoryDataset categoryDataset) { collect((JRElementDataset) categoryDataset); JRCategorySeries[] categorySeries = categoryDataset.getSeries(); if (categorySeries != null && categorySeries.length > 0) { JRExpressionCollector collector = getCollector(categoryDataset); for(int j = 0; j < categorySeries.length; j++) { collector.collect(categorySeries[j]); } } } /** * */ public void collect(JRXyDataset xyDataset) { collect((JRElementDataset) xyDataset); JRXySeries[] xySeries = xyDataset.getSeries(); if (xySeries != null && xySeries.length > 0) { JRExpressionCollector collector = getCollector(xyDataset); for(int j = 0; j < xySeries.length; j++) { collector.collect(xySeries[j]); } } } /** * */ public void collect( JRTimeSeriesDataset timeSeriesDataset ){ collect((JRElementDataset) timeSeriesDataset); JRTimeSeries[] timeSeries = timeSeriesDataset.getSeries(); if( timeSeries != null && timeSeries.length > 0 ){ JRExpressionCollector collector = getCollector(timeSeriesDataset); for( int i = 0; i < timeSeries.length; i++ ){ collector.collect(timeSeries[i]); } } } /** * */ public void collect( JRTimePeriodDataset timePeriodDataset ){ collect((JRElementDataset) timePeriodDataset); JRTimePeriodSeries[] timePeriodSeries = timePeriodDataset.getSeries(); if( timePeriodSeries != null && timePeriodSeries.length > 0 ){ JRExpressionCollector collector = getCollector(timePeriodDataset); for( int i = 0; i < timePeriodSeries.length; i++ ){ collector.collect(timePeriodSeries[i]); } } } /** * */ public void collect(JRGanttDataset ganttDataset) { collect((JRElementDataset) ganttDataset); JRGanttSeries[] ganttSeries = ganttDataset.getSeries(); if (ganttSeries != null && ganttSeries.length > 0) { JRExpressionCollector collector = getCollector(ganttDataset); for(int j = 0; j < ganttSeries.length; j++) { collector.collect(ganttSeries[j]); } } } /** * */ public void collect( JRValueDataset valueDataset ){ collect((JRElementDataset) valueDataset); JRExpressionCollector collector = getCollector(valueDataset); collector.addExpression(valueDataset.getValueExpression()); } /** * */ private void collect(JRXySeries xySeries) { addExpression(xySeries.getSeriesExpression()); addExpression(xySeries.getXValueExpression()); addExpression(xySeries.getYValueExpression()); addExpression(xySeries.getLabelExpression()); collectHyperlink(xySeries.getItemHyperlink()); } /** * */ private void collect(JRPieSeries pieSeries) { addExpression(pieSeries.getKeyExpression()); addExpression(pieSeries.getValueExpression()); addExpression(pieSeries.getLabelExpression()); collectHyperlink(pieSeries.getSectionHyperlink()); } /** * */ private void collect(JRCategorySeries categorySeries) { addExpression(categorySeries.getSeriesExpression()); addExpression(categorySeries.getCategoryExpression()); addExpression(categorySeries.getValueExpression()); addExpression(categorySeries.getLabelExpression()); collectHyperlink(categorySeries.getItemHyperlink()); } /** * */ private void collect(JRGanttSeries ganttSeries) { addExpression(ganttSeries.getSeriesExpression()); addExpression(ganttSeries.getTaskExpression()); addExpression(ganttSeries.getSubtaskExpression()); addExpression(ganttSeries.getStartDateExpression()); addExpression(ganttSeries.getEndDateExpression()); addExpression(ganttSeries.getPercentExpression()); addExpression(ganttSeries.getLabelExpression()); collectHyperlink(ganttSeries.getItemHyperlink()); } /** * */ public void collect(JRBarPlot barPlot) { addExpression(barPlot.getCategoryAxisLabelExpression()); addExpression(barPlot.getValueAxisLabelExpression()); addExpression(barPlot.getDomainAxisMinValueExpression()); addExpression(barPlot.getDomainAxisMaxValueExpression()); addExpression(barPlot.getRangeAxisMinValueExpression()); addExpression(barPlot.getRangeAxisMaxValueExpression()); } /** * */ public void collect(JRBar3DPlot barPlot) { addExpression(barPlot.getCategoryAxisLabelExpression()); addExpression(barPlot.getValueAxisLabelExpression()); addExpression(barPlot.getRangeAxisMinValueExpression()); addExpression(barPlot.getRangeAxisMaxValueExpression()); } /** * */ public void collect( JRLinePlot linePlot ){ addExpression( linePlot.getCategoryAxisLabelExpression() ); addExpression( linePlot.getValueAxisLabelExpression() ); addExpression(linePlot.getDomainAxisMinValueExpression()); addExpression(linePlot.getDomainAxisMaxValueExpression()); addExpression(linePlot.getRangeAxisMinValueExpression()); addExpression(linePlot.getRangeAxisMaxValueExpression()); } /** * */ public void collect( JRTimeSeriesPlot timeSeriesPlot ){ addExpression( timeSeriesPlot.getTimeAxisLabelExpression() ); addExpression( timeSeriesPlot.getValueAxisLabelExpression() ); addExpression(timeSeriesPlot.getDomainAxisMinValueExpression()); addExpression(timeSeriesPlot.getDomainAxisMaxValueExpression()); addExpression(timeSeriesPlot.getRangeAxisMinValueExpression()); addExpression(timeSeriesPlot.getRangeAxisMaxValueExpression()); } /** * */ public void collect( JRScatterPlot scatterPlot ){ addExpression( scatterPlot.getXAxisLabelExpression() ); addExpression( scatterPlot.getYAxisLabelExpression() ); addExpression(scatterPlot.getDomainAxisMinValueExpression()); addExpression(scatterPlot.getDomainAxisMaxValueExpression()); addExpression(scatterPlot.getRangeAxisMinValueExpression()); addExpression(scatterPlot.getRangeAxisMaxValueExpression()); } /** * */ public void collect( JRAreaPlot areaPlot ){ addExpression( areaPlot.getCategoryAxisLabelExpression() ); addExpression( areaPlot.getValueAxisLabelExpression() ); addExpression(areaPlot.getDomainAxisMinValueExpression()); addExpression(areaPlot.getDomainAxisMaxValueExpression()); addExpression(areaPlot.getRangeAxisMinValueExpression()); addExpression(areaPlot.getRangeAxisMaxValueExpression()); } /** * */ private void collect(JRTimeSeries timeSeries) { addExpression(timeSeries.getSeriesExpression()); addExpression(timeSeries.getTimePeriodExpression()); addExpression(timeSeries.getValueExpression()); addExpression(timeSeries.getLabelExpression()); collectHyperlink(timeSeries.getItemHyperlink()); } /** * */ private void collect(JRTimePeriodSeries timePeriodSeries ){ addExpression(timePeriodSeries.getSeriesExpression()); addExpression(timePeriodSeries.getStartDateExpression()); addExpression(timePeriodSeries.getEndDateExpression()); addExpression(timePeriodSeries.getValueExpression()); addExpression(timePeriodSeries.getLabelExpression()); collectHyperlink(timePeriodSeries.getItemHyperlink()); } /** * */ public void collect(JRXyzDataset xyzDataset) { collect((JRElementDataset) xyzDataset); JRXyzSeries[] xyzSeries = xyzDataset.getSeries(); if (xyzSeries != null && xyzSeries.length > 0) { JRExpressionCollector collector = getCollector(xyzDataset); for(int j = 0; j < xyzSeries.length; j++) { collector.collect(xyzSeries[j]); } } } /** * */ private void collect(JRXyzSeries xyzSeries) { addExpression(xyzSeries.getSeriesExpression()); addExpression(xyzSeries.getXValueExpression()); addExpression(xyzSeries.getYValueExpression()); addExpression(xyzSeries.getZValueExpression()); collectHyperlink(xyzSeries.getItemHyperlink()); } /** * */ public void collect(JRBubblePlot bubblePlot) { addExpression(bubblePlot.getXAxisLabelExpression()); addExpression(bubblePlot.getYAxisLabelExpression()); addExpression(bubblePlot.getDomainAxisMinValueExpression()); addExpression(bubblePlot.getDomainAxisMaxValueExpression()); addExpression(bubblePlot.getRangeAxisMinValueExpression()); addExpression(bubblePlot.getRangeAxisMaxValueExpression()); } /** * */ public void collect(JRHighLowPlot highLowPlot) { addExpression(highLowPlot.getTimeAxisLabelExpression()); addExpression(highLowPlot.getValueAxisLabelExpression()); addExpression(highLowPlot.getDomainAxisMinValueExpression()); addExpression(highLowPlot.getDomainAxisMaxValueExpression()); addExpression(highLowPlot.getRangeAxisMinValueExpression()); addExpression(highLowPlot.getRangeAxisMaxValueExpression()); } /** * */ public void collect(JRDataRange dataRange) { if (dataRange != null) { addExpression(dataRange.getLowExpression()); addExpression(dataRange.getHighExpression()); } } /** * */ public void collect(JRMeterPlot meterPlot) { List intervals = meterPlot.getIntervals(); if (intervals != null) { Iterator iter = intervals.iterator(); while (iter.hasNext()) { JRMeterInterval interval = iter.next(); collect(interval.getDataRange()); } } collect(meterPlot.getDataRange()); } /** * */ public void collect(JRThermometerPlot thermometerPlot) { collect(thermometerPlot.getDataRange()); collect(thermometerPlot.getLowRange()); collect(thermometerPlot.getMediumRange()); collect(thermometerPlot.getHighRange()); } /** * */ public void collect(JRHighLowDataset highLowDataset) { collect((JRElementDataset) highLowDataset); JRExpressionCollector collector = getCollector(highLowDataset); collector.addExpression(highLowDataset.getSeriesExpression()); collector.addExpression(highLowDataset.getDateExpression()); collector.addExpression(highLowDataset.getHighExpression()); collector.addExpression(highLowDataset.getLowExpression()); collector.addExpression(highLowDataset.getOpenExpression()); collector.addExpression(highLowDataset.getCloseExpression()); collector.addExpression(highLowDataset.getVolumeExpression()); collector.collectHyperlink(highLowDataset.getItemHyperlink()); } /** * */ public void collect(JRCandlestickPlot candlestickPlot) { addExpression(candlestickPlot.getTimeAxisLabelExpression()); addExpression(candlestickPlot.getValueAxisLabelExpression()); addExpression(candlestickPlot.getDomainAxisMinValueExpression()); addExpression(candlestickPlot.getDomainAxisMaxValueExpression()); addExpression(candlestickPlot.getRangeAxisMinValueExpression()); addExpression(candlestickPlot.getRangeAxisMaxValueExpression()); } /** * Collects expressions from a crosstab. * * @param crosstab the crosstab */ public void collect(JRCrosstab crosstab) { collectElement(crosstab); createCrosstabId(crosstab); JRCrosstabDataset dataset = crosstab.getDataset(); collect(dataset); JRExpressionCollector datasetCollector = getCollector(dataset); JRExpressionCollector crosstabCollector = getCollector(crosstab); crosstabCollector.collect(report.getDefaultStyle()); addExpression(crosstab.getParametersMapExpression()); JRCrosstabParameter[] parameters = crosstab.getParameters(); if (parameters != null) { for (int i = 0; i < parameters.length; i++) { addExpression(parameters[i].getExpression()); } } if (crosstab.getTitleCell() != null) { crosstabCollector.collect(crosstab.getTitleCell().getCellContents()); } crosstabCollector.collect(crosstab.getHeaderCell()); JRCrosstabRowGroup[] rowGroups = crosstab.getRowGroups(); if (rowGroups != null) { for (int i = 0; i < rowGroups.length; i++) { JRCrosstabRowGroup rowGroup = rowGroups[i]; JRCrosstabBucket bucket = rowGroup.getBucket(); datasetCollector.addExpression(bucket.getExpression()); crosstabCollector.pushContextObject(rowGroup); //order by expression is in the crosstab context crosstabCollector.addExpression(bucket.getOrderByExpression()); addExpression(bucket.getComparatorExpression()); crosstabCollector.collect(rowGroup.getHeader()); crosstabCollector.collect(rowGroup.getTotalHeader()); crosstabCollector.popContextObject(); } } JRCrosstabColumnGroup[] colGroups = crosstab.getColumnGroups(); if (colGroups != null) { for (int i = 0; i < colGroups.length; i++) { JRCrosstabColumnGroup columnGroup = colGroups[i]; JRCrosstabBucket bucket = columnGroup.getBucket(); datasetCollector.addExpression(bucket.getExpression()); crosstabCollector.pushContextObject(columnGroup); //order by expression is in the crosstab context crosstabCollector.addExpression(bucket.getOrderByExpression()); addExpression(bucket.getComparatorExpression()); crosstabCollector.collect(columnGroup.getCrosstabHeader()); crosstabCollector.collect(columnGroup.getHeader()); crosstabCollector.collect(columnGroup.getTotalHeader()); crosstabCollector.popContextObject(); } } JRCrosstabMeasure[] measures = crosstab.getMeasures(); if (measures != null) { for (int i = 0; i < measures.length; i++) { datasetCollector.addExpression(measures[i].getValueExpression()); } } crosstabCollector.collect(crosstab.getWhenNoDataCell()); collectCrosstabCells(crosstab, crosstabCollector); } private void createCrosstabId(JRCrosstab crosstab) { crosstabIds.put(crosstab, crosstabIds.size()); } private void collectCrosstabCells(JRCrosstab crosstab, JRExpressionCollector crosstabCollector) { if (crosstab instanceof JRDesignCrosstab) { List cellsList = ((JRDesignCrosstab) crosstab).getCellsList(); if (cellsList != null) { for (Iterator iter = cellsList.iterator(); iter.hasNext();) { JRCrosstabCell cell = iter.next(); crosstabCollector.collect(cell.getContents()); } } } else { JRCrosstabCell[][] cells = crosstab.getCells(); if (cells != null) { for (int i = 0; i < cells.length; ++i) { for (int j = 0; j < cells[i].length; j++) { if (cells[i][j] != null) { crosstabCollector.collect(cells[i][j].getContents()); } } } } } } /** * Collects expressions from a dataset. * * @param dataset the dataset * @return collected expressions */ public Collection collect(JRDataset dataset) { JRExpressionCollector collector = getCollector(dataset); collector.collectPropertyExpressions(dataset.getPropertyExpressions()); collector.collect(dataset.getParameters()); collector.collect(dataset.getFields()); collector.collect(dataset.getVariables()); collector.collect(dataset.getGroups()); collector.addExpression(dataset.getFilterExpression()); return getExpressions(dataset); } /** * Collects expressions from an element dataset. * * @param dataset the element dataset */ public void collect(JRElementDataset dataset) { collect(dataset.getDatasetRun()); JRExpression incrementWhenExpression = dataset.getIncrementWhenExpression(); if (incrementWhenExpression != null) { JRExpressionCollector datasetCollector = getCollector(dataset); datasetCollector.addExpression(incrementWhenExpression); } } /** * Collects expressions from a subdataset run object. * * @param datasetRun the subdataset run */ public void collect(JRDatasetRun datasetRun) { if (datasetRun != null) { addExpression(datasetRun.getParametersMapExpression()); addExpression(datasetRun.getConnectionExpression()); addExpression(datasetRun.getDataSourceExpression()); JRDatasetParameter[] parameters = datasetRun.getParameters(); if (parameters != null && parameters.length > 0) { for (int i = 0; i < parameters.length; i++) { addExpression(parameters[i].getExpression()); } } } } protected void collect(JRCellContents cell) { if (cell != null) { collect(cell.getStyle()); JRElement[] elements = cell.getElements(); if (elements != null && elements.length > 0) { for(int i = 0; i < elements.length; i++) { elements[i].collectExpressions(this); } } } } public void collect(JRFrame frame) { collectElement(frame); JRElement[] elements = frame.getElements(); if (elements != null) { for (int i = 0; i < elements.length; i++) { elements[i].collectExpressions(this); } } } /** * Collects expressions from a component element wrapper. * *

* Common element expressions are collected, and then the component * compiler's * {@link ComponentCompiler#collectExpressions(Component, JRExpressionCollector)} * is called to collect component expressions. * * @param componentElement the component element */ public void collect(JRComponentElement componentElement) { collectElement(componentElement); ComponentKey componentKey = componentElement.getComponentKey(); ComponentManager manager = ComponentsEnvironment.getInstance(jasperReportsContext).getManager(componentKey); Component component = componentElement.getComponent(); manager.getComponentCompiler(jasperReportsContext).collectExpressions(component, this); } /** * Collects expressions from a generic element. * * @param element the generic element */ public void collect(JRGenericElement element) { collectElement(element); JRGenericElementParameter[] parameters = element.getParameters(); for (int i = 0; i < parameters.length; i++) { JRGenericElementParameter parameter = parameters[i]; addExpression(parameter.getValueExpression()); } } public void collect(MultiAxisData data) { if (data == null) { return; } MultiAxisDataset dataset = data.getDataset(); collect(dataset); JRExpressionCollector datasetCollector = getCollector(dataset); List axisList = data.getDataAxisList(); for (DataAxis dataAxis : axisList) { for (DataAxisLevel level : dataAxis.getLevels()) { collect(level, datasetCollector); } } for (DataMeasure measure : data.getMeasures()) { addExpression(measure.getLabelExpression()); datasetCollector.addExpression(measure.getValueExpression()); } } protected void collect(DataAxisLevel level, JRExpressionCollector datasetCollector) { addExpression(level.getLabelExpression()); DataLevelBucket bucket = level.getBucket(); datasetCollector.addExpression(bucket.getExpression()); datasetCollector.addExpression(bucket.getLabelExpression()); addExpression(bucket.getComparatorExpression()); List bucketProperties = bucket.getBucketProperties(); if (bucketProperties != null) { for (DataLevelBucketProperty bucketProperty : bucketProperties) { datasetCollector.addExpression(bucketProperty.getExpression()); } } } public JasperReportsContext getJasperReportsContext() { return jasperReportsContext; } }