commit after merge from trunc
[cdmlib.git] / cdmlib-ext / src / main / java / eu / etaxonomy / cdm / ext / geo / EditGeoService.java
1 // $Id$
2 /**
3 * Copyright (C) 2009 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 package eu.etaxonomy.cdm.ext.geo;
11
12 import java.awt.Color;
13 import java.io.IOException;
14 import java.io.Reader;
15 import java.util.ArrayList;
16 import java.util.HashSet;
17 import java.util.List;
18 import java.util.Map;
19 import java.util.Set;
20 import java.util.UUID;
21
22 import org.apache.log4j.Logger;
23 import org.springframework.beans.factory.annotation.Autowired;
24 import org.springframework.stereotype.Service;
25 import org.springframework.transaction.annotation.Transactional;
26
27 import eu.etaxonomy.cdm.model.common.Language;
28 import eu.etaxonomy.cdm.model.common.TermVocabulary;
29 import eu.etaxonomy.cdm.model.description.Distribution;
30 import eu.etaxonomy.cdm.model.description.Feature;
31 import eu.etaxonomy.cdm.model.description.IndividualsAssociation;
32 import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;
33 import eu.etaxonomy.cdm.model.description.TaxonDescription;
34 import eu.etaxonomy.cdm.model.location.NamedArea;
35 import eu.etaxonomy.cdm.model.location.Point;
36 import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
37 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
38 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
39 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
40 import eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao;
41 import eu.etaxonomy.cdm.persistence.dao.common.ITermVocabularyDao;
42 import eu.etaxonomy.cdm.persistence.dao.description.IDescriptionDao;
43 import eu.etaxonomy.cdm.persistence.dao.occurrence.IOccurrenceDao;
44
45 /**
46 * @author a.kohlbecker
47 * @date 18.06.2009
48 *
49 */
50 @Service
51 @Transactional(readOnly = true)
52 public class EditGeoService implements IEditGeoService {
53 public static final Logger logger = Logger.getLogger(EditGeoService.class);
54
55 // private static final String DEFAULT_BACK_LAYER = "tdwg4";
56
57 @Autowired
58 private IDescriptionDao dao;
59
60 @Autowired
61 private IGeoServiceAreaMapping areaMapping;
62
63 private IDefinedTermDao termDao;
64
65 @Autowired
66 private ITermVocabularyDao vocabDao;
67
68 @Autowired
69 public void setTermDao(IDefinedTermDao termDao) {
70 this.termDao = termDao;
71 EditGeoServiceUtilities.setTermDao(termDao);
72 }
73
74 @Autowired
75 private IOccurrenceDao occurrenceDao;
76
77 private Set<Feature> getDistributionFeatures() {
78 Set<Feature> distributionFeature = new HashSet<Feature>();
79 Feature feature = (Feature) termDao.findByUuid(Feature.DISTRIBUTION().getUuid());
80 distributionFeature.add(feature);
81 return distributionFeature;
82 }
83
84 /*
85 * (non-Javadoc)
86 *
87 * @see
88 * eu.etaxonomy.cdm.ext.IEditGeoService#getEditGeoServiceUrlParameterString
89 * (java.util.List, java.util.Map, int, int, java.lang.String,
90 * java.lang.String, java.util.List)
91 */
92 @Override
93 public String getDistributionServiceRequestParameterString(List<TaxonDescription> taxonDescriptions,
94 Map<PresenceAbsenceTermBase<?>, Color> presenceAbsenceTermColors, int width, int height, String bbox,
95 String backLayer, List<Language> langs) {
96
97 Set<Distribution> distributions = new HashSet<Distribution>();
98 for (TaxonDescription taxonDescription : taxonDescriptions) {
99 List<Distribution> result = (List) dao.getDescriptionElements(
100 taxonDescription, null,
101 getDistributionFeatures(),
102 Distribution.class,
103 null,
104 null,
105 null);
106 distributions.addAll(result);
107 }
108
109 String uriParams = getDistributionServiceRequestParameterString(distributions, presenceAbsenceTermColors,
110 width, height, bbox, backLayer, langs);
111
112 return uriParams;
113 }
114
115
116 /* (non-Javadoc)
117 * @see eu.etaxonomy.cdm.ext.geo.IEditGeoService#getDistributionServiceRequestParameterString(java.util.Set, java.util.Map, int, int, java.lang.String, java.lang.String, java.util.List)
118 */
119 @Override
120 public String getDistributionServiceRequestParameterString(Set<Distribution> distributions,
121 Map<PresenceAbsenceTermBase<?>, Color> presenceAbsenceTermColors, int width, int height, String bbox,
122 String backLayer, List<Language> langs) {
123
124 // if (backLayer == null) {
125 // backLayer = DEFAULT_BACK_LAYER;
126 // }
127 String uriParams = EditGeoServiceUtilities.getDistributionServiceRequestParameterString(distributions,
128 areaMapping, presenceAbsenceTermColors, width, height, bbox, backLayer, null, langs);
129 return uriParams;
130 }
131
132 /*
133 * (non-Javadoc)
134 *
135 * @see
136 * eu.etaxonomy.cdm.ext.IEditGeoService#getEditGeoServiceUrlParameterString
137 * (eu.etaxonomy.cdm.model.description.TaxonDescription, java.util.Map, int,
138 * int, java.lang.String, java.lang.String)
139 */
140 @Override
141 @Deprecated
142 public String getDistributionServiceRequestParameterString(TaxonDescription taxonDescription,
143 Map<PresenceAbsenceTermBase<?>, Color> presenceAbsenceTermColors, int width, int height, String bbox,
144 String backLayer, List<Language> langs) {
145
146 List<TaxonDescription> taxonDescriptions = new ArrayList<TaxonDescription>();
147 taxonDescriptions.add(taxonDescription);
148
149 return getDistributionServiceRequestParameterString(taxonDescriptions, presenceAbsenceTermColors, width,
150 height, bbox, backLayer, langs);
151 }
152
153 /*
154 * (non-Javadoc)
155 *
156 * @see eu.etaxonomy.cdm.ext.geo.IEditGeoService#
157 * getOccurrenceServiceRequestParameterString
158 * (eu.etaxonomy.cdm.model.description.TaxonDescription, java.util.Map, int,
159 * int, java.lang.String, java.lang.String)
160 */
161 @Override
162 public String getOccurrenceServiceRequestParameterString(List<SpecimenOrObservationBase> specimensOrObersvations,
163 Map<SpecimenOrObservationType, Color> specimenOrObservationTypeColors,
164 Boolean doReturnImage, Integer width, Integer height, String bbox, String backLayer) {
165
166 List<Point> fieldUnitPoints = new ArrayList<Point>();
167 List<Point> derivedUnitPoints = new ArrayList<Point>();
168
169 IndividualsAssociation individualsAssociation;
170 DerivedUnit derivedUnit;
171
172 for (SpecimenOrObservationBase specimenOrObservationBase : specimensOrObersvations) {
173 SpecimenOrObservationBase<?> specimenOrObservation = occurrenceDao
174 .load(specimenOrObservationBase.getUuid());
175
176 if (specimenOrObservation instanceof FieldUnit) {
177 fieldUnitPoints.add(((FieldUnit) specimenOrObservation).getGatheringEvent()
178 .getExactLocation());
179 }
180 if (specimenOrObservation instanceof DerivedUnit) {
181 registerDerivedUnitLocations((DerivedUnit) specimenOrObservation, derivedUnitPoints);
182 }
183 }
184
185 return EditGeoServiceUtilities.getOccurrenceServiceRequestParameterString(fieldUnitPoints,
186 derivedUnitPoints, specimenOrObservationTypeColors, doReturnImage, width, height, bbox, backLayer);
187
188 }
189
190 /**
191 * @param derivedUnit
192 * @param derivedUnitPoints
193 */
194 private void registerDerivedUnitLocations(DerivedUnit derivedUnit, List<Point> derivedUnitPoints) {
195
196 Set<SpecimenOrObservationBase> originals = derivedUnit.getOriginals();
197 if (originals != null) {
198 for (SpecimenOrObservationBase original : originals) {
199 if (original instanceof FieldUnit) {
200 if (((FieldUnit) original).getGatheringEvent() != null) {
201 Point point = ((FieldUnit) original).getGatheringEvent().getExactLocation();
202 if (point != null) {
203 // FIXME: remove next statement after
204 // DerivedUnitFacade or ABCD import is fixed
205 if (point.getLatitude() == 0.0 && point.getLongitude() == 0.0) {
206 continue;
207 }
208 derivedUnitPoints.add(point);
209 }
210 }
211 } else {
212 registerDerivedUnitLocations((DerivedUnit) original, derivedUnitPoints);
213 }
214 }
215 }
216
217 }
218
219 /*
220 * (non-Javadoc)
221 *
222 * @see
223 * eu.etaxonomy.cdm.ext.geo.IEditGeoService#setMapping(eu.etaxonomy.cdm.
224 * model.location.NamedArea, eu.etaxonomy.cdm.ext.geo.GeoServiceArea)
225 */
226 @Override
227 public void setMapping(NamedArea area, GeoServiceArea geoServiceArea) {
228 areaMapping.set(area, geoServiceArea);
229
230 }
231
232
233 /* (non-Javadoc)
234 * @see eu.etaxonomy.cdm.ext.geo.IEditGeoService#mapShapeFileToNamedAreas(java.io.Reader, java.util.List, java.lang.String, eu.etaxonomy.cdm.model.common.TermVocabulary)
235 */
236 @Override
237 @Transactional(readOnly=false)
238 public Map<NamedArea, String> mapShapeFileToNamedAreas(Reader csvReader, List<String> idSearchFields, String wmsLayerName, UUID areaVocabularyUuid) throws IOException {
239 TermVocabulary<NamedArea> areaVocabulary = vocabDao.load(areaVocabularyUuid);
240 ShpAttributesToNamedAreaMapper mapper = new ShpAttributesToNamedAreaMapper(areaVocabulary, areaMapping);
241 Map<NamedArea, String> resultMap = mapper.readCsv(csvReader, idSearchFields, wmsLayerName);
242 vocabDao.saveOrUpdate(areaVocabulary);
243 return resultMap;
244 }
245
246 }