Corrected the inheritance of service configurators
[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.List;
16
17 import org.apache.log4j.Logger;
18 import org.springframework.beans.factory.annotation.Autowired;
19 import org.springframework.stereotype.Service;
20 import org.springframework.transaction.annotation.Propagation;
21 import org.springframework.transaction.annotation.Transactional;
22
23 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;
24 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeConfigurator;
25 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeNotSupportedException;
26 import eu.etaxonomy.cdm.api.service.pager.Pager;
27 import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;
28 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
29 import eu.etaxonomy.cdm.model.common.DefinedTermBase;
30 import eu.etaxonomy.cdm.model.common.UuidAndTitleCache;
31 import eu.etaxonomy.cdm.model.description.DescriptionBase;
32 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
33 import eu.etaxonomy.cdm.model.description.IndividualsAssociation;
34 import eu.etaxonomy.cdm.model.description.TaxonDescription;
35 import eu.etaxonomy.cdm.model.location.WaterbodyOrCountry;
36 import eu.etaxonomy.cdm.model.media.Media;
37 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
38 import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
39 import eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase;
40 import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
41 import eu.etaxonomy.cdm.model.occurrence.FieldObservation;
42 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
43 import eu.etaxonomy.cdm.model.taxon.Taxon;
44 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
45 import eu.etaxonomy.cdm.persistence.dao.AbstractBeanInitializer;
46 import eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao;
47 import eu.etaxonomy.cdm.persistence.dao.description.IDescriptionDao;
48 import eu.etaxonomy.cdm.persistence.dao.occurrence.IOccurrenceDao;
49 import eu.etaxonomy.cdm.persistence.query.OrderHint;
50
51 /**
52 * @author a.babadshanjan
53 * @created 01.09.2008
54 */
55 @Service
56 @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
57 public class OccurrenceServiceImpl extends IdentifiableServiceBase<SpecimenOrObservationBase,IOccurrenceDao> implements IOccurrenceService {
58
59 static private final Logger logger = Logger.getLogger(OccurrenceServiceImpl.class);
60
61 @Autowired
62 private IDefinedTermDao definedTermDao;
63
64 @Autowired
65 private IDescriptionService descriptionService;
66
67 @Autowired
68 private AbstractBeanInitializer beanInitializer;
69
70 @Autowired
71 private ITaxonService taxonService;
72
73
74
75 public OccurrenceServiceImpl() {
76 logger.debug("Load OccurrenceService Bean");
77 }
78
79 /* (non-Javadoc)
80 * @see eu.etaxonomy.cdm.api.service.IIdentifiableEntityService#updateTitleCache()
81 */
82 @Override
83 public void updateTitleCache() {
84 Class<SpecimenOrObservationBase> clazz = SpecimenOrObservationBase.class;
85 super.updateTitleCache(clazz, null, null);
86 }
87
88 /**
89 * FIXME Candidate for harmonization
90 * move to termService
91 */
92 public WaterbodyOrCountry getCountryByIso(String iso639) {
93 return this.definedTermDao.getCountryByIso(iso639);
94
95 }
96
97 /**
98 * FIXME Candidate for harmonization
99 * move to termService
100 */
101 public List<WaterbodyOrCountry> getWaterbodyOrCountryByName(String name) {
102 List<? extends DefinedTermBase> terms = this.definedTermDao.getDefinedTermByRepresentationText(name, WaterbodyOrCountry.class);
103 List<WaterbodyOrCountry> countries = new ArrayList<WaterbodyOrCountry>();
104 for (int i=0;i<terms.size();i++){
105 countries.add((WaterbodyOrCountry)terms.get(i));
106 }
107 return countries;
108 }
109
110 @Autowired
111 protected void setDao(IOccurrenceDao dao) {
112 this.dao = dao;
113 }
114
115 public Pager<DerivationEvent> getDerivationEvents(SpecimenOrObservationBase occurence, Integer pageSize,Integer pageNumber, List<String> propertyPaths) {
116 Integer numberOfResults = dao.countDerivationEvents(occurence);
117
118 List<DerivationEvent> results = new ArrayList<DerivationEvent>();
119 if(numberOfResults > 0) { // no point checking again
120 results = dao.getDerivationEvents(occurence, pageSize, pageNumber,propertyPaths);
121 }
122
123 return new DefaultPagerImpl<DerivationEvent>(pageNumber, numberOfResults, pageSize, results);
124 }
125
126 public Pager<DeterminationEvent> getDeterminations(SpecimenOrObservationBase occurrence, TaxonBase taxonBase, Integer pageSize,Integer pageNumber, List<String> propertyPaths) {
127 Integer numberOfResults = dao.countDeterminations(occurrence, taxonBase);
128
129 List<DeterminationEvent> results = new ArrayList<DeterminationEvent>();
130 if(numberOfResults > 0) { // no point checking again
131 results = dao.getDeterminations(occurrence,taxonBase, pageSize, pageNumber, propertyPaths);
132 }
133
134 return new DefaultPagerImpl<DeterminationEvent>(pageNumber, numberOfResults, pageSize, results);
135 }
136
137 public Pager<Media> getMedia(SpecimenOrObservationBase occurence,Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
138 Integer numberOfResults = dao.countMedia(occurence);
139
140 List<Media> results = new ArrayList<Media>();
141 if(numberOfResults > 0) { // no point checking again
142 results = dao.getMedia(occurence, pageSize, pageNumber, propertyPaths);
143 }
144
145 return new DefaultPagerImpl<Media>(pageNumber, numberOfResults, pageSize, results);
146 }
147
148 /* (non-Javadoc)
149 * @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)
150 */
151 public Pager<SpecimenOrObservationBase> list(Class<? extends SpecimenOrObservationBase> type, TaxonBase determinedAs, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {
152 Integer numberOfResults = dao.count(type,determinedAs);
153 List<SpecimenOrObservationBase> results = new ArrayList<SpecimenOrObservationBase>();
154 pageNumber = pageNumber == null ? 0 : pageNumber;
155 if(numberOfResults > 0) { // no point checking again
156 Integer start = pageSize == null ? 0 : pageSize * pageNumber;
157 results = dao.list(type,determinedAs, pageSize, start, orderHints,propertyPaths);
158 }
159 return new DefaultPagerImpl<SpecimenOrObservationBase>(pageNumber, numberOfResults, pageSize, results);
160 }
161
162 @Override
163 public List<UuidAndTitleCache<DerivedUnitBase>> getDerivedUnitBaseUuidAndTitleCache() {
164 return dao.getDerivedUnitBaseUuidAndTitleCache();
165 }
166
167 @Override
168 public List<UuidAndTitleCache<FieldObservation>> getFieldObservationUuidAndTitleCache() {
169 return dao.getFieldObservationUuidAndTitleCache();
170 }
171
172 /* (non-Javadoc)
173 * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#getDerivedUnitFacade(eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase)
174 */
175 @Override
176 public DerivedUnitFacade getDerivedUnitFacade(DerivedUnitBase derivedUnit, List<String> propertyPaths) throws DerivedUnitFacadeNotSupportedException {
177 derivedUnit = (DerivedUnitBase<?>)dao.load(derivedUnit.getUuid(), null);
178 DerivedUnitFacadeConfigurator config = DerivedUnitFacadeConfigurator.NewInstance();
179 config.setThrowExceptionForNonSpecimenPreservationMethodRequest(false);
180 DerivedUnitFacade derivedUnitFacade = DerivedUnitFacade.NewInstance(derivedUnit, config);
181 beanInitializer.initialize(derivedUnitFacade, propertyPaths);
182 return derivedUnitFacade;
183 }
184
185 /* (non-Javadoc)
186 * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#listDerivedUnitFacades(eu.etaxonomy.cdm.model.description.DescriptionBase, java.util.List)
187 */
188 @Override
189 public List<DerivedUnitFacade> listDerivedUnitFacades(
190 DescriptionBase description, List<String> propertyPaths) {
191
192 List<DerivedUnitFacade> derivedUnitFacadeList = new ArrayList<DerivedUnitFacade>();
193 IndividualsAssociation tempIndividualsAssociation;
194 SpecimenOrObservationBase tempSpecimenOrObservationBase;
195 List<DescriptionElementBase> elements = descriptionService.listDescriptionElements(description, null, IndividualsAssociation.class, null, 0, Arrays.asList(new String []{"associatedSpecimenOrObservation"}));
196 for(DescriptionElementBase element : elements){
197 if(element instanceof IndividualsAssociation){
198 tempIndividualsAssociation = (IndividualsAssociation)element;
199 if(tempIndividualsAssociation.getAssociatedSpecimenOrObservation() != null){
200 tempSpecimenOrObservationBase = HibernateProxyHelper.deproxy(tempIndividualsAssociation.getAssociatedSpecimenOrObservation(), SpecimenOrObservationBase.class);
201 if(tempSpecimenOrObservationBase instanceof DerivedUnitBase){
202 try {
203 derivedUnitFacadeList.add(DerivedUnitFacade.NewInstance((DerivedUnitBase)tempSpecimenOrObservationBase));
204 } catch (DerivedUnitFacadeNotSupportedException e) {
205 logger.warn(tempIndividualsAssociation.getAssociatedSpecimenOrObservation().getTitleCache() + " : " +e.getMessage());
206 }
207 }
208 }
209
210 }
211 }
212
213 beanInitializer.initializeAll(derivedUnitFacadeList, propertyPaths);
214
215 return derivedUnitFacadeList;
216 }
217
218 /* (non-Javadoc)
219 * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#listSpecimenOrObservationsFor(java.lang.Class, eu.etaxonomy.cdm.model.taxon.Taxon, java.util.List)
220 */
221 @Override
222 public <T extends SpecimenOrObservationBase> List<T> listByAnyAssociation(Class<T> type,
223 Taxon associatedTaxon, Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths)
224 {
225
226 associatedTaxon = (Taxon) taxonService.load(associatedTaxon.getUuid());
227 return dao.listByAnyAssociation(type, associatedTaxon, limit, start, orderHints, propertyPaths);
228
229 }
230
231
232 }