ref #10222 fix EditGeoService issue by moving test files to correct folder
[cdmlib.git] / cdmlib-services / src / test / java / eu / etaxonomy / cdm / api / service / geo / EditGeoServiceTest.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9 package eu.etaxonomy.cdm.api.service.geo;
10
11 import static org.junit.Assert.assertTrue;
12
13 import java.awt.Color;
14 import java.io.FileNotFoundException;
15 import java.io.IOException;
16 import java.io.InputStream;
17 import java.io.InputStreamReader;
18 import java.net.HttpURLConnection;
19 import java.net.MalformedURLException;
20 import java.net.URL;
21 import java.util.ArrayList;
22 import java.util.Collection;
23 import java.util.HashMap;
24 import java.util.HashSet;
25 import java.util.List;
26 import java.util.Map;
27 import java.util.Set;
28 import java.util.UUID;
29
30 import org.apache.commons.lang3.StringUtils;
31 import org.apache.http.client.ClientProtocolException;
32 import org.apache.logging.log4j.LogManager;
33 import org.apache.logging.log4j.Logger;
34 import org.junit.Assert;
35 import org.junit.Before;
36 import org.junit.Test;
37 import org.unitils.dbunit.annotation.DataSet;
38 import org.unitils.spring.annotation.SpringBeanByType;
39
40 import eu.etaxonomy.cdm.api.service.ITaxonService;
41 import eu.etaxonomy.cdm.api.service.ITermService;
42 import eu.etaxonomy.cdm.api.service.IVocabularyService;
43 import eu.etaxonomy.cdm.api.util.DescriptionUtility;
44 import eu.etaxonomy.cdm.common.StreamUtils;
45 import eu.etaxonomy.cdm.common.URI;
46 import eu.etaxonomy.cdm.common.UriUtils;
47 import eu.etaxonomy.cdm.model.common.CdmBase;
48 import eu.etaxonomy.cdm.model.common.Language;
49 import eu.etaxonomy.cdm.model.common.MarkerType;
50 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
51 import eu.etaxonomy.cdm.model.description.Distribution;
52 import eu.etaxonomy.cdm.model.description.Feature;
53 import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
54 import eu.etaxonomy.cdm.model.description.TaxonDescription;
55 import eu.etaxonomy.cdm.model.location.Country;
56 import eu.etaxonomy.cdm.model.location.NamedArea;
57 import eu.etaxonomy.cdm.model.location.NamedAreaLevel;
58 import eu.etaxonomy.cdm.model.location.NamedAreaType;
59 import eu.etaxonomy.cdm.model.taxon.Taxon;
60 import eu.etaxonomy.cdm.model.term.DefinedTermBase;
61 import eu.etaxonomy.cdm.model.term.TermType;
62 import eu.etaxonomy.cdm.model.term.TermVocabulary;
63 import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
64
65 /**
66 * @author a.mueller
67 * @since 08.10.2008
68 */
69 public class EditGeoServiceTest extends CdmTransactionalIntegrationTest {
70
71 private static final Logger logger = LogManager.getLogger();
72
73 private static final String EDIT_MAPSERVICE_URI_STRING = "https://edit.africamuseum.be/edit_wp5/v1.2/rest_gen.php";
74 private static URI editMapServiceUri;
75
76 @SpringBeanByType
77 private ITermService termService;
78
79 @SpringBeanByType
80 private IVocabularyService vocabService;
81
82 @SpringBeanByType
83 private GeoServiceAreaAnnotatedMapping mapping;
84
85 @SpringBeanByType
86 private IDistributionService editGeoService;
87
88 @SpringBeanByType
89 private ITaxonService taxonService ;
90
91 @Before
92 public void setUp() throws Exception {
93 System.setProperty("ONLY-A-TEST", "TRUE"); // allows EditGeoServiceUtilities to skip some line of code
94 editMapServiceUri = new URI(EDIT_MAPSERVICE_URI_STRING);
95 }
96
97 //******************************************** TESTS**************
98
99 @Test
100 public void testGetWebServiceUrlCountry() {
101 Set<Distribution> distributions = new HashSet<>();
102 Country germany = termService.findByIdInVocabulary("DEU", Country.uuidCountryVocabulary, Country.class);
103
104 distributions.add(Distribution.NewInstance(germany, PresenceAbsenceTerm.PRESENT()));
105 distributions.add(Distribution.NewInstance(termService.findByIdInVocabulary("DE", Country.uuidCountryVocabulary, Country.class), PresenceAbsenceTerm.INTRODUCED()));
106 Map<PresenceAbsenceTerm, Color> presenceAbsenceColorMap = new HashMap<>();
107 presenceAbsenceColorMap.put(PresenceAbsenceTerm.PRESENT(), Color.BLUE);
108 presenceAbsenceColorMap.put(PresenceAbsenceTerm.INTRODUCED(), Color.BLACK);
109 List<Language> languages = new ArrayList<>();
110
111 boolean subAreaPreference = false;
112 boolean statusOrderPreference = false;
113
114 Collection<Distribution> filteredDistributions = DescriptionUtility.filterDistributions(
115 distributions, null, false, statusOrderPreference, subAreaPreference, true, false);
116
117 String result = DistributionServiceUtilities.getDistributionServiceRequestParameterString(filteredDistributions,
118 mapping, null, null, languages );
119 logger.warn(result);
120 Assert.assertTrue("WebServiceUrl must contain country part for Germany", result.matches(".*ad=country_earth(%3A|:)gmi_cntry:.:DEU.*"));
121 }
122
123 @Test
124 public void testGetWebServiceUrlTdwg() throws MalformedURLException, IOException {
125 //String webServiceUrl = "http://www.test.de/webservice";
126 Set<Distribution> distributions = new HashSet<>();
127 distributions.add(Distribution.NewInstance(termService.getAreaByTdwgAbbreviation("SPA"), PresenceAbsenceTerm.PRESENT()));
128 distributions.add(Distribution.NewInstance(termService.getAreaByTdwgAbbreviation("GER"), PresenceAbsenceTerm.INTRODUCED()));
129 distributions.add(Distribution.NewInstance(termService.getAreaByTdwgAbbreviation("14"), PresenceAbsenceTerm.CULTIVATED()));
130 distributions.add(Distribution.NewInstance(termService.getAreaByTdwgAbbreviation("BGM"), PresenceAbsenceTerm.ABSENT()));
131 distributions.add(Distribution.NewInstance(termService.getAreaByTdwgAbbreviation("FRA"), PresenceAbsenceTerm.ABSENT()));
132 distributions.add(Distribution.NewInstance(termService.getAreaByTdwgAbbreviation("IND-AP"), PresenceAbsenceTerm.PRESENT()));
133
134 Map<PresenceAbsenceTerm, Color> presenceAbsenceColorMap = new HashMap<>();
135 presenceAbsenceColorMap.put(PresenceAbsenceTerm.PRESENT(), Color.BLUE);
136 presenceAbsenceColorMap.put(PresenceAbsenceTerm.INTRODUCED(), Color.BLACK);
137 presenceAbsenceColorMap.put(PresenceAbsenceTerm.CULTIVATED(), Color.YELLOW);
138 presenceAbsenceColorMap.put(PresenceAbsenceTerm.ABSENT(), Color.DARK_GRAY);
139 // String backLayer ="";
140 presenceAbsenceColorMap = null;
141 // String bbox="-20,0,120,70";
142 List<Language> languages = new ArrayList<>();
143
144 // boolean subAreaPreference = false;
145 // boolean statusOrderPreference = false;
146 String result = DistributionServiceUtilities.getDistributionServiceRequestParameterString(
147 distributions,
148 mapping,
149 null, // presenceAbsenceTermColors
150 null, // projectToLayer
151 languages );
152 //TODO Set semantics is not determined
153 //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";
154 logger.debug(result);
155 assertTrue(result.matches(".*ad=tdwg[1-4].*"));
156 assertTrue(result.matches(".*tdwg2:[a-d]:14[\\|&].*") );
157 assertTrue(result.matches(".*[a-d]:FRA,BGM[\\|&].*") || result.matches(".*[a-d]:BGM,FRA[\\|&].*") );
158 assertTrue(result.matches(".*[a-d]:GER[\\|&].*") );
159 assertTrue(result.matches(".*[a-d]:SPA[\\|&].*") );
160 assertTrue(result.matches(".*tdwg4:[a-d]:INDAP[\\|&].*") );
161 //assertTrue(result.matches("0000ff"));
162 //TODO continue
163
164 // request map image from webservice
165 subTestWithEditMapService(result);
166 }
167
168 @Test
169 public void testGetWebServiceUrlCyprus() throws ClientProtocolException, IOException {
170 makeCyprusAreas();
171 Set<Distribution> distributions = new HashSet<>();
172 distributions.add(Distribution.NewInstance(divisions.get("1"), PresenceAbsenceTerm.PRESENT()));
173 distributions.add(Distribution.NewInstance(divisions.get("2"), PresenceAbsenceTerm.INTRODUCED()));
174 distributions.add(Distribution.NewInstance(divisions.get("3"), PresenceAbsenceTerm.CULTIVATED()));
175 distributions.add(Distribution.NewInstance(divisions.get("4"), PresenceAbsenceTerm.ABSENT()));
176 distributions.add(Distribution.NewInstance(divisions.get("5"), PresenceAbsenceTerm.ABSENT()));
177 distributions.add(Distribution.NewInstance(divisions.get("6"), PresenceAbsenceTerm.PRESENT()));
178
179 Map<PresenceAbsenceTerm, Color> presenceAbsenceColorMap = new HashMap<>();
180 presenceAbsenceColorMap.put(PresenceAbsenceTerm.PRESENT(), Color.BLUE);
181 presenceAbsenceColorMap.put(PresenceAbsenceTerm.INTRODUCED(), Color.BLACK);
182 presenceAbsenceColorMap.put(PresenceAbsenceTerm.CULTIVATED(), Color.YELLOW);
183 presenceAbsenceColorMap.put(PresenceAbsenceTerm.ABSENT(), Color.DARK_GRAY);
184 presenceAbsenceColorMap = null;
185 List<Language> languages = new ArrayList<>();
186
187 String result = DistributionServiceUtilities.getDistributionServiceRequestParameterString(
188 distributions,
189 mapping,
190 null, null, languages );
191 //TODO Set semantics is not determined
192 //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";
193 assertTrue(result.matches(".*ad=cyprusdivs%3Abdcode:.*"));
194 assertTrue(result.matches(".*[a-d]:5,4[\\|&].*") || result.matches(".*[a-d]:4,5[\\|&].*") );
195 assertTrue(result.matches(".*[a-d]:1,6[\\|&].*") || result.matches(".*[a-d]:6,1[\\|&].*") );
196 assertTrue(result.matches(".*[a-d]:2[\\|&].*") );
197 assertTrue(result.matches(".*[a-d]:3[\\|&].*") );
198
199 // request map image from webservice
200 subTestWithEditMapService(result);
201 }
202
203 private void subTestWithEditMapService(String queryString)throws MalformedURLException, IOException {
204 if(UriUtils.isServiceAvailable(editMapServiceUri)){
205 URL requestUrl = new URL(editMapServiceUri.toString() + "?img=false&bbox=-180,-90,180,90&ms=1000&" + queryString);
206 logger.debug("editMapServiceUri: " + requestUrl);
207 HttpURLConnection connection = (HttpURLConnection) requestUrl.openConnection();
208 connection.connect();
209 // connection.setReadTimeout(10000); //timeout after 10 sec, does not seem to work
210 assertTrue(connection.getResponseCode() == 200);
211 InputStream contentStream = connection.getInputStream();
212 String content = StreamUtils.readToString(contentStream);
213 logger.debug("EditMapService response body:\n" + content);
214 assertTrue(content.startsWith("[{"));
215 assertTrue(content.endsWith("}]"));
216 assertTrue(content.matches(".*\"bbox\":.*"));
217 assertTrue(content.matches(".*\"legend\":.*"));
218 assertTrue(content.matches(".*\"layers\":.*"));
219 assertTrue(content.matches(".*\"sld\":.*"));
220 assertTrue(content.matches(".*\"geoserver\":.*"));
221 }
222 }
223
224 public static final UUID uuidCyprusDivisionsVocabulary = UUID.fromString("2119f610-1f93-4d87-af28-40aeefaca100");
225 private final Map<String, NamedArea> divisions = new HashMap<>();
226
227 private boolean makeCyprusAreas() throws IOException {
228 //divisions
229
230 NamedAreaType areaType = NamedAreaType.NATURAL_AREA();
231 NamedAreaLevel areaLevel = NamedAreaLevel.NewInstance("Cyprus Division", "Cyprus Division", null);
232
233 termService.saveOrUpdate(areaLevel);
234
235 TermVocabulary<NamedArea> areaVocabulary = TermVocabulary.NewInstance(TermType.NamedArea,
236 NamedArea.class, "Cyprus devisions", "Cyprus divisions", null, null);
237 areaVocabulary.setUuid(uuidCyprusDivisionsVocabulary);
238
239 for(int i = 1; i <= 8; i++){
240 UUID divisionUuid = getNamedAreaUuid(String.valueOf(i));
241 NamedArea division = this.newNamedArea(
242 divisionUuid,
243 "Division " + i,
244 "Cyprus: Division " + i,
245 String.valueOf(i), // id in vocab
246 areaType,
247 areaLevel,
248 areaVocabulary);
249 divisions.put(String.valueOf(i), division);
250 }
251
252 vocabService.saveOrUpdate(areaVocabulary);
253 commitAndStartNewTransaction(null);
254
255 // import and map shapefile attributes from csv
256 InputStream is = getClass().getClassLoader().getResourceAsStream("eu/etaxonomy/cdm/api/service/geo/cyprusdivs.csv");
257 List<String> idSearchFields = new ArrayList<String>();
258 idSearchFields.add("bdcode");
259 String wmsLayerName = "cyprusdivs";
260 editGeoService.mapShapeFileToNamedAreas(new InputStreamReader(is), idSearchFields, wmsLayerName, uuidCyprusDivisionsVocabulary, null);
261
262 divisions.clear();
263 Set<DefinedTermBase> terms = vocabService.load(uuidCyprusDivisionsVocabulary).getTerms();
264 for(DefinedTermBase<?> dtb : terms){
265 divisions.put(dtb.getIdInVocabulary(), (NamedArea) dtb);
266 }
267
268 // indigenousStatus = (PresenceTerm)getTermService().find(CyprusTransformer.indigenousUuid);
269 // casualStatus = (PresenceTerm)getTermService().find(CyprusTransformer.casualUuid);
270 // nonInvasiveStatus = (PresenceTerm)getTermService().find(CyprusTransformer.nonInvasiveUuid);
271 // invasiveStatus = (PresenceTerm)getTermService().find(CyprusTransformer.invasiveUuid);
272 // questionableStatus = (PresenceTerm)getTermService().find(CyprusTransformer.questionableUuid);
273
274 return true;
275 }
276
277 public static final UUID uuidDivision1 = UUID.fromString("ab17eee9-1abb-4ce9-a9a2-563f840cdbfc");
278 public static final UUID uuidDivision2 = UUID.fromString("c3606165-efb7-4224-a168-63e009eb4aa5");
279 public static final UUID uuidDivision3 = UUID.fromString("750d4e07-e34b-491f-a7b7-09723afdc960");
280 public static final UUID uuidDivision4 = UUID.fromString("8a858922-e8e5-4791-ad53-906e50633ec7");
281 public static final UUID uuidDivision5 = UUID.fromString("16057133-d541-4ebd-81d4-cb92265ec54c");
282 public static final UUID uuidDivision6 = UUID.fromString("fbf21230-4a42-4f4c-9af8-5da52123c264");
283 public static final UUID uuidDivision7 = UUID.fromString("d31dd96a-36ea-4428-871c-d8552a9565ca");
284 public static final UUID uuidDivision8 = UUID.fromString("236ea447-c3ab-486d-9e06-cc5907861acc");
285
286 public UUID getNamedAreaUuid(String key) {
287 if (StringUtils.isBlank(key)){return null;
288 }else if (key.equalsIgnoreCase("1")){return uuidDivision1;
289 }else if (key.equalsIgnoreCase("2")){return uuidDivision2;
290 }else if (key.equalsIgnoreCase("3")){return uuidDivision3;
291 }else if (key.equalsIgnoreCase("4")){return uuidDivision4;
292 }else if (key.equalsIgnoreCase("5")){return uuidDivision5;
293 }else if (key.equalsIgnoreCase("6")){return uuidDivision6;
294 }else if (key.equalsIgnoreCase("7")){return uuidDivision7;
295 }else if (key.equalsIgnoreCase("8")){return uuidDivision8;
296 }else{
297 return null;
298 }
299 }
300
301 protected NamedArea newNamedArea(UUID uuid, String label, String text, String IdInVocabulary, NamedAreaType areaType, NamedAreaLevel level, TermVocabulary<NamedArea> voc){
302 NamedArea namedArea = NamedArea.NewInstance(text, label, null);
303 voc.addTerm(namedArea);
304 namedArea.setType(areaType);
305 namedArea.setLevel(level);
306 namedArea.setUuid(uuid);
307 namedArea.setIdInVocabulary(IdInVocabulary);
308 return namedArea;
309 }
310
311 @Test
312 public void testGetWebServiceUrlBangka() throws ClientProtocolException, IOException {
313 NamedArea areaBangka = NamedArea.NewInstance("Bangka", "Bangka", null);
314 TermVocabulary<NamedArea> voc = TermVocabulary.NewInstance(TermType.NamedArea,
315 NamedArea.class, "test Voc", "test voc", null, null);
316 voc.addTerm(areaBangka);
317
318 GeoServiceArea geoServiceArea = new GeoServiceArea();
319 String geoServiceLayer="vmap0_as_bnd_political_boundary_a";
320 String layerFieldName ="nam";
321 String areaValue = "PULAU BANGKA#SUMATERA SELATAN";
322 geoServiceArea.add(geoServiceLayer, layerFieldName, areaValue);
323 geoServiceArea.add(geoServiceLayer, layerFieldName, "BALI");
324
325 mapping.set(areaBangka, geoServiceArea);
326 Set<Distribution> distributions = new HashSet<>();
327 distributions.add(Distribution.NewInstance(areaBangka, PresenceAbsenceTerm.PRESENT()));
328
329 Map<PresenceAbsenceTerm, Color> presenceAbsenceColorMap = new HashMap<>();
330 presenceAbsenceColorMap.put(PresenceAbsenceTerm.PRESENT(), Color.BLUE);
331
332 presenceAbsenceColorMap = null;
333 List<Language> languages = new ArrayList<>();
334
335 String result = DistributionServiceUtilities.getDistributionServiceRequestParameterString(distributions,
336 mapping,
337 null, null, languages );
338 //TODO Set semantics is not determined
339 //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";
340
341 logger.debug(result);
342 assertTrue(result.matches(".*ad=vmap0_as_bnd_political_boundary_a%3Anam:.*"));
343 assertTrue(result.matches(".*(PULAU\\+BANGKA%23SUMATERA\\+SELATAN).*") );
344 assertTrue(result.matches(".*(BALI).*") );
345
346 // request map image from webservice
347 subTestWithEditMapService(result);
348 }
349
350 @SuppressWarnings("deprecation")
351 // @Test
352 @DataSet( value="EditGeoServiceTest.getDistributionServiceRequestParameterString.xml")
353 // @DataSets({
354 // @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="/eu/etaxonomy/cdm/database/ClearDB_with_Terms_DataSet.xml"),
355 // @DataSet("/eu/etaxonomy/cdm/database/TermsDataSet-with_auditing_info.xml"),
356 // @DataSet( value="EditGeoServiceTest.getDistributionServiceRequestParameterString.xml")
357 // })
358 public void getDistributionServiceRequestParameterString(){
359 boolean subAreaPreference = false;
360 boolean statusOrderPreference = false;
361 Set<MarkerType> hideMarkedAreas = null;
362 Map<PresenceAbsenceTerm, Color> presenceAbsenceTermColors = null;
363 List<Language> langs = null;
364
365 List<TaxonDescription> taxonDescriptions = new ArrayList<>();
366 TaxonDescription description1 = TaxonDescription.NewInstance();
367 taxonDescriptions.add(description1);
368 Distribution distribution1 = Distribution.NewInstance(Country.GERMANY(), null);
369 description1.addElement(distribution1);
370 Distribution distribution2 = Distribution.NewInstance(Country.FRANCE(), null);
371 distribution2.setFeature(Feature.COMMON_NAME());
372 description1.addElement(distribution2);
373
374 Taxon taxon = (Taxon)taxonService.find(UUID.fromString("7598f5d4-1cf2-4269-ae99-2adb79ae167c"));
375 TaxonDescription taxDesc = taxon.getDescriptions().iterator().next();
376 for (DescriptionElementBase deb : taxDesc.getElements()){
377 Distribution distribution = CdmBase.deproxy(deb, Distribution.class);
378 NamedArea area = distribution.getArea();
379 System.out.println(area.getTitleCache());
380 }
381 taxonDescriptions.addAll(taxon.getDescriptions());
382
383 String distributions = editGeoService.getDistributionServiceRequestParameterString(taxonDescriptions,
384 subAreaPreference, statusOrderPreference, hideMarkedAreas, presenceAbsenceTermColors, langs);
385 System.out.println(distributions);
386 Assert.assertTrue("Distribution string should contain the non-persited distribution Germany", distributions.contains("DEU"));
387 Assert.assertFalse("Distribution string should contain France as it has a non-distribution feature", distributions.contains("FRA"));
388 // CHE,POL
389 }
390
391 @Override
392 // @Test
393 public void createTestDataSet() throws FileNotFoundException {
394
395 List<TaxonDescription> taxonDescriptions = new ArrayList<>();
396 TaxonDescription description1 = TaxonDescription.NewInstance();
397 taxonDescriptions.add(description1);
398 Distribution distribution1 = Distribution.NewInstance(Country.POLANDPOLISHPEOPLESREPUBLIC(), null);
399 description1.addElement(distribution1);
400 Distribution distribution2 = Distribution.NewInstance(Country.SWITZERLANDSWISSCONFEDERATION(), null);
401 // distribution2.setFeature(Feature.COMMON_NAME());
402 description1.addElement(distribution2);
403 Taxon taxon = Taxon.NewInstance(null, null);
404 taxon.setTitleCache("Dummy taxon", true);
405 taxon.addDescription(description1);
406 taxon.setUuid(UUID.fromString("7598f5d4-1cf2-4269-ae99-2adb79ae167c"));
407
408 taxonService.save(taxon);
409
410 setComplete();
411 endTransaction();
412
413 writeDbUnitDataSetFile(new String[] {
414 "TAXONBASE",
415 "DESCRIPTIONBASE", "DESCRIPTIONELEMENTBASE",
416 "HIBERNATE_SEQUENCES" // IMPORTANT!!!
417 },
418 "getDistributionServiceRequestParameterString", true );
419 }
420 }