3 * Copyright (C) 2009 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.cdm
.ext
.geo
;
12 import java
.awt
.Color
;
13 import java
.util
.ArrayList
;
14 import java
.util
.HashSet
;
15 import java
.util
.List
;
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
;
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
;
41 * @author a.kohlbecker
46 @Transactional(readOnly
=true)
47 public class EditGeoService
implements IEditGeoService
{
48 public static final Logger logger
= Logger
.getLogger(EditGeoService
.class);
50 private static final String DEFAULT_BACK_LAYER
= "tdwg4";
53 private IDescriptionDao dao
;
57 private IGeoServiceAreaMapping areaMapping
;
59 private IDefinedTermDao termDao
;
62 public void setTermDao(IDefinedTermDao termDao
) {
63 this.termDao
= termDao
;
64 EditGeoServiceUtilities
.setTermDao(termDao
);
68 private IOccurrenceDao occurrenceDao
;
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
;
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)
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
);
92 if(backLayer
== null){
93 backLayer
= DEFAULT_BACK_LAYER
;
95 String uriParams
= EditGeoServiceUtilities
.getDistributionServiceRequestParameterString(distributions
, areaMapping
, presenceAbsenceTermColors
, width
, height
, bbox
, backLayer
, null, langs
);
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)
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
) {
109 List
<TaxonDescription
> taxonDescriptions
= new ArrayList
<TaxonDescription
>();
110 taxonDescriptions
.add(taxonDescription
);
112 return getDistributionServiceRequestParameterString(taxonDescriptions
, presenceAbsenceTermColors
, width
, height
, bbox
, backLayer
, langs
);
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)
118 public String
getDistributionServiceRequestParameterString(Taxon taxon
,
119 Map
<PresenceAbsenceTermBase
<?
>, Color
> presenceAbsenceTermColors
, int width
, int height
, String bbox
,
121 List
<Language
> langs
) {
123 List
<TaxonDescription
> taxonDescriptions
= dao
.getTaxonDescriptions(taxon
, null, null, null, null, null, null);
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
);
131 // generate the uri parameter string
132 if(backLayer
== null){
133 backLayer
= DEFAULT_BACK_LAYER
;
135 String uriParams
= EditGeoServiceUtilities
.getDistributionServiceRequestParameterString(distCollection
,areaMapping
,
136 presenceAbsenceTermColors
, width
, height
, bbox
, backLayer
, null, langs
);
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)
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
) {
150 List
<Point
> fieldObservationPoints
= new ArrayList
<Point
>();
151 List
<Point
> derivedUnitPoints
= new ArrayList
<Point
>();
153 IndividualsAssociation individualsAssociation
;
154 DerivedUnitBase derivedUnit
;
156 for(SpecimenOrObservationBase specimenOrObservationBase
: specimensOrObersvations
){
157 SpecimenOrObservationBase
<?
> specimenOrObservation
= occurrenceDao
.load(specimenOrObservationBase
.getUuid());
159 if(specimenOrObservation
instanceof FieldObservation
){
160 fieldObservationPoints
.add(((FieldObservation
)specimenOrObservation
).getGatheringEvent().getExactLocation());
162 if(specimenOrObservation
instanceof DerivedUnitBase
<?
>){
163 registerDerivedUnitLocations((DerivedUnitBase
)specimenOrObservation
, derivedUnitPoints
);
167 return EditGeoServiceUtilities
.getOccurrenceServiceRequestParameterString(
168 fieldObservationPoints
, derivedUnitPoints
,
169 specimenOrObservationTypeColors
, doReturnImage
, width
,
170 height
, bbox
, backLayer
);
176 * @param derivedUnitPoints
178 private void registerDerivedUnitLocations(DerivedUnitBase
<?
> derivedUnit
,
179 List
<Point
> derivedUnitPoints
) {
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();
187 //FIXME: remove next statement after DerivedUnitFacade or ABCD import is fixed
188 if(point
.getLatitude() == 0.0 && point
.getLongitude() == 0.0){
191 derivedUnitPoints
.add(point
);
194 registerDerivedUnitLocations((DerivedUnitBase
) original
, derivedUnitPoints
);
202 * @see eu.etaxonomy.cdm.ext.geo.IEditGeoService#setMapping(eu.etaxonomy.cdm.model.location.NamedArea, eu.etaxonomy.cdm.ext.geo.GeoServiceArea)
205 public void setMapping(NamedArea area
, GeoServiceArea geoServiceArea
) {
206 areaMapping
.set(area
, geoServiceArea
);