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