Project

General

Profile

Download (13.9 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2007 EDIT
3
 * European Distributed Institute of Taxonomy
4
 * http://www.e-taxonomy.eu
5
 *
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.
8
 */
9

    
10
package eu.etaxonomy.cdm.api.service;
11

    
12
import java.util.ArrayList;
13
import java.util.List;
14
import java.util.Set;
15
import java.util.UUID;
16

    
17
import org.springframework.beans.factory.annotation.Autowired;
18
import org.springframework.stereotype.Service;
19
import org.springframework.transaction.annotation.Transactional;
20

    
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;
46

    
47
@Service
48
@Transactional(readOnly=true)
49
public class MediaServiceImpl extends IdentifiableServiceBase<Media,IMediaDao> implements IMediaService {
50

    
51
	@Override
52
    @Autowired
53
	protected void setDao(IMediaDao dao) {
54
		this.dao = dao;
55
	}
56

    
57
	 @Autowired
58
	 private IDescriptionService descriptionService;
59

    
60
	 @Autowired
61
     private IOccurrenceService specimenService;
62
	 @Autowired
63
     private ITaxonService taxonService;
64
	 @Autowired
65
     private INameService nameService;
66

    
67
	@Override
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);
70

    
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);
74
		}
75

    
76
		return new DefaultPagerImpl<MediaKey>(pageNumber, numberOfResults, pageSize, results);
77
	}
78

    
79
	@Override
80
    public Pager<Rights> getRights(Media t, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
81
        Integer numberOfResults = dao.countRights(t);
82

    
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);
86
		}
87

    
88
		return new DefaultPagerImpl<Rights>(pageNumber, numberOfResults, pageSize, results);
89
	}
90

    
91
	/* (non-Javadoc)
92
	 * @see eu.etaxonomy.cdm.api.service.IIdentifiableEntityService#updateTitleCache(java.lang.Integer, eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy)
93
	 */
94
	@Override
95
	@Transactional(readOnly = false)
96
    public void updateTitleCache(Class<? extends Media> clazz, Integer stepSize, IIdentifiableEntityCacheStrategy<Media> cacheStrategy, IProgressMonitor monitor) {
97
		//IIdentifiableEntityCacheStrategy<Media> cacheStrategy = MediaDefaultCacheStrategy();
98
		if (clazz == null){
99
			clazz = Media.class;
100
		}
101
		super.updateTitleCacheImpl(clazz, stepSize, cacheStrategy, monitor);
102
	}
103

    
104
    /* (non-Javadoc)
105
     * @see eu.etaxonomy.cdm.api.service.IMediaService#delete(java.util.UUID, eu.etaxonomy.cdm.api.service.config.MediaDeletionConfigurator)
106
     */
107
    @Override
108
    @Transactional(readOnly=false)
109
    public DeleteResult delete(UUID mediaUuid, MediaDeletionConfigurator config) {
110
        DeleteResult result = new DeleteResult();
111
        Media media = this.load(mediaUuid);
112

    
113
        result = isDeletable(mediaUuid, config);
114
        CdmBase updatedObject = null;
115
        if (result.isOk()){
116
            Set<CdmBase> references = commonService.getReferencingObjectsForDeletion(media);
117
            String message = null;
118
            for (CdmBase ref: references){
119

    
120
               if (ref instanceof TextData){
121

    
122
                    TextData textData = HibernateProxyHelper.deproxy(ref, TextData.class);
123
                    DescriptionBase description = HibernateProxyHelper.deproxy(textData.getInDescription(), DescriptionBase.class);
124

    
125
                    if (description.isImageGallery()){
126
                        if (description instanceof TaxonDescription){
127
                            TaxonDescription desc = HibernateProxyHelper.deproxy(description, TaxonDescription.class);
128
                            if (desc.getTaxon() == null ){
129
                                continue;
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;
133
                                desc.removeElement(textData);
134
                                textData.removeMedia(media);
135
                                if (desc.getElements().isEmpty()){
136
                                    taxon.removeDescription(desc);
137
                                }
138

    
139
                            } else {
140
                                // this should not be happen, because it is not deletable. see isDeletable
141
                                result.setAbort();
142

    
143

    
144
                            }
145
                        } else if (description instanceof SpecimenDescription){
146
                            SpecimenDescription desc = HibernateProxyHelper.deproxy(description, SpecimenDescription.class);
147
                            if (desc.getDescribedSpecimenOrObservation() == null ){
148
                                continue;
149
                            } else if ((config.isDeleteFromDescription() && config.getDeleteFrom() instanceof SpecimenOrObservationBase  && config.getDeleteFrom().getId() == desc.getDescribedSpecimenOrObservation().getId())  || config.isDeleteFromEveryWhere()){
150
                                SpecimenOrObservationBase<?> specimen = desc.getDescribedSpecimenOrObservation();
151
                                updatedObject = specimen;
152
                                desc.removeElement(textData);
153
                                textData.removeMedia(media);
154
                                if (desc.getElements().isEmpty()){
155
                                    specimen.removeDescription(desc);
156
                                }
157
                            } else {
158
                             // this should not be happen, because it is not deletable. see isDeletable
159
                                result.setAbort();
160

    
161

    
162
                            }
163
                        }else if (description instanceof TaxonNameDescription){
164
                            TaxonNameDescription desc = HibernateProxyHelper.deproxy(description, TaxonNameDescription.class);
165

    
166
                            if (desc.getTaxonName() == null ){
167
                                continue;
168
                            } else if ((config.isDeleteFromDescription() && config.getDeleteFrom() instanceof TaxonName  && config.getDeleteFrom().getId() == desc.getTaxonName().getId())   || config.isDeleteFromEveryWhere()){
169
                                TaxonName name= desc.getTaxonName();
170
                                updatedObject = name;
171
                                desc.removeElement(textData);
172
                                textData.removeMedia(media);
173
                                if (desc.getElements().isEmpty()){
174
                                    name.removeDescription(desc);
175
                                }
176
                            } else {
177
                             // this should not be happen, because it is not deletable. see isDeletable
178
                                result.setAbort();
179

    
180

    
181
                            }
182
                        }
183
                    }
184
                }else if (ref instanceof MediaRepresentation){
185
                    MediaRepresentation mediaRep = HibernateProxyHelper.deproxy(ref, MediaRepresentation.class);
186
                    media.removeRepresentation(mediaRep);
187
                } else if (ref instanceof MediaSpecimen){
188
                    MediaSpecimen mediaSpecimen = HibernateProxyHelper.deproxy(ref, MediaSpecimen.class);
189
                    if (config.getDeleteFrom().getId() == mediaSpecimen.getId() || config.isDeleteFromEveryWhere()){
190
                        mediaSpecimen.setMediaSpecimen(null);
191
                        updatedObject = mediaSpecimen;
192
                    }
193
                }
194

    
195
            }
196
            if (result.isOk()){
197
                dao.delete(media);
198
            } else{
199
                if (updatedObject instanceof
200
                         TaxonBase){
201
                    taxonService.update((TaxonBase)updatedObject);
202
                    result.addUpdatedObject(updatedObject);
203
                }
204
                if (updatedObject instanceof
205
                        TaxonName){
206
                   nameService.update((TaxonName)updatedObject);
207
               }
208
                if (updatedObject instanceof
209
                        SpecimenOrObservationBase){
210
                   specimenService.update((SpecimenOrObservationBase)updatedObject);
211
               }
212
            }
213
        }
214
        return result;
215
    }
216

    
217

    
218
    @Override
219
    public DeleteResult isDeletable(UUID mediaUuid, DeleteConfiguratorBase config){
220
        DeleteResult result = new DeleteResult();
221
        Media media = this.load(mediaUuid);
222
        Set<CdmBase> references = commonService.getReferencingObjectsForDeletion(media);
223
        MediaDeletionConfigurator mediaConfig = (MediaDeletionConfigurator)config;
224
        CdmBase deleteFrom = mediaConfig.getDeleteFrom();
225

    
226
        if (mediaConfig.isDeleteFromEveryWhere()){
227
           return result;
228
        }
229
        for (CdmBase ref: references){
230
            String message = null;
231
            if (ref instanceof MediaRepresentation){
232
                continue;
233
            }
234
            if (ref instanceof TextData){
235
                TextData textData = HibernateProxyHelper.deproxy(ref, TextData.class);
236
                DescriptionBase description = HibernateProxyHelper.deproxy(textData.getInDescription(), DescriptionBase.class);
237
                if (description.isImageGallery()){
238
                    if (description instanceof TaxonDescription){
239
                        TaxonDescription desc = HibernateProxyHelper.deproxy(description, TaxonDescription.class);
240
                        if (desc.getTaxon() == null || (mediaConfig.isDeleteFromDescription() && (deleteFrom instanceof Taxon && ((Taxon)deleteFrom).getId() == desc.getTaxon().getId()))){
241
                            continue;
242
                        } else{
243
                            message = "The media can't be deleted from the database because it is referenced by another taxon. ("+desc.getTaxon().getTitleCache()+")";
244
                        }
245

    
246
                    } else if (description instanceof SpecimenDescription){
247
                        SpecimenDescription desc = HibernateProxyHelper.deproxy(description, SpecimenDescription.class);
248
                        if (desc.getDescribedSpecimenOrObservation() == null || (mediaConfig.isDeleteFromDescription() && (deleteFrom instanceof SpecimenOrObservationBase && ((SpecimenOrObservationBase)deleteFrom).getId() == desc.getDescribedSpecimenOrObservation().getId()))){
249
                            continue;
250
                        } else{
251
                            message = "The media can't be deleted from the database because it is referenced by another specimen or observation. ("+desc.getDescribedSpecimenOrObservation().getTitleCache()+")";
252
                        }
253
                    } else if (description instanceof TaxonNameDescription){
254
                        TaxonNameDescription desc = HibernateProxyHelper.deproxy(description, TaxonNameDescription.class);
255
                        if (desc.getTaxonName() == null || (mediaConfig.isDeleteFromDescription() && (deleteFrom instanceof TaxonName && ((TaxonName)deleteFrom).getId() == desc.getTaxonName().getId()))){
256
                            continue;
257
                        } else{
258
                            message = "The media can't be deleted from the database because it is referenced by another specimen or observation. ("+desc.getDescribedSpecimenOrObservation().getTitleCache()+")";
259
                        }
260
                    }
261
                }
262
            } else {
263
                message = "The media can't be completely deleted because it is referenced by another " + ref.getUserFriendlyTypeName() ;
264
            }
265
            if (message != null){
266
                result.addException(new ReferencedObjectUndeletableException(message));
267
                result.addRelatedObject(ref);
268

    
269
            }
270

    
271
        }
272

    
273

    
274
        return result;
275

    
276
    }
277
}
(73-73/101)