Project

General

Profile

Download (12.4 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2017 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
package eu.etaxonomy.cdm.vaadin.model.registration;
10

    
11
import java.net.URI;
12
import java.util.UUID;
13

    
14
import org.apache.commons.collections.CollectionUtils;
15

    
16
import eu.etaxonomy.cdm.api.utility.DerivedUnitConversionException;
17
import eu.etaxonomy.cdm.api.utility.DerivedUnitConverter;
18
import eu.etaxonomy.cdm.api.utility.DerivedUnitConverterFactory;
19
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
20
import eu.etaxonomy.cdm.model.common.DefinedTerm;
21
import eu.etaxonomy.cdm.model.common.IdentifiableSource;
22
import eu.etaxonomy.cdm.model.media.Media;
23
import eu.etaxonomy.cdm.model.media.MediaRepresentation;
24
import eu.etaxonomy.cdm.model.media.MediaRepresentationPart;
25
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
26
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
27
import eu.etaxonomy.cdm.model.occurrence.Collection;
28
import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
29
import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
30
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
31
import eu.etaxonomy.cdm.model.occurrence.MediaSpecimen;
32
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
33
import eu.etaxonomy.cdm.model.reference.Reference;
34

    
35
/**
36
 * A DTO which is use in the context of the {@link SpecimenTypeDesignationWorkingSetDTO} which is backed up
37
 * <code>SpecimenTypeDesignation.typeSpecimen.derivedFrom.type</code> object graph.
38
 * <p>
39
 * The contained {@link DerivedUnit} either is a {@link MediaSpecimen} with or a {@link DerivedUnit}, depending on the
40
 * "kind of unit" which is defined by the associated <code>DerivationEvent.type</code>:
41
 *
42
 * <ul>
43
 * <li>{@link DerivationEventType#GATHERING_IN_SITU()} -&gt; {@link DerivedUnit}</li>
44
 * <li>{@link DerivationEventTypes#CULTURE_METABOLIC_INACTIVE()} -&gt; {@link DerivedUnit}</li>
45
 * <li>{@link DerivationEventTypes#UNPUBLISHED_IMAGE()} -&gt; {@link MediaSpecimen}</li>
46
 * <li>{@link DerivationEventTypes#PUBLISHED_IMAGE()} -&gt; {@link MediaSpecimen}</li>
47
 * </ul>
48
 *
49
 * @author a.kohlbecker
50
 * @since Jun 22, 2017
51
 *
52
 */
53
public class SpecimenTypeDesignationDTO {
54

    
55
    SpecimenTypeDesignation std;
56

    
57
    /**
58
     * @return the std
59
     */
60
    public SpecimenTypeDesignation asSpecimenTypeDesignation() {
61
        return std;
62
    }
63

    
64
    /**
65
     * Creates an new new instance of SpecimenTypeDesignationDTO which is backed up
66
     * by an newly instantiated <code>SpecimenTypeDesignation.typeSpecimen.derivedFrom.type</code> object graph.
67
     */
68
    public SpecimenTypeDesignationDTO(){
69
        this(SpecimenTypeDesignation.NewInstance());
70
    }
71

    
72
    /**
73
     * Creates a new instance of SpecimenTypeDesignationDTO.
74
     *
75
     * The constructor assures that <code>SpecimenTypeDesignation.typeSpecimen.derivedFrom.type</code> are never null.
76
     * That is in case the supplied std parameter or if any of the above listed properties is null the missing instances
77
     * are created and added to the object graph.
78
     *
79
     * @param std
80
     */
81
    public SpecimenTypeDesignationDTO(SpecimenTypeDesignation std) {
82
        this.std = std;
83
        if(std.getTypeSpecimen() == null){
84
            DerivedUnit derivedUnit = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen);
85
            std.setTypeSpecimen(derivedUnit);
86
        }
87
        if(std.getTypeSpecimen().getDerivedFrom() == null){
88
            DerivationEvent derivedFrom = DerivationEvent.NewInstance(DerivationEventType.GATHERING_IN_SITU());
89
            std.getTypeSpecimen().setDerivedFrom(derivedFrom);
90
        }
91
    }
92

    
93
    public DefinedTerm getKindOfUnit(){
94
        return std.getTypeSpecimen().getKindOfUnit();
95
    }
96

    
97
    public void setKindOfUnit(DefinedTerm kindOfUnit) throws DerivedUnitConversionException{
98

    
99
        std.getTypeSpecimen().setKindOfUnit(kindOfUnit);
100
        DerivedUnit typeSpecimen = HibernateProxyHelper.deproxy(std.getTypeSpecimen());
101

    
102
        Class<? extends DerivedUnit> requiredSpecimenType = specimenTypeFor(kindOfUnit);
103
        Class<? extends DerivedUnit> currentType = typeSpecimen.getClass();
104

    
105
        if(!requiredSpecimenType.equals(currentType)){
106

    
107
            DerivedUnit convertedSpecimen;
108

    
109
            SpecimenOrObservationType convertToType = specimenOrObservationTypeFor(kindOfUnit);
110
            if(requiredSpecimenType.equals(MediaSpecimen.class)){
111
                DerivedUnitConverter<MediaSpecimen> converter = DerivedUnitConverterFactory.createDerivedUnitConverter(typeSpecimen, MediaSpecimen.class);
112
                convertedSpecimen = converter.convertTo((Class<MediaSpecimen>)requiredSpecimenType, convertToType);
113
            } else {
114
                 if(currentType == MediaSpecimen.class){
115
                     MediaSpecimen mediaSpecimen = (MediaSpecimen)typeSpecimen;
116
                     // set null to allow conversion
117
                     mediaSpecimen.setMediaSpecimen(null);
118
                 }
119
                DerivedUnitConverter<DerivedUnit> converter = DerivedUnitConverterFactory.createDerivedUnitConverter(typeSpecimen, DerivedUnit.class);
120
                convertedSpecimen = converter.convertTo((Class<DerivedUnit>)requiredSpecimenType, convertToType);
121
            }
122

    
123
            std.setTypeSpecimen(convertedSpecimen);
124
        }
125
    }
126

    
127

    
128
    /**
129
     * See constructor doc.
130
     *
131
     * @param kindOfUnit
132
     * @return
133
     *      either <code>DerivedUnit</code> or <code>MediaSpecimen</code> never null.
134
     *  <code>DerivedUnit</code> is the fall back return value.
135
     */
136
    private Class<?  extends DerivedUnit> specimenTypeFor(DefinedTerm derivationEventType) {
137
        UUID detUuid = derivationEventType.getUuid();
138

    
139
        if(detUuid.equals(KindOfUnitTerms.SPECIMEN().getUuid())) {
140
            return DerivedUnit.class;
141
        }
142
        if(detUuid.equals(KindOfUnitTerms.CULTURE_METABOLIC_INACTIVE().getUuid())) {
143
            return DerivedUnit.class;
144
        }
145
        if(detUuid.equals(KindOfUnitTerms.PUBLISHED_IMAGE().getUuid())) {
146
            return MediaSpecimen.class;
147
        }
148
        if(detUuid.equals(KindOfUnitTerms.UNPUBLISHED_IMAGE().getUuid())) {
149
            return MediaSpecimen.class;
150
        }
151
        return DerivedUnit.class;
152
    }
153

    
154
    private SpecimenOrObservationType specimenOrObservationTypeFor(DefinedTerm derivationEventType) {
155

    
156
        UUID detUuid = derivationEventType.getUuid();
157

    
158
        if(detUuid.equals(KindOfUnitTerms.SPECIMEN().getUuid())) {
159
            return SpecimenOrObservationType.PreservedSpecimen;
160
        }
161
        if(detUuid.equals(KindOfUnitTerms.CULTURE_METABOLIC_INACTIVE().getUuid())) {
162
            return SpecimenOrObservationType.LivingSpecimen;
163
        }
164
        if(detUuid.equals(KindOfUnitTerms.PUBLISHED_IMAGE().getUuid())) {
165
            return SpecimenOrObservationType.StillImage;
166
        }
167
        if(detUuid.equals(KindOfUnitTerms.UNPUBLISHED_IMAGE().getUuid())) {
168
            return SpecimenOrObservationType.StillImage;
169
        }
170
       return SpecimenOrObservationType.PreservedSpecimen;
171

    
172
    }
173

    
174
    public SpecimenTypeDesignationStatus getTypeStatus(){
175
        return HibernateProxyHelper.deproxy(std.getTypeStatus(), SpecimenTypeDesignationStatus.class);
176
    }
177

    
178
    public void setTypeStatus(SpecimenTypeDesignationStatus typeStatus){
179
        std.setTypeStatus(typeStatus);
180
    }
181

    
182
    public Collection getCollection(){
183
        return std.getTypeSpecimen().getCollection();
184
    }
185

    
186
    public void setCollection(Collection collection){
187
        std.getTypeSpecimen().setCollection(collection);
188
    }
189

    
190
    public String getAccessionNumber(){
191
        return std.getTypeSpecimen().getAccessionNumber();
192
    }
193

    
194
    public void setAccessionNumber(String accessionNumber){
195
        std.getTypeSpecimen().setAccessionNumber(accessionNumber);
196
    }
197

    
198
    public URI getPreferredStableUri(){
199
        return std.getTypeSpecimen().getPreferredStableUri();
200
    }
201

    
202
    public void setPreferredStableUri(URI uri){
203
        std.getTypeSpecimen().setPreferredStableUri(uri);
204
    }
205

    
206
    public URI getMediaUri(){
207
        if(checkMediaSpecimen()){
208
            MediaRepresentationPart part = findMediaRepresentationPart();
209
            if(part != null){
210
                return part.getUri();
211
            }
212
        }
213
        return null;
214
    }
215

    
216
    public void setMediaUri(URI mediaUri){
217
        if(checkMediaSpecimen()){
218
            MediaRepresentationPart part = findOrMakeMediaRepresentationPart();
219
            part.setUri(mediaUri);
220
        }
221
    }
222

    
223
    public Reference getMediaSpecimenReference(){
224
        if(checkMediaSpecimen()){
225
            IdentifiableSource source = findMediaSpecimenIdentifieableSource();
226
            if(source != null){
227
                return source.getCitation();
228
            }
229
        }
230
        return null;
231
    }
232

    
233
    public void setMediaSpecimenReference(Reference reference){
234
        if(checkMediaSpecimen()){
235
            IdentifiableSource source = findOrMakeMediaSpecimenIdentifieableSource();
236
            source.setCitation(reference);
237
        }
238
    }
239

    
240
    public String getMediaSpecimenReferenceDetail(){
241
        if(checkMediaSpecimen()){
242
            IdentifiableSource source = findMediaSpecimenIdentifieableSource();
243
            if(source != null){
244
                return source.getCitationMicroReference();
245
            }
246
        }
247
        return null;
248
    }
249

    
250
    public void setMediaSpecimenReferenceDetail(String referenceDetail){
251
        if(checkMediaSpecimen()){
252
            IdentifiableSource source = findOrMakeMediaSpecimenIdentifieableSource();
253
            source.setCitationMicroReference(referenceDetail);
254
        }
255
    }
256

    
257
    /**
258
     * @return
259
     */
260
    private IdentifiableSource findMediaSpecimenIdentifieableSource() {
261
        IdentifiableSource source = null;
262
        Media media = findMediaSpecimen().getMediaSpecimen();
263
        if(media != null){
264
            // FIXME use marker type to tag the MediaSpecimenReference and make sure that there is always only one.
265
            if(!CollectionUtils.isEmpty(media.getSources())){
266
                source = media.getSources().iterator().next();
267
            }
268
        }
269
        return source;
270
    }
271

    
272
    /**
273
     *
274
     */
275
    private MediaRepresentationPart findMediaRepresentationPart() {
276

    
277
        Media media = findMediaSpecimen().getMediaSpecimen();
278
        if(media != null){
279
            if(!CollectionUtils.isEmpty(media.getRepresentations())){
280
                MediaRepresentation repr = media.getRepresentations().iterator().next();
281
                if(!CollectionUtils.isEmpty(repr.getParts())) {
282
                    MediaRepresentationPart part = repr.getParts().iterator().next();
283
                    return part;
284
                }
285
            }
286
        }
287
        return null;
288
    }
289

    
290
    private MediaRepresentationPart findOrMakeMediaRepresentationPart() {
291

    
292
        if(findMediaSpecimen().getMediaSpecimen() == null){
293
            findMediaSpecimen().setMediaSpecimen(Media.NewInstance());
294
        }
295
        Media media = findMediaSpecimen().getMediaSpecimen();
296
        if(CollectionUtils.isEmpty(media.getRepresentations())){
297
            media.addRepresentation(MediaRepresentation.NewInstance());
298
        }
299
        MediaRepresentation repr = media.getRepresentations().iterator().next();
300
        if(CollectionUtils.isEmpty(repr.getParts())) {
301
            repr.addRepresentationPart(MediaRepresentationPart.NewInstance(null, null));
302
        }
303
        MediaRepresentationPart part = repr.getParts().iterator().next();
304

    
305
        return part;
306
    }
307

    
308
    /**
309
     * @return
310
     */
311
    private IdentifiableSource findOrMakeMediaSpecimenIdentifieableSource() {
312
        IdentifiableSource source ;
313
        Media media = findMediaSpecimen().getMediaSpecimen();
314
        if(media == null){
315
            media = Media.NewInstance();
316
            findMediaSpecimen().setMediaSpecimen(Media.NewInstance());
317
        }
318
        if(CollectionUtils.isEmpty(media.getSources())){
319
           source = IdentifiableSource.NewPrimaryMediaSourceInstance(null, null);
320
           media.addSource(source);
321
        } else {
322
            source = media.getSources().iterator().next();
323
        }
324
        return source;
325
    }
326

    
327
    /**
328
     * @return
329
     */
330
    public boolean checkMediaSpecimen() {
331
        return findMediaSpecimen() != null;
332
    }
333

    
334
    /**
335
     * @return
336
     */
337
    private MediaSpecimen findMediaSpecimen() {
338
        DerivedUnit sp = HibernateProxyHelper.deproxy(std.getTypeSpecimen());
339
        if(MediaSpecimen.class.isAssignableFrom(sp.getClass())){
340
            return (MediaSpecimen) sp;
341
        }
342
        return null;
343
    }
344

    
345
}
(4-4/6)