fix #7353 SpecimenTypedesignationsWorkingsetEditor: adapting to changes in DerivedUni...
authorAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Thu, 19 Apr 2018 12:20:10 +0000 (14:20 +0200)
committerAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Thu, 19 Apr 2018 12:20:10 +0000 (14:20 +0200)
src/main/java/eu/etaxonomy/cdm/service/RegistrationWorkingSetService.java
src/main/java/eu/etaxonomy/cdm/service/SpecimenTypeDesignationWorkingSetServiceImpl.java
src/main/java/eu/etaxonomy/cdm/vaadin/model/registration/SpecimenTypeDesignationDTO.java
src/main/java/eu/etaxonomy/cdm/vaadin/model/registration/SpecimenTypeDesignationWorkingSetDTO.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/SpecimenTypeDesignationDTORow.java
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/SpecimenTypeDesignationWorkingsetPopupEditor.java

index f44e6b32b3da59243380b198d570033edcae1df0..559de0a5ed1404f10bea0bdb4cad430356525bac 100644 (file)
@@ -63,6 +63,10 @@ public class RegistrationWorkingSetService implements IRegistrationWorkingSetSer
             "typeDesignations.typeName.$",
             "typeDesignations.citation",
             "typeDesignations.citation.authorship.$",
+            "typeDesignations.annotations", // needed for AnnotatableEntity.clone() in DerivedUnitConverter.copyPropertiesTo
+            "typeDesignations.markers", // needed for AnnotatableEntity.clone() in DerivedUnitConverter.copyPropertiesTo
+            "typeDesignations.registrations", // DerivedUnitConverter.copyPropertiesTo(TARGET n)
+
             // name
             "name.$",
             "name.nomenclaturalReference.authorship.$",
index 43f3ac8f048b54c39047963b31008041e36e5afd..6697153277342f7391481c4a5dce422a4b3cf8e0 100644 (file)
@@ -133,7 +133,7 @@ public class SpecimenTypeDesignationWorkingSetServiceImpl implements ISpecimenTy
             FieldUnit fieldUnit = FieldUnit.NewInstance();
             GatheringEvent gatheringEvent = GatheringEvent.NewInstance();
             fieldUnit.setGatheringEvent(gatheringEvent);
-            repo.getOccurrenceService().save(fieldUnit);
+            fieldUnit = (FieldUnit) repo.getOccurrenceService().save(fieldUnit);
 
             VersionableEntity baseEntity = bean.getBaseEntity();
             Set<TypeDesignationBase> typeDesignations = regDTO.getTypeDesignationsInWorkingSet(
@@ -182,18 +182,15 @@ public class SpecimenTypeDesignationWorkingSetServiceImpl implements ISpecimenTy
 
             Session session = repo.getSession();
 
-//            PersistentContextAnalyzer regAnalyzer = new PersistentContextAnalyzer(dto.getOwner(), session);
-//            regAnalyzer.printEntityGraph(System.out);
-//            regAnalyzer.printCopyEntities(System.out);
-
             session.merge(dto.getOwner());
             session.flush();
 
             // ------------------------ perform delete of removed SpecimenTypeDesignations
+            // this step also includes the deletion of DerivedUnits which have been converted by
+            // the DerivedUnitConverter in turn of a kindOfUnit change
             for(SpecimenTypeDesignation std : dto.deletedSpecimenTypeDesignations()){
                 deleteSpecimenTypeDesignation(dto, std);
             }
-            session.flush();
         }
 
 
index 43b4fd24757be706b1569d4434a505c3feccc998..55c711d926055741c24b7efd11df9b75ee703108 100644 (file)
@@ -15,7 +15,6 @@ import org.apache.commons.collections.CollectionUtils;
 
 import eu.etaxonomy.cdm.api.utility.DerivedUnitConversionException;
 import eu.etaxonomy.cdm.api.utility.DerivedUnitConverter;
-import eu.etaxonomy.cdm.api.utility.DerivedUnitConverterFactory;
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.model.common.DefinedTerm;
 import eu.etaxonomy.cdm.model.common.IdentifiableSource;
@@ -53,6 +52,7 @@ import eu.etaxonomy.cdm.model.reference.Reference;
 public class SpecimenTypeDesignationDTO {
 
     SpecimenTypeDesignation std;
+    private DerivedUnit replacedTypeSpecimen;
 
     /**
      * @return the std
@@ -61,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.
@@ -103,27 +107,34 @@ public class SpecimenTypeDesignationDTO {
         Class<? extends DerivedUnit> currentType = typeSpecimen.getClass();
 
         if(!requiredSpecimenType.equals(currentType)){
-
-            DerivedUnit convertedSpecimen;
-
             SpecimenOrObservationType convertToType = specimenOrObservationTypeFor(kindOfUnit);
             if(requiredSpecimenType.equals(MediaSpecimen.class)){
-                DerivedUnitConverter<MediaSpecimen> converter = DerivedUnitConverterFactory.createDerivedUnitConverter(typeSpecimen, MediaSpecimen.class);
-                convertedSpecimen = converter.convertTo((Class<MediaSpecimen>)requiredSpecimenType, convertToType);
+                DerivedUnitConverter<MediaSpecimen> converter = new DerivedUnitConverter<MediaSpecimen>(std);
+                std = converter.convertTo((Class<MediaSpecimen>)requiredSpecimenType, convertToType);
             } else {
                  if(currentType == MediaSpecimen.class){
                      MediaSpecimen mediaSpecimen = (MediaSpecimen)typeSpecimen;
                      // set null to allow conversion
                      mediaSpecimen.setMediaSpecimen(null);
                  }
-                DerivedUnitConverter<DerivedUnit> converter = DerivedUnitConverterFactory.createDerivedUnitConverter(typeSpecimen, DerivedUnit.class);
-                convertedSpecimen = converter.convertTo((Class<DerivedUnit>)requiredSpecimenType, convertToType);
+                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.
index 9c3e33d5f898e94a4f85ffbb468d5e3521de14cf..27c651db38452352b8106e77448a7328e007a306 100644 (file)
@@ -23,6 +23,7 @@ import eu.etaxonomy.cdm.model.location.NamedArea;
 import eu.etaxonomy.cdm.model.location.Point;
 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
 import eu.etaxonomy.cdm.model.name.TaxonName;
+import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
 import eu.etaxonomy.cdm.model.occurrence.GatheringEvent;
 import eu.etaxonomy.cdm.model.reference.Reference;
index dbec3f1574ae47ecef7720601dd732cb06935c33..d00c5758be1898edc5abfa9b401404993aab2235 100644 (file)
@@ -9,6 +9,7 @@
 package eu.etaxonomy.cdm.vaadin.view.name;
 
 import java.util.Arrays;
+import java.util.List;
 
 import com.vaadin.server.Sizeable.Unit;
 import com.vaadin.ui.Component;
@@ -40,7 +41,8 @@ public class SpecimenTypeDesignationDTORow extends CollectionRowItemCollection i
      *
      * The fieldname must match the properties of the SpecimenTypeDesignationDTO
      */
-    RowListSelect kindOfUnit = new RowListSelect();
+    TextField associatedTypeDesignationCount = new TextField();
+    RowListSelect kindOfUnit = new RowListSelect(); // position is IMPORTANT, see rowListSelectColumn()
     ListSelect typeStatus = new ListSelect();
     ToOneRelatedEntityCombobox<eu.etaxonomy.cdm.model.occurrence.Collection> collection =
             new ToOneRelatedEntityCombobox<eu.etaxonomy.cdm.model.occurrence.Collection>(null, eu.etaxonomy.cdm.model.occurrence.Collection.class);
@@ -57,6 +59,7 @@ public class SpecimenTypeDesignationDTORow extends CollectionRowItemCollection i
         kindOfUnit.setRow(this);
         typeStatus.setRows(1);
         typeStatus.setRequired(true);
+
         accessionNumber.setWidth(100, Unit.PIXELS);
         preferredStableUri.setWidth(150, Unit.PIXELS);
         preferredStableUri.setConverter(new UriConverter());
@@ -77,16 +80,28 @@ public class SpecimenTypeDesignationDTORow extends CollectionRowItemCollection i
      */
     public Component[] components() {
         Component[] components = new Component[]{
+            associatedTypeDesignationCount,
             kindOfUnit, typeStatus,
             collection, accessionNumber,
             preferredStableUri,
             mediaUri, mediaSpecimenReference,
-            mediaSpecimenReferenceDetail, mediaSpecimenReferenceDetail
+            mediaSpecimenReferenceDetail
             };
         addAll(Arrays.asList(components));
         return components;
     }
 
+    public static List<String> visibleFields() {
+        List<String> visibleFields = Arrays.asList(new String[]{
+            "kindOfUnit", "typeStatus",
+            "collection", "accessionNumber",
+            "preferredStableUri",
+            "mediaUri", "mediaSpecimenReference",
+            "mediaSpecimenReferenceDetail"
+            });
+        return visibleFields;
+    }
+
     @Override
     public void updateRowItemsEnablement() {
 
@@ -95,12 +110,25 @@ public class SpecimenTypeDesignationDTORow extends CollectionRowItemCollection i
         boolean publishedImageType = kindOfUnitTerm != null && kindOfUnitTerm.equals(KindOfUnitTerms.PUBLISHED_IMAGE());
         boolean unPublishedImageType = kindOfUnitTerm != null && kindOfUnitTerm.equals(KindOfUnitTerms.UNPUBLISHED_IMAGE());
 
-        mediaSpecimenReference.setEnabled(publishedImageType);
-        mediaSpecimenReferenceDetail.setEnabled(publishedImageType);
+        boolean kindOfUnitLocked = !associatedTypeDesignationCount.getValue().isEmpty() && Integer.valueOf(associatedTypeDesignationCount.getValue()) > 1;
+        kindOfUnit.setEnabled(!kindOfUnitLocked);
+        kindOfUnit.setDescription(kindOfUnitLocked ?
+                "Can not be changed since the type specimen is associated with multiple type designations" : "");
+        mediaSpecimenReference.setEnabled(publishedImageType || unPublishedImageType);
+        mediaSpecimenReferenceDetail.setEnabled(publishedImageType || unPublishedImageType);
         mediaUri.setEnabled(publishedImageType || unPublishedImageType);
 
     }
 
+    /**
+     *
+     * @return the 0-based position index of the <code>kindOfUnit</code> field in this class
+     * which are visible according to {@link #visibleFields())
+     */
+    public static int rowListSelectColumn(){
+        return 0;
+    }
+
     class RowListSelect extends ListSelect implements CollectionRowRepresentative {
 
         private static final long serialVersionUID = 3235653923633494213L;
index fc9a3a3f14b727a6b94c684e7692a2a822d96c96..796d9a107365708a9944a8031ba8fbdcd600e0d7 100644 (file)
@@ -169,13 +169,14 @@ public class SpecimenTypeDesignationWorkingsetPopupEditor
         // FIXME: can we use the Grid instead?
         typeDesignationsCollectionField = new ElementCollectionField<>(
                 SpecimenTypeDesignationDTO.class,
-                //getPresenter().specimenTypeDesignationDTOInstantiator(getBean());
                 SpecimenTypeDesignationDTORow.class
                 );
         typeDesignationsCollectionField.withCaption("Types");
         typeDesignationsCollectionField.getLayout().setSpacing(false);
         typeDesignationsCollectionField.getLayout().setColumns(3);
 
+        typeDesignationsCollectionField.setVisibleProperties(SpecimenTypeDesignationDTORow.visibleFields());
+
         typeDesignationsCollectionField.setPropertyHeader("accessionNumber", "Access. num.");
         typeDesignationsCollectionField.setPropertyHeader("preferredStableUri", "Stable URI");
         typeDesignationsCollectionField.setPropertyHeader("mediaSpecimenReference", "Image reference");
@@ -274,7 +275,7 @@ public class SpecimenTypeDesignationWorkingsetPopupEditor
         super.afterItemDataSourceSet();
         GridLayout gridLayout = this.typeDesignationsCollectionField.getLayout();
         for(int rowIndex = 1; rowIndex < gridLayout.getRows(); rowIndex++){ // first row is header
-            Component item = gridLayout.getComponent(0, rowIndex);
+            Component item = gridLayout.getComponent(SpecimenTypeDesignationDTORow.rowListSelectColumn(), rowIndex);
             ((CollectionRowRepresentative)item).updateRowItemsEnabledStates();
         }
         updateAllowDelete();