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