reduce probability that EDIT GeoService test fails
[cdmlib.git] / cdmlib-ext / src / test / java / eu / etaxonomy / cdm / ext / geo / EditGeoServiceTest.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10
11 package eu.etaxonomy.cdm.ext.geo;
12
13 import static org.junit.Assert.assertTrue;
14
15 import java.awt.Color;
16 import java.io.IOException;
17 import java.io.InputStream;
18 import java.io.InputStreamReader;
19 import java.net.HttpURLConnection;
20 import java.net.MalformedURLException;
21 import java.net.URI;
22 import java.net.URISyntaxException;
23 import java.net.URL;
24 import java.util.ArrayList;
25 import java.util.HashMap;
26 import java.util.HashSet;
27 import java.util.List;
28 import java.util.Map;
29 import java.util.Set;
30 import java.util.UUID;
31
32 import org.apache.commons.lang.StringUtils;
33 import org.apache.http.client.ClientProtocolException;
34 import org.apache.log4j.Logger;
35 import org.junit.Before;
36 import org.junit.Test;
37 import org.unitils.spring.annotation.SpringBeanByType;
38
39 import eu.etaxonomy.cdm.api.service.ITermService;
40 import eu.etaxonomy.cdm.api.service.IVocabularyService;
41 import eu.etaxonomy.cdm.common.StreamUtils;
42 import eu.etaxonomy.cdm.common.UriUtils;
43 import eu.etaxonomy.cdm.model.common.DefinedTermBase;
44 import eu.etaxonomy.cdm.model.common.Language;
45 import eu.etaxonomy.cdm.model.common.TermType;
46 import eu.etaxonomy.cdm.model.common.TermVocabulary;
47 import eu.etaxonomy.cdm.model.description.AbsenceTerm;
48 import eu.etaxonomy.cdm.model.description.Distribution;
49 import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;
50 import eu.etaxonomy.cdm.model.description.PresenceTerm;
51 import eu.etaxonomy.cdm.model.location.NamedArea;
52 import eu.etaxonomy.cdm.model.location.NamedAreaLevel;
53 import eu.etaxonomy.cdm.model.location.NamedAreaType;
54 import eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao;
55 import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
56
57 /**
58 * @author a.mueller
59 * @created 08.10.2008
60 */
61 public class EditGeoServiceTest extends CdmTransactionalIntegrationTest {
62 private static final Logger logger = Logger.getLogger(EditGeoServiceTest.class);
63
64 private static final String EDIT_MAPSERVICE_URI_STING = "http://edit.africamuseum.be/edit_wp5/v1.2/rest_gen.php";
65 private static URI editMapServiceUri;
66
67 //@SpringBeanByType
68 private IDefinedTermDao termDao;
69
70 @SpringBeanByType
71 private ITermService termService;
72
73 @SpringBeanByType
74 private IVocabularyService vocabService;
75
76 @SpringBeanByType
77 private GeoServiceAreaAnnotatedMapping mapping;
78
79 @SpringBeanByType
80 private IEditGeoService editGeoService;
81 //
82 // /**
83 // * @throws java.lang.Exception
84 // */
85 // @BeforeClass
86 // public static void setUpBeforeClass() throws Exception {
87 // DefaultTermInitializer initializer = new DefaultTermInitializer();
88 // initializer.initialize();
89 // }
90
91 /**
92 * @throws java.lang.Exception
93 */
94 @Before
95 public void setUp() throws Exception {
96 EditGeoServiceUtilities.setTermDao(termDao);
97 System.setProperty("ONLY-A-TEST", "TRUE"); // allows EditGeoServiceUtilities to skip some line of code
98 editMapServiceUri = new URI(EDIT_MAPSERVICE_URI_STING);
99 }
100
101
102 //******************************************** TESTS**************
103 @Test
104 public void testGetWebServiceUrlTdwg() throws MalformedURLException, IOException {
105 //String webServiceUrl = "http://www.test.de/webservice";
106 Set<Distribution> distributions = new HashSet<Distribution>();
107 distributions.add(Distribution.NewInstance(termService.getAreaByTdwgAbbreviation("SPA"), PresenceTerm.PRESENT()));
108 distributions.add(Distribution.NewInstance(termService.getAreaByTdwgAbbreviation("GER"), PresenceTerm.INTRODUCED()));
109 distributions.add(Distribution.NewInstance(termService.getAreaByTdwgAbbreviation("14"), PresenceTerm.CULTIVATED()));
110 distributions.add(Distribution.NewInstance(termService.getAreaByTdwgAbbreviation("BGM"), AbsenceTerm.ABSENT()));
111 distributions.add(Distribution.NewInstance(termService.getAreaByTdwgAbbreviation("FRA"), AbsenceTerm.ABSENT()));
112 distributions.add(Distribution.NewInstance(termService.getAreaByTdwgAbbreviation("IND-AP"), PresenceTerm.PRESENT()));
113
114 Map<PresenceAbsenceTermBase<?>, Color> presenceAbsenceColorMap = new HashMap<PresenceAbsenceTermBase<?>, Color>();
115 presenceAbsenceColorMap.put(PresenceTerm.PRESENT(), Color.BLUE);
116 presenceAbsenceColorMap.put(PresenceTerm.INTRODUCED(), Color.BLACK);
117 presenceAbsenceColorMap.put(PresenceTerm.CULTIVATED(), Color.YELLOW);
118 presenceAbsenceColorMap.put(AbsenceTerm.ABSENT(), Color.DARK_GRAY);
119 String backLayer ="";
120 presenceAbsenceColorMap = null;
121 String bbox="-20,0,120,70";
122 List<Language> languages = new ArrayList<Language>();
123
124 String result = EditGeoServiceUtilities.getDistributionServiceRequestParameterString(distributions, mapping, presenceAbsenceColorMap, 600, 300, bbox,backLayer, null, languages );
125 //TODO Set semantics is not determined
126 //String expected = "http://www.test.de/webservice?l=tdwg3&ad=tdwg3:a:GER|b:OKL|c:BGM|b:SPA|d:FRA&as=a:005500|b:00FF00|c:FFFFFF|d:001100&bbox=-20,40,40,40&ms=400x300";
127 System.out.println(result);
128 // assertTrue(result.matches(".*l=earth.*"));
129 assertTrue(result.matches(".*ms=600,300.*"));
130 assertTrue(result.matches(".*ad=tdwg[1-4].*"));
131 assertTrue(result.matches(".*tdwg2:[a-d]:14[\\|&].*") );
132 assertTrue(result.matches(".*[a-d]:FRA,BGM[\\|&].*") || result.matches(".*[a-d]:BGM,FRA[\\|&].*") );
133 assertTrue(result.matches(".*[a-d]:GER[\\|&].*") );
134 assertTrue(result.matches(".*[a-d]:SPA[\\|&].*") );
135 // assertTrue(result.matches(".*tdwg4:[a-d]:INDAP[\\|&].*") );
136 assertTrue(result.matches(".*tdwg4:[a-i]:INDAP[\\|&].*") );
137 //assertTrue(result.matches("0000ff"));
138 //TODO continue
139
140 // request map image from webservice
141 subTestWithEditMapService(result);
142 }
143
144 @Test
145 public void testGetWebServiceUrlCyprus() throws ClientProtocolException, IOException, URISyntaxException {
146 makeCyprusAreas();
147 Set<Distribution> distributions = new HashSet<Distribution>();
148 distributions.add(Distribution.NewInstance(divisions.get("1"), PresenceTerm.PRESENT()));
149 distributions.add(Distribution.NewInstance(divisions.get("2"), PresenceTerm.INTRODUCED()));
150 distributions.add(Distribution.NewInstance(divisions.get("3"), PresenceTerm.CULTIVATED()));
151 distributions.add(Distribution.NewInstance(divisions.get("4"), AbsenceTerm.ABSENT()));
152 distributions.add(Distribution.NewInstance(divisions.get("5"), AbsenceTerm.ABSENT()));
153 distributions.add(Distribution.NewInstance(divisions.get("6"), PresenceTerm.PRESENT()));
154
155 Map<PresenceAbsenceTermBase<?>, Color> presenceAbsenceColorMap = new HashMap<PresenceAbsenceTermBase<?>, Color>();
156 presenceAbsenceColorMap.put(PresenceTerm.PRESENT(), Color.BLUE);
157 presenceAbsenceColorMap.put(PresenceTerm.INTRODUCED(), Color.BLACK);
158 presenceAbsenceColorMap.put(PresenceTerm.CULTIVATED(), Color.YELLOW);
159 presenceAbsenceColorMap.put(AbsenceTerm.ABSENT(), Color.DARK_GRAY);
160 String backLayer ="";
161 presenceAbsenceColorMap = null;
162 String bbox="-20,0,120,70";
163 List<Language> languages = new ArrayList<Language>();
164
165 String result = EditGeoServiceUtilities.getDistributionServiceRequestParameterString(distributions, mapping, presenceAbsenceColorMap, 600, 300, bbox,backLayer, null, languages );
166 //TODO Set semantics is not determined
167 //String expected = "http://www.test.de/webservice?l=tdwg3&ad=tdwg3:a:GER|b:OKL|c:BGM|b:SPA|d:FRA&as=a:005500|b:00FF00|c:FFFFFF|d:001100&bbox=-20,40,40,40&ms=400x300";
168 // assertTrue(result.matches(".*l=earth.*"));
169 assertTrue(result.matches(".*ms=600,300.*"));
170 assertTrue(result.matches(".*ad=cyprusdivs%3Abdcode:.*"));
171 assertTrue(result.matches(".*[a-d]:5,4[\\|&].*") || result.matches(".*[a-d]:4,5[\\|&].*") );
172 assertTrue(result.matches(".*[a-d]:1,6[\\|&].*") || result.matches(".*[a-d]:6,1[\\|&].*") );
173 assertTrue(result.matches(".*[a-d]:2[\\|&].*") );
174 assertTrue(result.matches(".*[a-d]:3[\\|&].*") );
175
176 // request map image from webservice
177 subTestWithEditMapService(result);
178 }
179
180 private void subTestWithEditMapService(String result)throws MalformedURLException, IOException {
181 if(UriUtils.isServiceAvailable(editMapServiceUri)){
182 URL requestUrl = new URL(editMapServiceUri.toString() + "?img=false&" + result);
183 logger.debug("editMapServiceUri: " + requestUrl);
184 HttpURLConnection connection = (HttpURLConnection) requestUrl.openConnection();
185 connection.connect();
186 assertTrue(connection.getResponseCode() == 200);
187 InputStream contentStream = connection.getInputStream();
188 String content = StreamUtils.readToString(contentStream);
189 logger.debug("EditMapService response body:\n" + content);
190 assertTrue(content.startsWith("[{"));
191 assertTrue(content.endsWith("}]"));
192 assertTrue(content.matches(".*\"bbox\":.*"));
193 assertTrue(content.matches(".*\"legend\":.*"));
194 assertTrue(content.matches(".*\"layers\":.*"));
195 assertTrue(content.matches(".*\"sld\":.*"));
196 assertTrue(content.matches(".*\"geoserver\":.*"));
197 }
198 }
199
200 public static final UUID uuidCyprusDivisionsVocabulary = UUID.fromString("2119f610-1f93-4d87-af28-40aeefaca100");
201 private final Map<String, NamedArea> divisions = new HashMap<String, NamedArea>();
202
203 private boolean makeCyprusAreas() throws IOException {
204 //divisions
205
206
207 NamedAreaType areaType = NamedAreaType.NATURAL_AREA();
208 NamedAreaLevel areaLevel = NamedAreaLevel.NewInstance("Cyprus Division", "Cyprus Division", null);
209
210 termService.saveOrUpdate(areaLevel);
211
212 TermVocabulary<NamedArea> areaVocabulary = TermVocabulary.NewInstance(TermType.NamedArea, "Cyprus devisions", "Cyprus divisions", null, null);
213 areaVocabulary.setUuid(uuidCyprusDivisionsVocabulary);
214
215
216 for(int i = 1; i <= 8; i++){
217 UUID divisionUuid = getNamedAreaUuid(String.valueOf(i));
218 NamedArea division = this.newNamedArea(
219 divisionUuid,
220 "Division " + i,
221 "Cyprus: Division " + i,
222 String.valueOf(i), // id in vocab
223 areaType,
224 areaLevel,
225 areaVocabulary);
226 divisions.put(String.valueOf(i), division);
227 }
228
229 vocabService.saveOrUpdate(areaVocabulary);
230 commitAndStartNewTransaction(null);
231
232
233 // import and map shapefile attributes from csv
234 InputStream is = getClass().getClassLoader().getResourceAsStream("eu/etaxonomy/cdm/ext/geo/cyprusdivs.csv");
235 List<String> idSearchFields = new ArrayList<String>();
236 idSearchFields.add("bdcode");
237 String wmsLayerName = "cyprusdivs";
238 editGeoService.mapShapeFileToNamedAreas(new InputStreamReader(is), idSearchFields, wmsLayerName, uuidCyprusDivisionsVocabulary, null);
239
240 divisions.clear();
241 Set<DefinedTermBase> terms = vocabService.load(uuidCyprusDivisionsVocabulary).getTerms();
242 for(DefinedTermBase dtb : terms){
243 divisions.put(dtb.getIdInVocabulary(), (NamedArea) dtb);
244 }
245
246
247 // indigenousStatus = (PresenceTerm)getTermService().find(CyprusTransformer.indigenousUuid);
248 // casualStatus = (PresenceTerm)getTermService().find(CyprusTransformer.casualUuid);
249 // nonInvasiveStatus = (PresenceTerm)getTermService().find(CyprusTransformer.nonInvasiveUuid);
250 // invasiveStatus = (PresenceTerm)getTermService().find(CyprusTransformer.invasiveUuid);
251 // questionableStatus = (PresenceTerm)getTermService().find(CyprusTransformer.questionableUuid);
252
253 return true;
254
255
256 }
257
258 public static final UUID uuidDivision1 = UUID.fromString("ab17eee9-1abb-4ce9-a9a2-563f840cdbfc");
259 public static final UUID uuidDivision2 = UUID.fromString("c3606165-efb7-4224-a168-63e009eb4aa5");
260 public static final UUID uuidDivision3 = UUID.fromString("750d4e07-e34b-491f-a7b7-09723afdc960");
261 public static final UUID uuidDivision4 = UUID.fromString("8a858922-e8e5-4791-ad53-906e50633ec7");
262 public static final UUID uuidDivision5 = UUID.fromString("16057133-d541-4ebd-81d4-cb92265ec54c");
263 public static final UUID uuidDivision6 = UUID.fromString("fbf21230-4a42-4f4c-9af8-5da52123c264");
264 public static final UUID uuidDivision7 = UUID.fromString("d31dd96a-36ea-4428-871c-d8552a9565ca");
265 public static final UUID uuidDivision8 = UUID.fromString("236ea447-c3ab-486d-9e06-cc5907861acc");
266
267
268 public UUID getNamedAreaUuid(String key) {
269 if (StringUtils.isBlank(key)){return null;
270 }else if (key.equalsIgnoreCase("1")){return uuidDivision1;
271 }else if (key.equalsIgnoreCase("2")){return uuidDivision2;
272 }else if (key.equalsIgnoreCase("3")){return uuidDivision3;
273 }else if (key.equalsIgnoreCase("4")){return uuidDivision4;
274 }else if (key.equalsIgnoreCase("5")){return uuidDivision5;
275 }else if (key.equalsIgnoreCase("6")){return uuidDivision6;
276 }else if (key.equalsIgnoreCase("7")){return uuidDivision7;
277 }else if (key.equalsIgnoreCase("8")){return uuidDivision8;
278 }else{
279 return null;
280 }
281 }
282
283 protected NamedArea newNamedArea(UUID uuid, String label, String text, String IdInVocabulary, NamedAreaType areaType, NamedAreaLevel level, TermVocabulary<NamedArea> voc){
284 NamedArea namedArea = NamedArea.NewInstance(text, label, null);
285 voc.addTerm(namedArea);
286 namedArea.setType(areaType);
287 namedArea.setLevel(level);
288 namedArea.setUuid(uuid);
289 namedArea.setIdInVocabulary(IdInVocabulary);
290 return namedArea;
291 }
292
293 @Test
294 public void testGetWebServiceUrlBangka() throws ClientProtocolException, IOException, URISyntaxException {
295 NamedArea areaBangka = NamedArea.NewInstance("Bangka", "Bangka", null);
296 TermVocabulary<NamedArea> voc = TermVocabulary.NewInstance(TermType.NamedArea, "test Voc", "test voc", null, null);
297 voc.addTerm(areaBangka);
298
299 GeoServiceArea geoServiceArea = new GeoServiceArea();
300 String geoServiceLayer="vmap0_as_bnd_political_boundary_a";
301 String layerFieldName ="nam";
302 String areaValue = "PULAU BANGKA#SUMATERA SELATAN";
303 geoServiceArea.add(geoServiceLayer, layerFieldName, areaValue);
304 geoServiceArea.add(geoServiceLayer, layerFieldName, "BALI");
305
306 mapping.set(areaBangka, geoServiceArea);
307 Set<Distribution> distributions = new HashSet<Distribution>();
308 distributions.add(Distribution.NewInstance(areaBangka, PresenceTerm.PRESENT()));
309
310 Map<PresenceAbsenceTermBase<?>, Color> presenceAbsenceColorMap = new HashMap<PresenceAbsenceTermBase<?>, Color>();
311 presenceAbsenceColorMap.put(PresenceTerm.PRESENT(), Color.BLUE);
312
313 String backLayer ="";
314 presenceAbsenceColorMap = null;
315 String bbox="90,-8,130,8";
316 List<Language> languages = new ArrayList<Language>();
317
318 String result = EditGeoServiceUtilities.getDistributionServiceRequestParameterString(distributions, mapping, presenceAbsenceColorMap, 600, 300, bbox,backLayer, null, languages );
319 //TODO Set semantics is not determined
320 //String expected = "http://www.test.de/webservice?l=tdwg3&ad=tdwg3:a:GER|b:OKL|c:BGM|b:SPA|d:FRA&as=a:005500|b:00FF00|c:FFFFFF|d:001100&bbox=-20,40,40,40&ms=400x300";
321
322 System.out.println(result);
323
324 // assertTrue(result.matches(".*l=earth.*"));
325 assertTrue(result.matches(".*ms=600,300.*"));
326 assertTrue(result.matches(".*ad=vmap0_as_bnd_political_boundary_a%3Anam:.*"));
327 assertTrue(result.matches(".*(PULAU\\+BANGKA%23SUMATERA\\+SELATAN).*") );
328 assertTrue(result.matches(".*(BALI).*") );
329
330 // request map image from webservice
331 subTestWithEditMapService(result);
332 }
333
334
335 }