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.map;
25
26 import java.util.HashMap;
27 import java.util.List;
28 import java.util.Map;
29
30 import net.sf.jasperreports.components.items.ItemCompiler;
31 import net.sf.jasperreports.components.items.ItemData;
32 import net.sf.jasperreports.engine.JRDatasetRun;
33 import net.sf.jasperreports.engine.JRExpressionCollector;
34 import net.sf.jasperreports.engine.base.JRBaseObjectFactory;
35 import net.sf.jasperreports.engine.component.Component;
36 import net.sf.jasperreports.engine.component.ComponentCompiler;
37 import net.sf.jasperreports.engine.design.JRVerifier;
38 import net.sf.jasperreports.engine.type.EvaluationTimeEnum;
39
40 /**
41  * 
42  * @author Teodor Danciu (teodord@users.sourceforge.net)
43  */

44 public class MapCompiler implements ComponentCompiler
45 {
46     
47     private final static Map<String,String> addressMap = new HashMap<String,String>();
48     static {
49         addressMap.put(MapComponent.ITEM_PROPERTY_latitude, MapComponent.ITEM_PROPERTY_address);
50         addressMap.put(MapComponent.ITEM_PROPERTY_longitude, MapComponent.ITEM_PROPERTY_address);
51     }
52     
53     @Override
54     public void collectExpressions(Component component, JRExpressionCollector collector)
55     {
56         MapComponent map = (MapComponent) component;
57         collector.addExpression(map.getLatitudeExpression());
58         collector.addExpression(map.getLongitudeExpression());
59         collector.addExpression(map.getAddressExpression());
60         collector.addExpression(map.getZoomExpression());
61         collector.addExpression(map.getLanguageExpression());
62
63         List<ItemData> markerDataList = map.getMarkerDataList();
64         if(markerDataList != null && markerDataList.size() > 0) {
65             for(ItemData markerData : markerDataList){
66                 ItemCompiler.collectExpressions(markerData, collector);
67             }
68         }
69         List<ItemData> pathStyleList = map.getPathStyleList();
70         if(pathStyleList != null && pathStyleList.size() > 0) {
71             for(ItemData pathStyle : pathStyleList){
72                 ItemCompiler.collectExpressions(pathStyle, collector);
73             }
74         }
75         List<ItemData> pathDataList = map.getPathDataList();
76         if(pathDataList != null && pathDataList.size() > 0) {
77             for(ItemData pathData : pathDataList){
78                 ItemCompiler.collectExpressions(pathData, collector);
79             }
80         }
81     }
82
83     /**
84      * @deprecated Replaced by {@link ItemCompiler#collectExpressions(ItemData, JRExpressionCollector)}.
85      */

86     public static void collectExpressions(ItemData data, JRExpressionCollector collector)
87     {
88         ItemCompiler.collectExpressions(data, collector);
89     }
90
91     /**
92      * @deprecated Replaced by {@link ItemCompiler#collectExpressions(ItemData, JRExpressionCollector)}.
93      */

94     public static void collectExpressions(MarkerDataset dataset, JRExpressionCollector collector)
95     {
96         if(dataset != null)
97         {
98             JRExpressionCollector datasetCollector = collector;
99
100             JRDatasetRun datasetRun = dataset.getDatasetRun();
101             if (datasetRun != null)
102             {
103                 collector.collect(datasetRun);
104                 datasetCollector = collector.getDatasetCollector(datasetRun.getDatasetName());
105             }
106
107             List<Marker> markers = dataset.getMarkers();
108             if (markers != null && !markers.isEmpty())
109             {
110                 for(Marker marker : markers)
111                 {
112                     List<MarkerProperty> markerProperties = marker.getProperties();
113                     if(markerProperties != null)
114                     {
115                         for(MarkerProperty property : markerProperties)
116                         {
117                             datasetCollector.addExpression(property.getValueExpression());
118                         }
119                     }
120                 }
121             }
122         }
123     }
124
125     @Override
126     public Component toCompiledComponent(Component component,
127             JRBaseObjectFactory baseFactory)
128     {
129         MapComponent map = (MapComponent) component;
130         return new StandardMapComponent(map, baseFactory);
131     }
132
133     @Override
134     public void verify(Component component, JRVerifier verifier)
135     {
136         MapComponent map = (MapComponent) component;
137         
138         EvaluationTimeEnum evaluationTime = map.getEvaluationTime();
139         if (evaluationTime == EvaluationTimeEnum.AUTO)
140         {
141             verifier.addBrokenRule("Auto evaluation time is not supported for maps", map);
142         }
143         else if (evaluationTime == EvaluationTimeEnum.GROUP)
144         {
145             String evaluationGroup = map.getEvaluationGroup();
146             if (evaluationGroup == null || evaluationGroup.length() == 0)
147             {
148                 verifier.addBrokenRule("No evaluation group set for map", map);
149             }
150             else if (!verifier.getReportDesign().getGroupsMap().containsKey(evaluationGroup))
151             {
152                 verifier.addBrokenRule("Map evaluation group \"
153                         + evaluationGroup + " not found", map);
154             }
155         }
156         
157         if((map.getLatitudeExpression() == null || map.getLongitudeExpression() == null) && map.getAddressExpression() == null){
158             verifier.addBrokenRule("Missing the latitude and/or the longitude expression for the map center. Try to configure them properly, or configure the equivalent addressExpression for this map.", map);
159         }
160         
161         String[] reqNames = new String[]{MapComponent.ITEM_PROPERTY_latitude, MapComponent.ITEM_PROPERTY_longitude};
162         List<ItemData> markerDataList = map.getMarkerDataList();
163         if (markerDataList != null && markerDataList.size() > 0)
164         {
165             for(ItemData markerData : markerDataList){
166                 ItemCompiler.verifyItemData(verifier, markerData, MapComponent.ELEMENT_MARKER_DATA, reqNames, addressMap);
167             }
168         }
169         
170         List<ItemData> pathStyleList = map.getPathStyleList();
171         if (pathStyleList != null && pathStyleList.size() > 0)
172         {
173             for(ItemData pathStyle : pathStyleList){
174                 ItemCompiler.verifyItemData(verifier, pathStyle, MapComponent.ELEMENT_PATH_STYLE, new String[]{MapComponent.ITEM_PROPERTY_name}, null);
175             }
176         }
177         
178         List<ItemData> pathDataList = map.getPathDataList();
179         if (pathDataList != null && pathDataList.size() > 0)
180         {
181             for(ItemData pathData : pathDataList){
182                 ItemCompiler.verifyItemData(verifier, pathData, MapComponent.ELEMENT_PATH_DATA, reqNames, addressMap);
183             }
184         }
185     }
186     
187 }
188