1
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
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
86 public static void collectExpressions(ItemData data, JRExpressionCollector collector)
87 {
88 ItemCompiler.collectExpressions(data, collector);
89 }
90
91
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