3 * Copyright (C) 2007 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.
11 package eu
.etaxonomy
.cdm
.api
.service
;
13 import java
.util
.ArrayList
;
14 import java
.util
.Arrays
;
15 import java
.util
.HashSet
;
16 import java
.util
.List
;
19 import org
.apache
.log4j
.Logger
;
20 import org
.hibernate
.Hibernate
;
21 import org
.springframework
.beans
.factory
.annotation
.Autowired
;
22 import org
.springframework
.stereotype
.Service
;
23 import org
.springframework
.transaction
.annotation
.Propagation
;
24 import org
.springframework
.transaction
.annotation
.Transactional
;
26 import eu
.etaxonomy
.cdm
.api
.facade
.DerivedUnitFacade
;
27 import eu
.etaxonomy
.cdm
.api
.facade
.DerivedUnitFacadeConfigurator
;
28 import eu
.etaxonomy
.cdm
.api
.facade
.DerivedUnitFacadeNotSupportedException
;
29 import eu
.etaxonomy
.cdm
.api
.service
.pager
.Pager
;
30 import eu
.etaxonomy
.cdm
.api
.service
.pager
.impl
.DefaultPagerImpl
;
31 import eu
.etaxonomy
.cdm
.api
.service
.util
.TaxonRelationshipEdge
;
32 import eu
.etaxonomy
.cdm
.common
.monitor
.IProgressMonitor
;
33 import eu
.etaxonomy
.cdm
.hibernate
.HibernateProxyHelper
;
34 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
35 import eu
.etaxonomy
.cdm
.model
.common
.RelationshipBase
.Direction
;
36 import eu
.etaxonomy
.cdm
.model
.common
.UuidAndTitleCache
;
37 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionBase
;
38 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionElementBase
;
39 import eu
.etaxonomy
.cdm
.model
.description
.IndividualsAssociation
;
40 import eu
.etaxonomy
.cdm
.model
.description
.TaxonDescription
;
41 import eu
.etaxonomy
.cdm
.model
.location
.WaterbodyOrCountry
;
42 import eu
.etaxonomy
.cdm
.model
.media
.Media
;
43 import eu
.etaxonomy
.cdm
.model
.name
.HomotypicalGroup
;
44 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
45 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivationEvent
;
46 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivedUnitBase
;
47 import eu
.etaxonomy
.cdm
.model
.occurrence
.DeterminationEvent
;
48 import eu
.etaxonomy
.cdm
.model
.occurrence
.FieldObservation
;
49 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
50 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
51 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
52 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonRelationship
;
53 import eu
.etaxonomy
.cdm
.persistence
.dao
.AbstractBeanInitializer
;
54 import eu
.etaxonomy
.cdm
.persistence
.dao
.common
.IDefinedTermDao
;
55 import eu
.etaxonomy
.cdm
.persistence
.dao
.description
.IDescriptionDao
;
56 import eu
.etaxonomy
.cdm
.persistence
.dao
.occurrence
.IOccurrenceDao
;
57 import eu
.etaxonomy
.cdm
.persistence
.dao
.taxon
.ITaxonDao
;
58 import eu
.etaxonomy
.cdm
.persistence
.query
.OrderHint
;
59 import eu
.etaxonomy
.cdm
.strategy
.cache
.common
.IIdentifiableEntityCacheStrategy
;
62 * @author a.babadshanjan
66 @Transactional(propagation
= Propagation
.SUPPORTS
, readOnly
= true)
67 public class OccurrenceServiceImpl
extends IdentifiableServiceBase
<SpecimenOrObservationBase
,IOccurrenceDao
> implements IOccurrenceService
{
69 static private final Logger logger
= Logger
.getLogger(OccurrenceServiceImpl
.class);
72 private IDefinedTermDao definedTermDao
;
75 private IDescriptionService descriptionService
;
78 private ITaxonService taxonService
;
81 private AbstractBeanInitializer beanInitializer
;
84 private ITaxonDao taxonDao
;
88 public OccurrenceServiceImpl() {
89 logger
.debug("Load OccurrenceService Bean");
94 * @see eu.etaxonomy.cdm.api.service.IIdentifiableEntityService#updateTitleCache(java.lang.Integer, eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy)
97 @Transactional(readOnly
= false)
98 public void updateTitleCache(Class
<?
extends SpecimenOrObservationBase
> clazz
, Integer stepSize
, IIdentifiableEntityCacheStrategy
<SpecimenOrObservationBase
> cacheStrategy
, IProgressMonitor monitor
) {
100 clazz
= SpecimenOrObservationBase
.class;
102 super.updateTitleCacheImpl(clazz
, stepSize
, cacheStrategy
, monitor
);
107 * FIXME Candidate for harmonization
108 * move to termService
110 public WaterbodyOrCountry
getCountryByIso(String iso639
) {
111 return this.definedTermDao
.getCountryByIso(iso639
);
116 * FIXME Candidate for harmonization
117 * move to termService
119 public List
<WaterbodyOrCountry
> getWaterbodyOrCountryByName(String name
) {
120 List
<?
extends DefinedTermBase
> terms
= this.definedTermDao
.findByTitle(WaterbodyOrCountry
.class, name
, null, null, null, null, null, null) ;
121 List
<WaterbodyOrCountry
> countries
= new ArrayList
<WaterbodyOrCountry
>();
122 for (int i
=0;i
<terms
.size();i
++){
123 countries
.add((WaterbodyOrCountry
)terms
.get(i
));
129 protected void setDao(IOccurrenceDao dao
) {
133 public Pager
<DerivationEvent
> getDerivationEvents(SpecimenOrObservationBase occurence
, Integer pageSize
,Integer pageNumber
, List
<String
> propertyPaths
) {
134 Integer numberOfResults
= dao
.countDerivationEvents(occurence
);
136 List
<DerivationEvent
> results
= new ArrayList
<DerivationEvent
>();
137 if(numberOfResults
> 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
138 results
= dao
.getDerivationEvents(occurence
, pageSize
, pageNumber
,propertyPaths
);
141 return new DefaultPagerImpl
<DerivationEvent
>(pageNumber
, numberOfResults
, pageSize
, results
);
144 public Pager
<DeterminationEvent
> getDeterminations(SpecimenOrObservationBase occurrence
, TaxonBase taxonBase
, Integer pageSize
,Integer pageNumber
, List
<String
> propertyPaths
) {
145 Integer numberOfResults
= dao
.countDeterminations(occurrence
, taxonBase
);
147 List
<DeterminationEvent
> results
= new ArrayList
<DeterminationEvent
>();
148 if(numberOfResults
> 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
149 results
= dao
.getDeterminations(occurrence
,taxonBase
, pageSize
, pageNumber
, propertyPaths
);
152 return new DefaultPagerImpl
<DeterminationEvent
>(pageNumber
, numberOfResults
, pageSize
, results
);
155 public Pager
<Media
> getMedia(SpecimenOrObservationBase occurence
,Integer pageSize
, Integer pageNumber
, List
<String
> propertyPaths
) {
156 Integer numberOfResults
= dao
.countMedia(occurence
);
158 List
<Media
> results
= new ArrayList
<Media
>();
159 if(numberOfResults
> 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
160 results
= dao
.getMedia(occurence
, pageSize
, pageNumber
, propertyPaths
);
163 return new DefaultPagerImpl
<Media
>(pageNumber
, numberOfResults
, pageSize
, results
);
167 * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#list(java.lang.Class, eu.etaxonomy.cdm.model.taxon.TaxonBase, java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)
169 public Pager
<SpecimenOrObservationBase
> list(Class
<?
extends SpecimenOrObservationBase
> type
, TaxonBase determinedAs
, Integer pageSize
, Integer pageNumber
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
) {
170 Integer numberOfResults
= dao
.count(type
,determinedAs
);
171 List
<SpecimenOrObservationBase
> results
= new ArrayList
<SpecimenOrObservationBase
>();
172 pageNumber
= pageNumber
== null ?
0 : pageNumber
;
173 if(numberOfResults
> 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
174 Integer start
= pageSize
== null ?
0 : pageSize
* pageNumber
;
175 results
= dao
.list(type
,determinedAs
, pageSize
, start
, orderHints
,propertyPaths
);
177 return new DefaultPagerImpl
<SpecimenOrObservationBase
>(pageNumber
, numberOfResults
, pageSize
, results
);
181 public List
<UuidAndTitleCache
<DerivedUnitBase
>> getDerivedUnitBaseUuidAndTitleCache() {
182 return dao
.getDerivedUnitBaseUuidAndTitleCache();
186 public List
<UuidAndTitleCache
<FieldObservation
>> getFieldObservationUuidAndTitleCache() {
187 return dao
.getFieldObservationUuidAndTitleCache();
191 * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#getDerivedUnitFacade(eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase)
194 public DerivedUnitFacade
getDerivedUnitFacade(DerivedUnitBase derivedUnit
, List
<String
> propertyPaths
) throws DerivedUnitFacadeNotSupportedException
{
195 derivedUnit
= (DerivedUnitBase
<?
>)dao
.load(derivedUnit
.getUuid(), null);
196 DerivedUnitFacadeConfigurator config
= DerivedUnitFacadeConfigurator
.NewInstance();
197 config
.setThrowExceptionForNonSpecimenPreservationMethodRequest(false);
198 DerivedUnitFacade derivedUnitFacade
= DerivedUnitFacade
.NewInstance(derivedUnit
, config
);
199 beanInitializer
.initialize(derivedUnitFacade
, propertyPaths
);
200 return derivedUnitFacade
;
204 * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#listDerivedUnitFacades(eu.etaxonomy.cdm.model.description.DescriptionBase, java.util.List)
207 public List
<DerivedUnitFacade
> listDerivedUnitFacades(
208 DescriptionBase description
, List
<String
> propertyPaths
) {
210 List
<DerivedUnitFacade
> derivedUnitFacadeList
= new ArrayList
<DerivedUnitFacade
>();
211 IndividualsAssociation tempIndividualsAssociation
;
212 SpecimenOrObservationBase tempSpecimenOrObservationBase
;
213 List
<DescriptionElementBase
> elements
= descriptionService
.listDescriptionElements(description
, null, IndividualsAssociation
.class, null, 0, Arrays
.asList(new String
[]{"associatedSpecimenOrObservation"}));
214 for(DescriptionElementBase element
: elements
){
215 if(element
instanceof IndividualsAssociation
){
216 tempIndividualsAssociation
= (IndividualsAssociation
)element
;
217 if(tempIndividualsAssociation
.getAssociatedSpecimenOrObservation() != null){
218 tempSpecimenOrObservationBase
= HibernateProxyHelper
.deproxy(tempIndividualsAssociation
.getAssociatedSpecimenOrObservation(), SpecimenOrObservationBase
.class);
219 if(tempSpecimenOrObservationBase
instanceof DerivedUnitBase
){
221 derivedUnitFacadeList
.add(DerivedUnitFacade
.NewInstance((DerivedUnitBase
)tempSpecimenOrObservationBase
));
222 } catch (DerivedUnitFacadeNotSupportedException e
) {
223 logger
.warn(tempIndividualsAssociation
.getAssociatedSpecimenOrObservation().getTitleCache() + " : " +e
.getMessage());
231 beanInitializer
.initializeAll(derivedUnitFacadeList
, propertyPaths
);
233 return derivedUnitFacadeList
;
238 * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#listByAssociatedTaxon(java.lang.Class, eu.etaxonomy.cdm.model.taxon.Taxon, java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)
241 public <T
extends SpecimenOrObservationBase
> List
<T
> listByAssociatedTaxon(Class
<T
> type
,
242 Taxon associatedTaxon
, Integer limit
, Integer start
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
)
244 return listByAssociatedTaxon(type
, null, associatedTaxon
, null, limit
, start
, orderHints
, propertyPaths
);
249 * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#listByAnyAssociation(java.lang.Class, java.util.Set, eu.etaxonomy.cdm.model.taxon.Taxon, java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)
252 public <T
extends SpecimenOrObservationBase
> List
<T
> listByAssociatedTaxon(Class
<T
> type
, Set
<TaxonRelationshipEdge
> includeRelationships
,
253 Taxon associatedTaxon
, Integer maxDepth
, Integer pageSize
, Integer pageNumber
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
) {
255 List
<Taxon
> taxa
= new ArrayList
<Taxon
>();
256 List
<Integer
> occurrenceIds
= new ArrayList
<Integer
>();
257 List
<T
> occurrences
= new ArrayList
<T
>();
260 if(includeRelationships
!= null) {
261 taxonService
.listRelatedTaxa(associatedTaxon
, includeRelationships
, maxDepth
, pageSize
, pageSize
, propertyPaths
);
264 taxa
.add((Taxon
) taxonDao
.load(associatedTaxon
.getUuid()));
266 for (Taxon taxon
: taxa
) {
267 List
<T
> perTaxonOccurrences
= dao
.listByAssociatedTaxon(type
, associatedTaxon
, pageSize
, pageSize
, orderHints
, propertyPaths
);
268 for (SpecimenOrObservationBase o
: perTaxonOccurrences
) {
269 occurrenceIds
.add(o
.getId());
273 dao
.listByIds(occurrenceIds
, null, null, orderHints
, propertyPaths
);
280 * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#pageByAssociatedTaxon(java.lang.Class, java.util.Set, eu.etaxonomy.cdm.model.taxon.Taxon, java.lang.Integer, java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)
283 public <T
extends SpecimenOrObservationBase
> Pager
<T
> pageByAssociatedTaxon(Class
<T
> type
, Set
<TaxonRelationshipEdge
> includeRelationships
,
284 Taxon associatedTaxon
, Integer maxDepth
, Integer pageSize
, Integer pageNumber
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
) {