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