controller method for listByAssociatedTaxon(); default OrderHints; method harmonizati...
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / OccurrenceServiceImpl.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 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
11 package eu.etaxonomy.cdm.api.service;
12
13 import java.util.ArrayList;
14 import java.util.Arrays;
15 import java.util.HashSet;
16 import java.util.List;
17 import java.util.Set;
18
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;
25
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;
60
61 /**
62 * @author a.babadshanjan
63 * @created 01.09.2008
64 */
65 @Service
66 @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
67 public class OccurrenceServiceImpl extends IdentifiableServiceBase<SpecimenOrObservationBase,IOccurrenceDao> implements IOccurrenceService {
68
69 static private final Logger logger = Logger.getLogger(OccurrenceServiceImpl.class);
70
71 @Autowired
72 private IDefinedTermDao definedTermDao;
73
74 @Autowired
75 private IDescriptionService descriptionService;
76
77 @Autowired
78 private ITaxonService taxonService;
79
80 @Autowired
81 private AbstractBeanInitializer beanInitializer;
82
83 @Autowired
84 private ITaxonDao taxonDao;
85
86
87
88 public OccurrenceServiceImpl() {
89 logger.debug("Load OccurrenceService Bean");
90 }
91
92
93 /* (non-Javadoc)
94 * @see eu.etaxonomy.cdm.api.service.IIdentifiableEntityService#updateTitleCache(java.lang.Integer, eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy)
95 */
96 @Override
97 @Transactional(readOnly = false)
98 public void updateTitleCache(Class<? extends SpecimenOrObservationBase> clazz, Integer stepSize, IIdentifiableEntityCacheStrategy<SpecimenOrObservationBase> cacheStrategy, IProgressMonitor monitor) {
99 if (clazz == null){
100 clazz = SpecimenOrObservationBase.class;
101 }
102 super.updateTitleCacheImpl(clazz, stepSize, cacheStrategy, monitor);
103 }
104
105
106 /**
107 * FIXME Candidate for harmonization
108 * move to termService
109 */
110 public WaterbodyOrCountry getCountryByIso(String iso639) {
111 return this.definedTermDao.getCountryByIso(iso639);
112
113 }
114
115 /**
116 * FIXME Candidate for harmonization
117 * move to termService
118 */
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));
124 }
125 return countries;
126 }
127
128 @Autowired
129 protected void setDao(IOccurrenceDao dao) {
130 this.dao = dao;
131 }
132
133 public Pager<DerivationEvent> getDerivationEvents(SpecimenOrObservationBase occurence, Integer pageSize,Integer pageNumber, List<String> propertyPaths) {
134 Integer numberOfResults = dao.countDerivationEvents(occurence);
135
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);
139 }
140
141 return new DefaultPagerImpl<DerivationEvent>(pageNumber, numberOfResults, pageSize, results);
142 }
143
144 public Pager<DeterminationEvent> getDeterminations(SpecimenOrObservationBase occurrence, TaxonBase taxonBase, Integer pageSize,Integer pageNumber, List<String> propertyPaths) {
145 Integer numberOfResults = dao.countDeterminations(occurrence, taxonBase);
146
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);
150 }
151
152 return new DefaultPagerImpl<DeterminationEvent>(pageNumber, numberOfResults, pageSize, results);
153 }
154
155 public Pager<Media> getMedia(SpecimenOrObservationBase occurence,Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
156 Integer numberOfResults = dao.countMedia(occurence);
157
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);
161 }
162
163 return new DefaultPagerImpl<Media>(pageNumber, numberOfResults, pageSize, results);
164 }
165
166 /* (non-Javadoc)
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)
168 */
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);
176 }
177 return new DefaultPagerImpl<SpecimenOrObservationBase>(pageNumber, numberOfResults, pageSize, results);
178 }
179
180 @Override
181 public List<UuidAndTitleCache<DerivedUnitBase>> getDerivedUnitBaseUuidAndTitleCache() {
182 return dao.getDerivedUnitBaseUuidAndTitleCache();
183 }
184
185 @Override
186 public List<UuidAndTitleCache<FieldObservation>> getFieldObservationUuidAndTitleCache() {
187 return dao.getFieldObservationUuidAndTitleCache();
188 }
189
190 /* (non-Javadoc)
191 * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#getDerivedUnitFacade(eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase)
192 */
193 @Override
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;
201 }
202
203 /* (non-Javadoc)
204 * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#listDerivedUnitFacades(eu.etaxonomy.cdm.model.description.DescriptionBase, java.util.List)
205 */
206 @Override
207 public List<DerivedUnitFacade> listDerivedUnitFacades(
208 DescriptionBase description, List<String> propertyPaths) {
209
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){
220 try {
221 derivedUnitFacadeList.add(DerivedUnitFacade.NewInstance((DerivedUnitBase)tempSpecimenOrObservationBase));
222 } catch (DerivedUnitFacadeNotSupportedException e) {
223 logger.warn(tempIndividualsAssociation.getAssociatedSpecimenOrObservation().getTitleCache() + " : " +e.getMessage());
224 }
225 }
226 }
227
228 }
229 }
230
231 beanInitializer.initializeAll(derivedUnitFacadeList, propertyPaths);
232
233 return derivedUnitFacadeList;
234 }
235
236
237 /* (non-Javadoc)
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)
239 */
240 @Override
241 public <T extends SpecimenOrObservationBase> List<T> listByAssociatedTaxon(Class<T> type,
242 Taxon associatedTaxon, Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths)
243 {
244 return listByAssociatedTaxon(type, null, associatedTaxon, null, limit, start, orderHints, propertyPaths);
245 }
246
247
248 /* (non-Javadoc)
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)
250 */
251 @Override
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) {
254
255 List<Taxon> taxa = new ArrayList<Taxon>();
256 List<Integer> occurrenceIds = new ArrayList<Integer>();
257 List<T> occurrences = new ArrayList<T>();
258
259
260 if(includeRelationships != null) {
261 taxonService.listRelatedTaxa(associatedTaxon, includeRelationships, maxDepth, pageSize, pageSize, propertyPaths);
262 }
263
264 taxa.add((Taxon) taxonDao.load(associatedTaxon.getUuid()));
265
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());
270 }
271 }
272
273 dao.listByIds(occurrenceIds, null, null, orderHints, propertyPaths);
274
275 return occurrences;
276 }
277
278
279 /* (non-Javadoc)
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)
281 */
282 @Override
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) {
285
286
287 return null;
288 }
289
290 }