Merged sdd-branch to trunk.
[cdmlib.git] / cdmlib-ext / src / main / java / eu / etaxonomy / cdm / ext / geo / EditGeoService.java
index baa159dadc695fbdbaabe506901c214ef649201c..7ee9e71c03032dc8d244c248b1a125acd43ea3e2 100644 (file)
@@ -1,9 +1,9 @@
 // $Id$\r
 /**\r
 * Copyright (C) 2009 EDIT\r
-* European Distributed Institute of Taxonomy \r
+* European Distributed Institute of Taxonomy\r
 * http://www.e-taxonomy.eu\r
-* \r
+*\r
 * The contents of this file are subject to the Mozilla Public License Version 1.1\r
 * See LICENSE.TXT at the top of this package for the full license terms.\r
 */\r
@@ -12,7 +12,6 @@ package eu.etaxonomy.cdm.ext.geo;
 import java.awt.Color;\r
 import java.util.ArrayList;\r
 import java.util.HashSet;\r
-import java.util.Iterator;\r
 import java.util.List;\r
 import java.util.Map;\r
 import java.util.Set;\r
@@ -22,23 +21,21 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;\r
 import org.springframework.transaction.annotation.Transactional;\r
 \r
-import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;\r
-import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
-import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
 import eu.etaxonomy.cdm.model.description.Distribution;\r
 import eu.etaxonomy.cdm.model.description.Feature;\r
 import eu.etaxonomy.cdm.model.description.IndividualsAssociation;\r
 import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;\r
 import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
+import eu.etaxonomy.cdm.model.location.NamedArea;\r
 import eu.etaxonomy.cdm.model.location.Point;\r
 import eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase;\r
 import eu.etaxonomy.cdm.model.occurrence.FieldObservation;\r
-import eu.etaxonomy.cdm.model.occurrence.GatheringEvent;\r
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao;\r
 import eu.etaxonomy.cdm.persistence.dao.description.IDescriptionDao;\r
+import eu.etaxonomy.cdm.persistence.dao.occurrence.IOccurrenceDao;\r
 \r
 /**\r
  * @author a.kohlbecker\r
@@ -48,149 +45,168 @@ import eu.etaxonomy.cdm.persistence.dao.description.IDescriptionDao;
 @Service\r
 @Transactional(readOnly=true)\r
 public class EditGeoService implements IEditGeoService{\r
-       public static final Logger logger = Logger.getLogger(EditGeoService.class);\r
-       \r
-       private static final String DEFAULT_BACK_LAYER = "tdwg4";\r
-\r
-       @Autowired\r
-       private IDescriptionDao dao;\r
-       @Autowired\r
-       private IDefinedTermDao termDao;\r
-\r
-       private Set<Feature> getDistributionFeatures() {\r
-               Set<Feature> distributionFeature = new HashSet<Feature>();\r
-               Feature feature = (Feature) termDao.findByUuid(Feature.DISTRIBUTION().getUuid());\r
-               distributionFeature.add(feature);\r
-               return distributionFeature;\r
-       }\r
-       \r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.ext.IEditGeoService#getEditGeoServiceUrlParameterString(java.util.List, java.util.Map, int, int, java.lang.String, java.lang.String, java.util.List)\r
-        */\r
-       public String getDistributionServiceRequestParameterString(\r
-                       List<TaxonDescription> taxonDescriptions,\r
-                       Map<PresenceAbsenceTermBase<?>, Color> presenceAbsenceTermColors,\r
-                       int width, int height, String bbox, String backLayer,\r
-                       List<Language> langs) {\r
-               Set<Distribution> distributions = new HashSet<Distribution>();\r
-               for(TaxonDescription taxonDescription : taxonDescriptions){\r
-                       List<Distribution> result = (List)dao.getDescriptionElements(taxonDescription, getDistributionFeatures(), Distribution.class, null, null, null);\r
-                       distributions.addAll(result);\r
-               }\r
-               \r
-               if(backLayer == null){\r
-                       backLayer = DEFAULT_BACK_LAYER;\r
-               }\r
-               String uriParams = EditGeoServiceUtilities.getDistributionServiceRequestParameterString(distributions, presenceAbsenceTermColors, width, height, bbox, backLayer, langs);\r
-\r
-               return uriParams;\r
-       }\r
-\r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.ext.IEditGeoService#getEditGeoServiceUrlParameterString(eu.etaxonomy.cdm.model.description.TaxonDescription, java.util.Map, int, int, java.lang.String, java.lang.String)\r
-        */\r
-       public String getDistributionServiceRequestParameterString(\r
-                       TaxonDescription taxonDescription,\r
-                       Map<PresenceAbsenceTermBase<?>, Color> presenceAbsenceTermColors,\r
-                       int width, int height, String bbox, String backLayer,\r
-                       List<Language> langs) {\r
-               \r
-               List<TaxonDescription> taxonDescriptions = new ArrayList<TaxonDescription>();\r
-               taxonDescriptions.add(taxonDescription);\r
-               \r
-               return getDistributionServiceRequestParameterString(taxonDescriptions, presenceAbsenceTermColors, width, height, bbox, backLayer, langs);\r
-       }\r
-       \r
-       /* (non-Javadoc)\r
-        * @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)\r
-        */\r
-       public String getDistributionServiceRequestParameterString(Taxon taxon,\r
-                       Map<PresenceAbsenceTermBase<?>, Color> presenceAbsenceTermColors, int width, int height, String bbox,\r
-                       String backLayer,\r
-                       List<Language> langs) {\r
-               \r
-               List<TaxonDescription> taxonDescriptions = dao.getTaxonDescriptions(taxon, null, null, null, null, null);\r
-               \r
-               Set<Distribution> distCollection = new HashSet<Distribution>();\r
-               // get descriptions elements for each description\r
-               for (TaxonDescription td : taxonDescriptions) {\r
-                       List<Distribution> dists = (List)dao.getDescriptionElements(td, getDistributionFeatures(), Distribution.class, null, null, null);\r
-                       distCollection.addAll(dists);\r
-               }\r
-               // generate the uri parameter string\r
-               if(backLayer == null){\r
-                       backLayer = DEFAULT_BACK_LAYER;\r
-               }\r
-               String uriParams = EditGeoServiceUtilities.getDistributionServiceRequestParameterString(distCollection,\r
-                       presenceAbsenceTermColors, width, height, bbox, backLayer, langs);\r
-\r
-               return uriParams;\r
-       }\r
-\r
-       /* (non-Javadoc)\r
-        * @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)\r
-        */\r
-       @Override\r
-       public String getOccurrenceServiceRequestParameterString(\r
-                       List<TaxonDescription> taxonDescriptions,\r
-                       Map<Class<? extends SpecimenOrObservationBase<?>>, Color> specimenOrObservationTypeColors, Boolean doReturnImage,\r
-                       Integer width, Integer height, String bbox, String backLayer) {\r
-               \r
-                       List<Point> fieldObservationPoints = new ArrayList<Point>();\r
-                       List<Point> derivedUnitPoints = new ArrayList<Point>();\r
-                       \r
-                       IndividualsAssociation individualsAssociation;\r
-                       DerivedUnitBase derivedUnit;\r
-                       \r
-                       for(TaxonDescription taxonDescription : taxonDescriptions){\r
-                               List<DescriptionElementBase> elemements = dao.getDescriptionElements(taxonDescription, null, IndividualsAssociation.class, null, 0, null);\r
-                               for (DescriptionElementBase descriptionElementBase : elemements) {\r
-                                       individualsAssociation = (IndividualsAssociation)descriptionElementBase;\r
-                                       if(individualsAssociation.getAssociatedSpecimenOrObservation() != null){\r
-                                               \r
-                                               SpecimenOrObservationBase<?> specimenOrObservation = HibernateProxyHelper.deproxy(individualsAssociation.getAssociatedSpecimenOrObservation(), SpecimenOrObservationBase.class);\r
-                                               \r
-                                               if(specimenOrObservation instanceof FieldObservation){\r
-                                                       fieldObservationPoints.add(((FieldObservation)specimenOrObservation).getGatheringEvent().getExactLocation());\r
-                                               } \r
-                                               if(specimenOrObservation instanceof DerivedUnitBase<?>){                                                \r
-                                                       registerDerivedUnitLocations((DerivedUnitBase)specimenOrObservation, derivedUnitPoints);\r
-                                               }\r
-                                               \r
-                                       }\r
-                               }\r
-                       }\r
-                       \r
-               return EditGeoServiceUtilities.getOccurrenceServiceRequestParameterString(\r
-                                               fieldObservationPoints, derivedUnitPoints,\r
-                                               specimenOrObservationTypeColors, doReturnImage , width,\r
-                                               height, bbox, backLayer);\r
-\r
-       }\r
-\r
-       /**\r
-        * @param derivedUnit\r
-        * @param derivedUnitPoints\r
-        */\r
-       private void registerDerivedUnitLocations(DerivedUnitBase<?> derivedUnit,\r
-                       List<Point> derivedUnitPoints) {\r
-\r
-               Set<SpecimenOrObservationBase> originals = derivedUnit.getOriginals();\r
-               for (SpecimenOrObservationBase original : originals) {\r
-                       if (original instanceof FieldObservation) {\r
-                               Point point =  ((FieldObservation) original).getGatheringEvent().getExactLocation();\r
-                               if(point != null){\r
-                                       //FIXME: remove next statement after DerivedUnitFacade or ABCD import is fixed\r
-                                       if(point.getLatitude() == 0.0 && point.getLongitude() == 0.0){\r
-                                               continue;\r
-                                       }\r
-                                       derivedUnitPoints.add(point);\r
-                               }\r
-                       } else {\r
-                               registerDerivedUnitLocations((DerivedUnitBase) original, derivedUnitPoints);\r
-                       }\r
-               }\r
-\r
-       }\r
+    public static final Logger logger = Logger.getLogger(EditGeoService.class);\r
+\r
+    private static final String DEFAULT_BACK_LAYER = "tdwg4";\r
+\r
+    @Autowired\r
+    private IDescriptionDao dao;\r
+\r
+\r
+    @Autowired\r
+    private IGeoServiceAreaMapping areaMapping;\r
+\r
+    private IDefinedTermDao termDao;\r
+\r
+    @Autowired\r
+    public void setTermDao(IDefinedTermDao termDao) {\r
+        this.termDao = termDao;\r
+        EditGeoServiceUtilities.setTermDao(termDao);\r
+    }\r
+\r
+    @Autowired\r
+    private IOccurrenceDao occurrenceDao;\r
+\r
+\r
+    private Set<Feature> getDistributionFeatures() {\r
+        Set<Feature> distributionFeature = new HashSet<Feature>();\r
+        Feature feature = (Feature) termDao.findByUuid(Feature.DISTRIBUTION().getUuid());\r
+        distributionFeature.add(feature);\r
+        return distributionFeature;\r
+    }\r
+\r
+    /* (non-Javadoc)\r
+     * @see eu.etaxonomy.cdm.ext.IEditGeoService#getEditGeoServiceUrlParameterString(java.util.List, java.util.Map, int, int, java.lang.String, java.lang.String, java.util.List)\r
+     */\r
+    public String getDistributionServiceRequestParameterString(\r
+            List<TaxonDescription> taxonDescriptions,\r
+            Map<PresenceAbsenceTermBase<?>, Color> presenceAbsenceTermColors,\r
+            int width, int height, String bbox, String backLayer,\r
+            List<Language> langs) {\r
+        Set<Distribution> distributions = new HashSet<Distribution>();\r
+        for(TaxonDescription taxonDescription : taxonDescriptions){\r
+            List<Distribution> result = (List)dao.getDescriptionElements(taxonDescription, getDistributionFeatures(), Distribution.class, null, null, null);\r
+            distributions.addAll(result);\r
+        }\r
+\r
+        if(backLayer == null){\r
+            backLayer = DEFAULT_BACK_LAYER;\r
+        }\r
+        String uriParams = EditGeoServiceUtilities.getDistributionServiceRequestParameterString(distributions, areaMapping, presenceAbsenceTermColors, width, height, bbox, backLayer, null, langs);\r
+\r
+        return uriParams;\r
+    }\r
+\r
+    /* (non-Javadoc)\r
+     * @see eu.etaxonomy.cdm.ext.IEditGeoService#getEditGeoServiceUrlParameterString(eu.etaxonomy.cdm.model.description.TaxonDescription, java.util.Map, int, int, java.lang.String, java.lang.String)\r
+     */\r
+    public String getDistributionServiceRequestParameterString(\r
+            TaxonDescription taxonDescription,\r
+            Map<PresenceAbsenceTermBase<?>, Color> presenceAbsenceTermColors,\r
+            int width, int height, String bbox, String backLayer,\r
+            List<Language> langs) {\r
+\r
+        List<TaxonDescription> taxonDescriptions = new ArrayList<TaxonDescription>();\r
+        taxonDescriptions.add(taxonDescription);\r
+\r
+        return getDistributionServiceRequestParameterString(taxonDescriptions, presenceAbsenceTermColors, width, height, bbox, backLayer, langs);\r
+    }\r
+\r
+    /* (non-Javadoc)\r
+     * @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)\r
+     */\r
+    public String getDistributionServiceRequestParameterString(Taxon taxon,\r
+            Map<PresenceAbsenceTermBase<?>, Color> presenceAbsenceTermColors, int width, int height, String bbox,\r
+            String backLayer,\r
+            List<Language> langs) {\r
+\r
+        List<TaxonDescription> taxonDescriptions = dao.listTaxonDescriptions(taxon, null, null, null, null, null, null);\r
+\r
+        Set<Distribution> distCollection = new HashSet<Distribution>();\r
+        // get descriptions elements for each description\r
+        for (TaxonDescription td : taxonDescriptions) {\r
+            List<Distribution> dists = (List)dao.getDescriptionElements(td, getDistributionFeatures(), Distribution.class, null, null, null);\r
+            distCollection.addAll(dists);\r
+        }\r
+        // generate the uri parameter string\r
+        if(backLayer == null){\r
+            backLayer = DEFAULT_BACK_LAYER;\r
+        }\r
+        String uriParams = EditGeoServiceUtilities.getDistributionServiceRequestParameterString(distCollection,areaMapping,\r
+            presenceAbsenceTermColors, width, height, bbox, backLayer, null, langs);\r
+\r
+        return uriParams;\r
+    }\r
+\r
+    /* (non-Javadoc)\r
+     * @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)\r
+     */\r
+    @Override\r
+    public String getOccurrenceServiceRequestParameterString(\r
+            List<SpecimenOrObservationBase> specimensOrObersvations,\r
+            Map<Class<? extends SpecimenOrObservationBase>, Color> specimenOrObservationTypeColors, Boolean doReturnImage,\r
+            Integer width, Integer height, String bbox, String backLayer) {\r
+\r
+            List<Point> fieldObservationPoints = new ArrayList<Point>();\r
+            List<Point> derivedUnitPoints = new ArrayList<Point>();\r
+\r
+            IndividualsAssociation individualsAssociation;\r
+            DerivedUnitBase derivedUnit;\r
+\r
+            for(SpecimenOrObservationBase specimenOrObservationBase : specimensOrObersvations){\r
+                SpecimenOrObservationBase<?> specimenOrObservation = occurrenceDao.load(specimenOrObservationBase.getUuid());\r
+\r
+                if(specimenOrObservation instanceof FieldObservation){\r
+                    fieldObservationPoints.add(((FieldObservation)specimenOrObservation).getGatheringEvent().getExactLocation());\r
+                }\r
+                if(specimenOrObservation instanceof DerivedUnitBase<?>){\r
+                    registerDerivedUnitLocations((DerivedUnitBase)specimenOrObservation, derivedUnitPoints);\r
+                }\r
+            }\r
+\r
+        return EditGeoServiceUtilities.getOccurrenceServiceRequestParameterString(\r
+                        fieldObservationPoints, derivedUnitPoints,\r
+                        specimenOrObservationTypeColors, doReturnImage , width,\r
+                        height, bbox, backLayer);\r
+\r
+    }\r
+\r
+    /**\r
+     * @param derivedUnit\r
+     * @param derivedUnitPoints\r
+     */\r
+    private void registerDerivedUnitLocations(DerivedUnitBase<?> derivedUnit,\r
+            List<Point> derivedUnitPoints) {\r
+\r
+        Set<SpecimenOrObservationBase> originals = derivedUnit.getOriginals();\r
+        if(originals != null){\r
+            for (SpecimenOrObservationBase original : originals) {\r
+                if (original instanceof FieldObservation) {\r
+                    if (((FieldObservation) original).getGatheringEvent() != null ) {\r
+                        Point point =  ((FieldObservation) original).getGatheringEvent().getExactLocation();\r
+                        if(point != null){\r
+                            //FIXME: remove next statement after DerivedUnitFacade or ABCD import is fixed\r
+                            if(point.getLatitude() == 0.0 && point.getLongitude() == 0.0){\r
+                                continue;\r
+                            }\r
+                            derivedUnitPoints.add(point);\r
+                        }\r
+                    }\r
+                } else {\r
+                    registerDerivedUnitLocations((DerivedUnitBase) original, derivedUnitPoints);\r
+                }\r
+            }\r
+        }\r
+\r
+    }\r
+\r
+    /* (non-Javadoc)\r
+     * @see eu.etaxonomy.cdm.ext.geo.IEditGeoService#setMapping(eu.etaxonomy.cdm.model.location.NamedArea, eu.etaxonomy.cdm.ext.geo.GeoServiceArea)\r
+     */\r
+    @Override\r
+    public void setMapping(NamedArea area, GeoServiceArea geoServiceArea) {\r
+        areaMapping.set(area, geoServiceArea);\r
+\r
+    }\r
 \r
 }\r