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