2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.cdm
.api
.service
;
12 import java
.util
.ArrayList
;
13 import java
.util
.List
;
15 import java
.util
.UUID
;
17 import org
.springframework
.beans
.factory
.annotation
.Autowired
;
18 import org
.springframework
.stereotype
.Service
;
19 import org
.springframework
.transaction
.annotation
.Transactional
;
21 import eu
.etaxonomy
.cdm
.api
.service
.config
.DeleteConfiguratorBase
;
22 import eu
.etaxonomy
.cdm
.api
.service
.config
.MediaDeletionConfigurator
;
23 import eu
.etaxonomy
.cdm
.api
.service
.exception
.ReferencedObjectUndeletableException
;
24 import eu
.etaxonomy
.cdm
.api
.service
.pager
.Pager
;
25 import eu
.etaxonomy
.cdm
.api
.service
.pager
.impl
.DefaultPagerImpl
;
26 import eu
.etaxonomy
.cdm
.common
.monitor
.IProgressMonitor
;
27 import eu
.etaxonomy
.cdm
.hibernate
.HibernateProxyHelper
;
28 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
29 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionBase
;
30 import eu
.etaxonomy
.cdm
.model
.description
.MediaKey
;
31 import eu
.etaxonomy
.cdm
.model
.description
.SpecimenDescription
;
32 import eu
.etaxonomy
.cdm
.model
.description
.TaxonDescription
;
33 import eu
.etaxonomy
.cdm
.model
.description
.TaxonNameDescription
;
34 import eu
.etaxonomy
.cdm
.model
.description
.TextData
;
35 import eu
.etaxonomy
.cdm
.model
.location
.NamedArea
;
36 import eu
.etaxonomy
.cdm
.model
.media
.Media
;
37 import eu
.etaxonomy
.cdm
.model
.media
.MediaRepresentation
;
38 import eu
.etaxonomy
.cdm
.model
.media
.Rights
;
39 import eu
.etaxonomy
.cdm
.model
.name
.TaxonName
;
40 import eu
.etaxonomy
.cdm
.model
.occurrence
.MediaSpecimen
;
41 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
42 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
43 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
44 import eu
.etaxonomy
.cdm
.persistence
.dao
.media
.IMediaDao
;
45 import eu
.etaxonomy
.cdm
.strategy
.cache
.common
.IIdentifiableEntityCacheStrategy
;
48 @Transactional(readOnly
=true)
49 public class MediaServiceImpl
extends IdentifiableServiceBase
<Media
,IMediaDao
> implements IMediaService
{
53 protected void setDao(IMediaDao dao
) {
58 private IDescriptionService descriptionService
;
61 private IOccurrenceService specimenService
;
63 private ITaxonService taxonService
;
65 private INameService nameService
;
68 public Pager
<MediaKey
> getMediaKeys(Set
<Taxon
> taxonomicScope
, Set
<NamedArea
> geoScopes
, Integer pageSize
, Integer pageNumber
, List
<String
> propertyPaths
) {
69 Integer numberOfResults
= dao
.countMediaKeys(taxonomicScope
, geoScopes
);
71 List
<MediaKey
> results
= new ArrayList
<MediaKey
>();
72 if(numberOfResults
> 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
73 results
= dao
.getMediaKeys(taxonomicScope
, geoScopes
, pageSize
, pageNumber
, propertyPaths
);
76 return new DefaultPagerImpl
<MediaKey
>(pageNumber
, numberOfResults
, pageSize
, results
);
80 public Pager
<Rights
> getRights(Media t
, Integer pageSize
, Integer pageNumber
, List
<String
> propertyPaths
) {
81 Integer numberOfResults
= dao
.countRights(t
);
83 List
<Rights
> results
= new ArrayList
<Rights
>();
84 if(numberOfResults
> 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
85 results
= dao
.getRights(t
, pageSize
, pageNumber
,propertyPaths
);
88 return new DefaultPagerImpl
<Rights
>(pageNumber
, numberOfResults
, pageSize
, results
);
92 * @see eu.etaxonomy.cdm.api.service.IIdentifiableEntityService#updateTitleCache(java.lang.Integer, eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy)
95 @Transactional(readOnly
= false)
96 public void updateTitleCache(Class
<?
extends Media
> clazz
, Integer stepSize
, IIdentifiableEntityCacheStrategy
<Media
> cacheStrategy
, IProgressMonitor monitor
) {
97 //IIdentifiableEntityCacheStrategy<Media> cacheStrategy = MediaDefaultCacheStrategy();
101 super.updateTitleCacheImpl(clazz
, stepSize
, cacheStrategy
, monitor
);
105 * @see eu.etaxonomy.cdm.api.service.IMediaService#delete(java.util.UUID, eu.etaxonomy.cdm.api.service.config.MediaDeletionConfigurator)
108 @Transactional(readOnly
=false)
109 public DeleteResult
delete(UUID mediaUuid
, MediaDeletionConfigurator config
) {
110 DeleteResult result
= new DeleteResult();
111 Media media
= this.load(mediaUuid
);
113 result
= isDeletable(mediaUuid
, config
);
114 CdmBase updatedObject
= null;
116 Set
<CdmBase
> references
= commonService
.getReferencingObjectsForDeletion(media
);
117 String message
= null;
118 for (CdmBase ref
: references
){
120 if (ref
instanceof TextData
){
122 TextData textData
= HibernateProxyHelper
.deproxy(ref
, TextData
.class);
123 DescriptionBase description
= HibernateProxyHelper
.deproxy(textData
.getInDescription(), DescriptionBase
.class);
125 if (description
.isImageGallery()){
126 if (description
instanceof TaxonDescription
){
127 TaxonDescription desc
= HibernateProxyHelper
.deproxy(description
, TaxonDescription
.class);
128 if (desc
.getTaxon() == null ){
130 } else if ( (config
.isDeleteFromDescription() && config
.getDeleteFrom() instanceof Taxon
&& config
.getDeleteFrom().getId() == desc
.getTaxon().getId())|| config
.isDeleteFromEveryWhere()){
131 Taxon taxon
= desc
.getTaxon();
132 updatedObject
= taxon
;
134 while(textData
.getMedia().contains(media
)){
135 textData
.removeMedia(media
);
137 if (textData
.getMedia().isEmpty()){
138 desc
.removeElement(textData
);
140 if (desc
.getElements().isEmpty()){
141 taxon
.removeDescription(desc
);
145 // this should not be happen, because it is not deletable. see isDeletable
150 } else if (description
instanceof SpecimenDescription
){
151 SpecimenDescription desc
= HibernateProxyHelper
.deproxy(description
, SpecimenDescription
.class);
152 if (desc
.getDescribedSpecimenOrObservation() == null ){
154 } else if ((config
.isDeleteFromDescription() && config
.getDeleteFrom() instanceof SpecimenOrObservationBase
&& config
.getDeleteFrom().getId() == desc
.getDescribedSpecimenOrObservation().getId()) || config
.isDeleteFromEveryWhere()){
155 SpecimenOrObservationBase
<?
> specimen
= desc
.getDescribedSpecimenOrObservation();
156 updatedObject
= specimen
;
157 desc
.removeElement(textData
);
158 textData
.removeMedia(media
);
159 if (desc
.getElements().isEmpty()){
160 specimen
.removeDescription(desc
);
166 }else if (description
instanceof TaxonNameDescription
){
167 TaxonNameDescription desc
= HibernateProxyHelper
.deproxy(description
, TaxonNameDescription
.class);
169 if (desc
.getTaxonName() == null ){
171 } else if ((config
.isDeleteFromDescription() && config
.getDeleteFrom() instanceof TaxonName
&& config
.getDeleteFrom().getId() == desc
.getTaxonName().getId()) || config
.isDeleteFromEveryWhere()){
172 TaxonName name
= desc
.getTaxonName();
173 updatedObject
= name
;
174 desc
.removeElement(textData
);
175 textData
.removeMedia(media
);
176 if (desc
.getElements().isEmpty()){
177 name
.removeDescription(desc
);
187 } else if ((ref
instanceof MediaSpecimen
&& config
.getDeleteFrom().getId() == ref
.getId() && config
.getDeleteFrom() instanceof MediaSpecimen
)
188 || (ref
instanceof MediaSpecimen
&& config
.isDeleteFromEveryWhere())){
189 MediaSpecimen mediaSpecimen
= HibernateProxyHelper
.deproxy(ref
, MediaSpecimen
.class);
191 mediaSpecimen
.setMediaSpecimen(null);
192 updatedObject
= mediaSpecimen
;
194 }else if (ref
instanceof MediaRepresentation
){
208 if (updatedObject
instanceof
210 taxonService
.update((TaxonBase
)updatedObject
);
211 result
.addUpdatedObject(updatedObject
);
213 if (updatedObject
instanceof
215 nameService
.update((TaxonName
)updatedObject
);
217 if (updatedObject
instanceof
218 SpecimenOrObservationBase
){
219 specimenService
.update((SpecimenOrObservationBase
)updatedObject
);
228 public DeleteResult
isDeletable(UUID mediaUuid
, DeleteConfiguratorBase config
){
229 DeleteResult result
= new DeleteResult();
230 Media media
= this.load(mediaUuid
);
231 Set
<CdmBase
> references
= commonService
.getReferencingObjectsForDeletion(media
);
232 MediaDeletionConfigurator mediaConfig
= (MediaDeletionConfigurator
)config
;
233 CdmBase deleteFrom
= mediaConfig
.getDeleteFrom();
235 if (mediaConfig
.isDeleteFromEveryWhere()){
238 for (CdmBase ref
: references
){
239 String message
= null;
240 if (ref
instanceof MediaRepresentation
){
243 if (ref
instanceof TextData
){
244 TextData textData
= HibernateProxyHelper
.deproxy(ref
, TextData
.class);
245 DescriptionBase description
= HibernateProxyHelper
.deproxy(textData
.getInDescription(), DescriptionBase
.class);
247 if (description
instanceof TaxonDescription
){
248 TaxonDescription desc
= HibernateProxyHelper
.deproxy(description
, TaxonDescription
.class);
249 if (desc
.getTaxon() == null || (mediaConfig
.isDeleteFromDescription() && (deleteFrom
instanceof Taxon
&& ((Taxon
)deleteFrom
).getId() == desc
.getTaxon().getId()))){
252 message
= "The media can't be deleted from the database because it is referenced by another taxon. ("+desc
.getTaxon().getTitleCache()+")";
256 } else if (description
instanceof SpecimenDescription
){
257 SpecimenDescription desc
= HibernateProxyHelper
.deproxy(description
, SpecimenDescription
.class);
258 if (desc
.getDescribedSpecimenOrObservation() == null || (mediaConfig
.isDeleteFromDescription() && (deleteFrom
instanceof SpecimenOrObservationBase
&& ((SpecimenOrObservationBase
)deleteFrom
).getId() == desc
.getDescribedSpecimenOrObservation().getId()))){
261 message
= "The media can't be deleted from the database because it is referenced by another specimen or observation. ("+desc
.getDescribedSpecimenOrObservation().getTitleCache()+")";
264 } else if (description
instanceof TaxonNameDescription
){
265 TaxonNameDescription desc
= HibernateProxyHelper
.deproxy(description
, TaxonNameDescription
.class);
266 if (desc
.getTaxonName() == null || (mediaConfig
.isDeleteFromDescription() && (deleteFrom
instanceof TaxonName
&& ((TaxonName
)deleteFrom
).getId() == desc
.getTaxonName().getId()))){
269 message
= "The media can't be deleted from the database because it is referenced by another specimen or observation. ("+desc
.getDescribedSpecimenOrObservation().getTitleCache()+")";
275 message
= "The media can't be completely deleted because it is referenced by another " + ref
.getUserFriendlyTypeName() ;
277 if (message
!= null){
278 result
.addException(new ReferencedObjectUndeletableException(message
));
279 result
.addRelatedObject(ref
);