fix #7353 SpecimenTypedesignationsWorkingsetEditor: adapting to changes in DerivedUni...
[cdm-vaadin.git] / src / main / java / eu / etaxonomy / cdm / vaadin / model / registration / SpecimenTypeDesignationDTO.java
index f4c9feba42c4cd430b56095967d6a8a528216328..55c711d926055741c24b7efd11df9b75ee703108 100644 (file)
@@ -52,6 +52,7 @@ import eu.etaxonomy.cdm.model.reference.Reference;
 public class SpecimenTypeDesignationDTO {
 
     SpecimenTypeDesignation std;
+    private DerivedUnit replacedTypeSpecimen;
 
     /**
      * @return the std
@@ -60,6 +61,10 @@ public class SpecimenTypeDesignationDTO {
         return std;
     }
 
+    public DerivedUnit replacedTypeSpecimen(){
+        return replacedTypeSpecimen;
+    }
+
     /**
      * Creates an new new instance of SpecimenTypeDesignationDTO which is backed up
      * by an newly instantiated <code>SpecimenTypeDesignation.typeSpecimen.derivedFrom.type</code> object graph.
@@ -96,25 +101,40 @@ public class SpecimenTypeDesignationDTO {
     public void setKindOfUnit(DefinedTerm kindOfUnit) throws DerivedUnitConversionException{
 
         std.getTypeSpecimen().setKindOfUnit(kindOfUnit);
+        DerivedUnit typeSpecimen = HibernateProxyHelper.deproxy(std.getTypeSpecimen());
 
         Class<? extends DerivedUnit> requiredSpecimenType = specimenTypeFor(kindOfUnit);
+        Class<? extends DerivedUnit> currentType = typeSpecimen.getClass();
 
-        if(!requiredSpecimenType.equals(std.getTypeSpecimen())){
-
-            DerivedUnit convertedSpecimen;
-
+        if(!requiredSpecimenType.equals(currentType)){
+            SpecimenOrObservationType convertToType = specimenOrObservationTypeFor(kindOfUnit);
             if(requiredSpecimenType.equals(MediaSpecimen.class)){
-                DerivedUnitConverter<MediaSpecimen> converter = new DerivedUnitConverter<MediaSpecimen> (std.getTypeSpecimen());
-                convertedSpecimen = converter.convertTo((Class<MediaSpecimen>)requiredSpecimenType, specimenOrObservationTypeFor(kindOfUnit));
+                DerivedUnitConverter<MediaSpecimen> converter = new DerivedUnitConverter<MediaSpecimen>(std);
+                std = converter.convertTo((Class<MediaSpecimen>)requiredSpecimenType, convertToType);
             } else {
-                DerivedUnitConverter<DerivedUnit> converter = new DerivedUnitConverter<DerivedUnit> (std.getTypeSpecimen());
-                convertedSpecimen = converter.convertTo((Class<DerivedUnit>)requiredSpecimenType, specimenOrObservationTypeFor(kindOfUnit));
+                 if(currentType == MediaSpecimen.class){
+                     MediaSpecimen mediaSpecimen = (MediaSpecimen)typeSpecimen;
+                     // set null to allow conversion
+                     mediaSpecimen.setMediaSpecimen(null);
+                 }
+                DerivedUnitConverter<DerivedUnit> converter = new DerivedUnitConverter<DerivedUnit>(std);
+                std = converter.convertTo((Class<DerivedUnit>)requiredSpecimenType, convertToType);
+            }
+            if(typeSpecimen.getId() != 0){
+                replacedTypeSpecimen = typeSpecimen;
             }
 
-            std.setTypeSpecimen(convertedSpecimen);
         }
     }
 
+    /**
+     *
+     * @return the total count of typeDesignations associated with the type specimen
+     */
+    public int getAssociatedTypeDesignationCount() {
+        return std.getTypeSpecimen().getSpecimenTypeDesignations().size();
+    }
+
 
     /**
      * See constructor doc.
@@ -186,6 +206,14 @@ public class SpecimenTypeDesignationDTO {
         std.getTypeSpecimen().setAccessionNumber(accessionNumber);
     }
 
+    public URI getPreferredStableUri(){
+        return std.getTypeSpecimen().getPreferredStableUri();
+    }
+
+    public void setPreferredStableUri(URI uri){
+        std.getTypeSpecimen().setPreferredStableUri(uri);
+    }
+
     public URI getMediaUri(){
         if(checkMediaSpecimen()){
             MediaRepresentationPart part = findMediaRepresentationPart();
@@ -295,6 +323,7 @@ public class SpecimenTypeDesignationDTO {
         IdentifiableSource source ;
         Media media = findMediaSpecimen().getMediaSpecimen();
         if(media == null){
+            media = Media.NewInstance();
             findMediaSpecimen().setMediaSpecimen(Media.NewInstance());
         }
         if(CollectionUtils.isEmpty(media.getSources())){
@@ -317,7 +346,7 @@ public class SpecimenTypeDesignationDTO {
      * @return
      */
     private MediaSpecimen findMediaSpecimen() {
-        DerivedUnit sp = std.getTypeSpecimen();
+        DerivedUnit sp = HibernateProxyHelper.deproxy(std.getTypeSpecimen());
         if(MediaSpecimen.class.isAssignableFrom(sp.getClass())){
             return (MediaSpecimen) sp;
         }