1 /*
2  * JasperReports - Free Java Reporting Library.
3  * Copyright (C) 2001 - 2019 TIBCO Software Inc. All rights reserved.
4  * http://www.jaspersoft.com
5  *
6  * Unless you have purchased a commercial license agreement from Jaspersoft,
7  * the following license terms apply:
8  *
9  * This program is part of JasperReports.
10  *
11  * JasperReports is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License as published by
13  * the Free Software Foundation, either version 3 of the License, or
14  * (at your option) any later version.
15  *
16  * JasperReports is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * GNU Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * along with JasperReports. If not, see <http://www.gnu.org/licenses/>.
23  */

24 package net.sf.jasperreports.components.spiderchart;
25
26 import net.sf.jasperreports.charts.JRCategorySeries;
27 import net.sf.jasperreports.components.charts.ChartSettings;
28 import net.sf.jasperreports.engine.JRExpressionCollector;
29 import net.sf.jasperreports.engine.JRHyperlinkParameter;
30 import net.sf.jasperreports.engine.base.JRBaseObjectFactory;
31 import net.sf.jasperreports.engine.component.Component;
32 import net.sf.jasperreports.engine.component.ComponentCompiler;
33 import net.sf.jasperreports.engine.design.JRVerifier;
34 import net.sf.jasperreports.engine.design.JasperDesign;
35 import net.sf.jasperreports.engine.type.EvaluationTimeEnum;
36
37 /**
38  * 
39  * @author Sanda Zaharia (shertage@users.sourceforge.net)
40  */

41 public class SpiderChartCompiler implements ComponentCompiler
42 {
43
44     @Override
45     public void collectExpressions(Component component, JRExpressionCollector collector)
46     {
47         SpiderChartComponent chart = (SpiderChartComponent) component;
48         collectExpressions(chart.getChartSettings(), collector);
49         collectExpressions((SpiderDataset)chart.getDataset(), collector);
50         collectExpressions((SpiderPlot)chart.getPlot(), collector);
51     }
52
53     public static void collectExpressions(SpiderDataset dataset, JRExpressionCollector collector)
54     {
55         if(dataset != null)
56         {
57             collector.collect(dataset);
58     
59             JRCategorySeries[] categorySeries = dataset.getSeries();
60             if (categorySeries != null && categorySeries.length > 0)
61             {
62                 JRExpressionCollector seriesCollector = collector.getCollector(dataset);
63                 for(int j = 0; j < categorySeries.length; j++)
64                 {
65                     seriesCollector.addExpression(categorySeries[j].getSeriesExpression());
66                     seriesCollector.addExpression(categorySeries[j].getCategoryExpression());
67                     seriesCollector.addExpression(categorySeries[j].getValueExpression());
68                     seriesCollector.addExpression(categorySeries[j].getLabelExpression());
69     
70                     seriesCollector.collectHyperlink(categorySeries[j].getItemHyperlink());
71                     
72                 }
73             }
74         }
75     }
76
77     public static void collectExpressions(SpiderPlot spiderPlot, JRExpressionCollector collector)
78     {
79         if(spiderPlot != null)
80         {
81             collector.addExpression(spiderPlot.getMaxValueExpression());
82         }
83     }
84
85     public static void collectExpressions(ChartSettings chart, JRExpressionCollector collector)
86     {
87         if(chart != null)
88         {
89             collector.addExpression(chart.getTitleExpression());
90             collector.addExpression(chart.getSubtitleExpression());
91             collector.addExpression(chart.getAnchorNameExpression());
92             collector.addExpression(chart.getBookmarkLevelExpression());
93             collector.addExpression(chart.getHyperlinkReferenceExpression());
94             collector.addExpression(chart.getHyperlinkWhenExpression());
95             collector.addExpression(chart.getHyperlinkAnchorExpression());
96             collector.addExpression(chart.getHyperlinkPageExpression());
97             collector.addExpression(chart.getHyperlinkTooltipExpression());
98     
99             JRHyperlinkParameter[] hyperlinkParameters = chart.getHyperlinkParameters();
100             if (hyperlinkParameters != null)
101             {
102                 for (int i = 0; i < hyperlinkParameters.length; i++)
103                 {
104                     JRHyperlinkParameter parameter = hyperlinkParameters[i];
105                     if (parameter != null)
106                     {
107                         collector.addExpression(parameter.getValueExpression());
108                     }
109                 }
110             }
111         }
112     }
113
114     @Override
115     public void verify(Component component, JRVerifier verifier)
116     {
117         SpiderChartComponent chartComponent = (SpiderChartComponent) component;
118         
119         verifyEvaluation(verifier, chartComponent);
120         
121         ChartSettings chartSettings = chartComponent.getChartSettings();
122         if (chartSettings == null)
123         {
124             verifier.addBrokenRule("No chart settings for spider chart", chartComponent);
125         }
126         
127         SpiderDataset dataset = (SpiderDataset)chartComponent.getDataset();
128         if (dataset == null)
129         {
130             verifier.addBrokenRule("No dataset for spider chart", chartComponent);
131         }
132         else
133         {
134             verify(verifier, dataset);
135         }
136         
137         SpiderPlot spiderPlot = (SpiderPlot)chartComponent.getPlot();
138         
139         if (dataset == null)
140         {
141             verifier.addBrokenRule("No plot set for spider chart", chartComponent);
142         }
143         else
144         {
145             verify(verifier, spiderPlot);
146         }
147         
148         
149     }
150
151     protected void verifyEvaluation(JRVerifier verifier,
152             SpiderChartComponent chart)
153     {
154         EvaluationTimeEnum evaluationTime = chart.getEvaluationTime();
155         if (evaluationTime == EvaluationTimeEnum.AUTO)
156         {
157             verifier.addBrokenRule("Spider chart evaluation time cannot be Auto", chart);
158         }
159         else if (evaluationTime == EvaluationTimeEnum.GROUP)
160         {
161             String groupName = chart.getEvaluationGroup();
162             if (groupName == null)
163             {
164                 verifier.addBrokenRule("Evaluation group not set for spider chart", chart);
165             }
166             else
167             {
168                 JasperDesign report = verifier.getReportDesign();
169                 if (!report.getGroupsMap().containsKey(groupName))
170                 {
171                     verifier.addBrokenRule("Spider chart evaluation group " + groupName 
172                             + " not found in report", chart);
173                 }
174             }
175         }
176     }
177
178     protected void verify(JRVerifier verifier, SpiderDataset dataset)
179     {
180         verifier.verifyElementDataset(dataset);
181         
182         JRCategorySeries[] series = dataset.getSeries();
183         if (series != null)
184         {
185             for (int i = 0; i < series.length; i++)
186             {
187                 verifier.verifyHyperlink(series[i].getItemHyperlink());
188             }
189         }
190     }
191
192     protected void verify(JRVerifier verifier, SpiderPlot spiderPlot)
193     {
194     }
195
196     @Override
197     public Component toCompiledComponent(Component component,
198             JRBaseObjectFactory baseFactory)
199     {
200         SpiderChartComponent chart = (SpiderChartComponent) component;
201         SpiderChartComponent compiledChart = new SpiderChartComponent(chart, baseFactory);
202         return compiledChart;
203     }
204     
205 }
206