2 * Copyright (C) 2017 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.
9 package eu
.etaxonomy
.cdm
.vaadin
.model
.registration
;
12 import java
.util
.UUID
;
14 import org
.apache
.commons
.collections
.CollectionUtils
;
16 import eu
.etaxonomy
.cdm
.api
.utility
.DerivedUnitConversionException
;
17 import eu
.etaxonomy
.cdm
.api
.utility
.DerivedUnitConverter
;
18 import eu
.etaxonomy
.cdm
.hibernate
.HibernateProxyHelper
;
19 import eu
.etaxonomy
.cdm
.model
.common
.IdentifiableSource
;
20 import eu
.etaxonomy
.cdm
.model
.media
.Media
;
21 import eu
.etaxonomy
.cdm
.model
.media
.MediaRepresentation
;
22 import eu
.etaxonomy
.cdm
.model
.media
.MediaRepresentationPart
;
23 import eu
.etaxonomy
.cdm
.model
.name
.SpecimenTypeDesignation
;
24 import eu
.etaxonomy
.cdm
.model
.name
.SpecimenTypeDesignationStatus
;
25 import eu
.etaxonomy
.cdm
.model
.occurrence
.Collection
;
26 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivationEvent
;
27 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivationEventType
;
28 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivedUnit
;
29 import eu
.etaxonomy
.cdm
.model
.occurrence
.MediaSpecimen
;
30 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationType
;
31 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
34 * A DTO which is use in the context of the {@link SpecimenTypeDesignationWorkingSetDTO} which is backed up
35 * <code>SpecimenTypeDesignation.typeSpecimen.derivedFrom.type</code> object graph.
37 * The contained {@link DerivedUnit} either is a {@link MediaSpecimen} with or a {@link DerivedUnit}, depending on the
38 * "kind of unit" which is defined by the associated <code>DerivationEvent.type</code>:
41 * <li>{@link DerivationEventType#GATHERING_IN_SITU()} -> {@link DerivedUnit}</li>
42 * <li>{@link DerivationEventTypes#CULTURE_METABOLIC_INACTIVE()} -> {@link DerivedUnit}</li>
43 * <li>{@link DerivationEventTypes#UNPUBLISHED_IMAGE()} -> {@link MediaSpecimen}</li>
44 * <li>{@link DerivationEventTypes#PUBLISHED_IMAGE()} -> {@link MediaSpecimen}</li>
47 * @author a.kohlbecker
51 public class SpecimenTypeDesignationDTO
{
53 SpecimenTypeDesignation std
;
56 * Creates an new new instance of SpecimenTypeDesignationDTO which is backed up
57 * by an newly instantiated <code>SpecimenTypeDesignation.typeSpecimen.derivedFrom.type</code> object graph.
59 public SpecimenTypeDesignationDTO(){
60 this(SpecimenTypeDesignation
.NewInstance());
64 * Creates a new instance of SpecimenTypeDesignationDTO.
66 * The constructor assures that <code>SpecimenTypeDesignation.typeSpecimen.derivedFrom.type</code> are never null.
67 * That is in case the supplied std parameter or if any of the above listed properties is null the missing instances
68 * are created and added to the object graph.
72 public SpecimenTypeDesignationDTO(SpecimenTypeDesignation std
) {
74 if(std
.getTypeSpecimen() == null){
75 DerivedUnit derivedUnit
= DerivedUnit
.NewInstance(SpecimenOrObservationType
.PreservedSpecimen
);
76 std
.setTypeSpecimen(derivedUnit
);
78 if(std
.getTypeSpecimen().getDerivedFrom() == null){
79 DerivationEvent derivedFrom
= DerivationEvent
.NewInstance(DerivationEventType
.GATHERING_IN_SITU());
80 std
.getTypeSpecimen().setDerivedFrom(derivedFrom
);
84 public DerivationEventType
getDerivationEventType(){
85 return std
.getTypeSpecimen().getDerivedFrom().getType();
88 public void setDerivationEventType(DerivationEventType derivationEventType
) throws DerivedUnitConversionException
{
90 std
.getTypeSpecimen().getDerivedFrom().setType(derivationEventType
);
92 Class
<?
extends DerivedUnit
> requiredSpecimenType
= specimenTypeFor(derivationEventType
);
94 if(!requiredSpecimenType
.equals(std
.getTypeSpecimen())){
96 DerivedUnit convertedSpecimen
;
98 if(requiredSpecimenType
.equals(MediaSpecimen
.class)){
99 DerivedUnitConverter
<MediaSpecimen
> converter
= new DerivedUnitConverter
<MediaSpecimen
> (std
.getTypeSpecimen());
100 convertedSpecimen
= converter
.convertTo((Class
<MediaSpecimen
>)requiredSpecimenType
, specimenOrObservationTypeFor(derivationEventType
));
102 DerivedUnitConverter
<DerivedUnit
> converter
= new DerivedUnitConverter
<DerivedUnit
> (std
.getTypeSpecimen());
103 convertedSpecimen
= converter
.convertTo((Class
<DerivedUnit
>)requiredSpecimenType
, specimenOrObservationTypeFor(derivationEventType
));
106 std
.setTypeSpecimen(convertedSpecimen
);
112 * See constructor doc.
114 * @param derivationEventType
116 * either <code>DerivedUnit</code> or <code>MediaSpecimen</code> never null.
117 * <code>DerivedUnit</code> is the fall back return value.
119 private Class
<?
extends DerivedUnit
> specimenTypeFor(DerivationEventType derivationEventType
) {
120 UUID detUuid
= derivationEventType
.getUuid();
122 if(detUuid
.equals(DerivationEventType
.GATHERING_IN_SITU().getUuid())) {
123 return DerivedUnit
.class;
125 if(detUuid
.equals(DerivationEventTypes
.CULTURE_METABOLIC_INACTIVE().getUuid())) {
126 return DerivedUnit
.class;
128 if(detUuid
.equals(DerivationEventTypes
.PUBLISHED_IMAGE().getUuid())) {
129 return MediaSpecimen
.class;
131 if(detUuid
.equals(DerivationEventTypes
.UNPUBLISHED_IMAGE().getUuid())) {
132 return MediaSpecimen
.class;
134 return DerivedUnit
.class;
137 private SpecimenOrObservationType
specimenOrObservationTypeFor(DerivationEventType derivationEventType
) {
139 UUID detUuid
= derivationEventType
.getUuid();
141 if(detUuid
.equals(DerivationEventType
.GATHERING_IN_SITU().getUuid())) {
142 return SpecimenOrObservationType
.PreservedSpecimen
;
144 if(detUuid
.equals(DerivationEventTypes
.CULTURE_METABOLIC_INACTIVE().getUuid())) {
145 return SpecimenOrObservationType
.LivingSpecimen
;
147 if(detUuid
.equals(DerivationEventTypes
.PUBLISHED_IMAGE().getUuid())) {
148 return SpecimenOrObservationType
.StillImage
;
150 if(detUuid
.equals(DerivationEventTypes
.UNPUBLISHED_IMAGE().getUuid())) {
151 return SpecimenOrObservationType
.StillImage
;
153 return SpecimenOrObservationType
.PreservedSpecimen
;
157 public SpecimenTypeDesignationStatus
getTypeStatus(){
158 return HibernateProxyHelper
.deproxy(std
.getTypeStatus(), SpecimenTypeDesignationStatus
.class);
161 public void setTypeStatus(SpecimenTypeDesignationStatus typeStatus
){
162 std
.setTypeStatus(typeStatus
);
165 public Collection
getCollection(){
166 return std
.getTypeSpecimen().getCollection();
169 public void setCollection(Collection collection
){
170 std
.getTypeSpecimen().setCollection(collection
);
173 public String
getAccessionNumber(){
174 return std
.getTypeSpecimen().getAccessionNumber();
177 public void setAccessionNumber(String accessionNumber
){
178 std
.getTypeSpecimen().setAccessionNumber(accessionNumber
);
181 public URI
getMediaUri(){
182 if(checkMediaSpecimen()){
183 MediaRepresentationPart part
= findMediaRepresentationPart();
185 return part
.getUri();
191 public void setMediaUri(URI mediaUri
){
192 if(checkMediaSpecimen()){
193 MediaRepresentationPart part
= findOrMakeMediaRepresentationPart();
194 part
.setUri(mediaUri
);
198 public Reference
getMediaSpecimenReference(){
199 if(checkMediaSpecimen()){
200 IdentifiableSource source
= findMediaSpecimenIdentifieableSource();
202 return source
.getCitation();
208 public void setMediaSpecimenReference(Reference reference
){
209 if(checkMediaSpecimen()){
210 IdentifiableSource source
= findOrMakeMediaSpecimenIdentifieableSource();
211 source
.setCitation(reference
);
215 public String
getMediaSpecimenReferenceDetail(){
216 if(checkMediaSpecimen()){
217 IdentifiableSource source
= findMediaSpecimenIdentifieableSource();
219 return source
.getCitationMicroReference();
225 public void setMediaSpecimenReferenceDetail(String referenceDetail
){
226 if(checkMediaSpecimen()){
227 IdentifiableSource source
= findOrMakeMediaSpecimenIdentifieableSource();
228 source
.setCitationMicroReference(referenceDetail
);
235 private IdentifiableSource
findMediaSpecimenIdentifieableSource() {
236 IdentifiableSource source
= null;
237 Media media
= findMediaSpecimen().getMediaSpecimen();
239 // FIXME use marker type to tag the MediaSpecimenReference and make sure that there is always only one.
240 if(!CollectionUtils
.isEmpty(media
.getSources())){
241 source
= media
.getSources().iterator().next();
250 private MediaRepresentationPart
findMediaRepresentationPart() {
252 Media media
= findMediaSpecimen().getMediaSpecimen();
254 if(!CollectionUtils
.isEmpty(media
.getRepresentations())){
255 MediaRepresentation repr
= media
.getRepresentations().iterator().next();
256 if(!CollectionUtils
.isEmpty(repr
.getParts())) {
257 MediaRepresentationPart part
= repr
.getParts().iterator().next();
265 private MediaRepresentationPart
findOrMakeMediaRepresentationPart() {
267 if(findMediaSpecimen().getMediaSpecimen() == null){
268 findMediaSpecimen().setMediaSpecimen(Media
.NewInstance());
270 Media media
= findMediaSpecimen().getMediaSpecimen();
271 if(CollectionUtils
.isEmpty(media
.getRepresentations())){
272 media
.addRepresentation(MediaRepresentation
.NewInstance());
274 MediaRepresentation repr
= media
.getRepresentations().iterator().next();
275 if(CollectionUtils
.isEmpty(repr
.getParts())) {
276 repr
.addRepresentationPart(MediaRepresentationPart
.NewInstance(null, null));
278 MediaRepresentationPart part
= repr
.getParts().iterator().next();
286 private IdentifiableSource
findOrMakeMediaSpecimenIdentifieableSource() {
287 IdentifiableSource source
;
288 Media media
= findMediaSpecimen().getMediaSpecimen();
290 findMediaSpecimen().setMediaSpecimen(Media
.NewInstance());
292 if(CollectionUtils
.isEmpty(media
.getSources())){
293 source
= IdentifiableSource
.NewPrimaryMediaSourceInstance(null, null);
294 media
.addSource(source
);
296 source
= media
.getSources().iterator().next();
304 public boolean checkMediaSpecimen() {
305 return findMediaSpecimen() != null;
311 private MediaSpecimen
findMediaSpecimen() {
312 DerivedUnit sp
= std
.getTypeSpecimen();
313 if(MediaSpecimen
.class.isAssignableFrom(sp
.getClass())){
314 return (MediaSpecimen
) sp
;