ref #10196 fix state and character/feature handling in RowWrapperDTO and description...
authorAndreas Müller <a.mueller@bgbm.org>
Wed, 14 Dec 2022 19:02:51 +0000 (20:02 +0100)
committerAndreas Müller <a.mueller@bgbm.org>
Wed, 14 Dec 2022 19:02:51 +0000 (20:02 +0100)
* by casting not filtering for term class

cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/description/CategoricalData.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/term/DefinedTermBase.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DescriptionServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DescriptiveDataSetService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/dto/RowWrapperDTO.java

index 15c50476f0ddc79e55d846323871b87bb3d72fdd..4216230abba75679c5a693489d6104804eff4688 100644 (file)
@@ -238,12 +238,12 @@ public class CategoricalData extends DescriptionElementBase {
      * All existing state data are removed.
      * @return
      */
-    public List<StateData> setStateDataOnly(List<State> states){
+    public List<StateData> setStateDataOnly(List<? extends DefinedTermBase<?>> states){
         List<StateData> stateDataList = new ArrayList<>(getStateData());
         for (StateData stateData : stateDataList) {
             removeStateData(stateData);
         }
-        for (State state : states) {
+        for (DefinedTermBase<?> state : states) {
             addStateData(state);
         }
         return this.stateData;
index bc622e4bee87e3c1fcfeedb0192f6b663814e5d3..ae35bc8992f3cbc028698ead599f6b6db083f6b2 100644 (file)
@@ -713,6 +713,14 @@ public abstract class DefinedTermBase<T extends DefinedTermBase>
                DefinedTermBase.cacher = cacher;
        }
 
+    /**
+     * Returns the term with the given {@link UUID} and the exact given {@link Class} from
+     * the cache or loads it from the database. If the term exists but has a
+     * different class <code>null</code> is returned. This is also the case for
+     * if the class is assignable from the given class.
+     *
+     * @see #getTermByUUID(UUID, Class)
+     */
        public static <T extends DefinedTermBase> T getTermByClassAndUUID(Class<T> clazz, UUID uuid) {
            if(cacher != null) {
                CdmBase cdmBase = HibernateProxyHelper.deproxy(getCacher().load(uuid));
@@ -723,4 +731,17 @@ public abstract class DefinedTermBase<T extends DefinedTermBase>
            }
            return null;
        }
+
+    /**
+     * Returns the term from the cache or loads it from the database
+     * and casts it to the given class.
+     * In contrary to {@link #getTermByClassAndUUID(Class, UUID)} it
+     * throws an exception if the term can not be casted.
+     */
+    public static <T extends DefinedTermBase> T getTermByUUID(UUID uuid, Class<T> clazz) {
+        if(cacher != null) {
+            return HibernateProxyHelper.deproxy(getCacher().load(uuid), clazz);
+        }
+        return null;
+    }
 }
\ No newline at end of file
index 30d8a16b917db4548a90f62970a913ba433ac70d..bc89f5fdcf1b1a7f711b7aea3814b130809f0159 100644 (file)
@@ -63,7 +63,6 @@ import eu.etaxonomy.cdm.model.description.MeasurementUnit;
 import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
 import eu.etaxonomy.cdm.model.description.QuantitativeData;
 import eu.etaxonomy.cdm.model.description.SpecimenDescription;
-import eu.etaxonomy.cdm.model.description.State;
 import eu.etaxonomy.cdm.model.description.StateData;
 import eu.etaxonomy.cdm.model.description.StatisticalMeasure;
 import eu.etaxonomy.cdm.model.description.StatisticalMeasurementValue;
@@ -490,10 +489,8 @@ public class DescriptionServiceImpl
                         continue;
                     }
                     List<DescriptionElementBase> equalUuidsElements = descriptionElements.stream().filter( e -> e.getUuid().equals(descElementUuid)).collect(Collectors.toList());
-                    eu.etaxonomy.cdm.model.description.Feature feature =  DefinedTermBase.getTermByClassAndUUID(eu.etaxonomy.cdm.model.description.Feature.class, descElement.getFeatureUuid());
-                    if (feature == null){
-                        feature = DefinedTermBase.getTermByClassAndUUID(eu.etaxonomy.cdm.model.description.Character.class, descElement.getFeatureUuid());
-                    }
+                    Feature feature = DefinedTermBase.getTermByUUID(descElement.getFeatureUuid(), Feature.class);
+
                     if (equalUuidsElements.size() == 0){
                         if (descElement instanceof CategoricalDataDto){
 
@@ -501,8 +498,8 @@ public class DescriptionServiceImpl
                             List<StateDataDto> stateDtos = ((CategoricalDataDto)descElement).getStates();
                             for (StateDataDto dataDto: stateDtos){
                                 //create new statedata
-                                //FIXME 10196
-                                State newState = DefinedTermBase.getTermByClassAndUUID(State.class, dataDto.getState().getUuid());
+                                //FIXME 10196 fixed
+                                DefinedTermBase<?> newState = DefinedTermBase.getTermByUUID(dataDto.getState().getUuid(), DefinedTermBase.class);
                                 StateData newStateData = StateData.NewInstance(newState);
                                 elementBase.addStateData(newStateData);
                             }
index e1951016b77f9d59d72329f99c8899689810c6d5..c0c5b18cd0cc9e0703220994053a79a07fd871bf 100644 (file)
@@ -56,7 +56,6 @@ import eu.etaxonomy.cdm.model.description.MeasurementUnit;
 import eu.etaxonomy.cdm.model.description.PolytomousKey;
 import eu.etaxonomy.cdm.model.description.QuantitativeData;
 import eu.etaxonomy.cdm.model.description.SpecimenDescription;
-import eu.etaxonomy.cdm.model.description.State;
 import eu.etaxonomy.cdm.model.description.StatisticalMeasure;
 import eu.etaxonomy.cdm.model.description.StatisticalMeasurementValue;
 import eu.etaxonomy.cdm.model.description.TaxonDescription;
@@ -301,17 +300,17 @@ public class DescriptiveDataSetService
 
                 for (DescriptionElementDto elementDto: elementDtos){
                     if (elementDto instanceof CategoricalDataDto){
-                        eu.etaxonomy.cdm.model.description.Character feature = DefinedTermBase.getTermByClassAndUUID(eu.etaxonomy.cdm.model.description.Character.class, elementDto.getFeatureUuid());
+                        Feature feature = DefinedTermBase.getTermByUUID(elementDto.getFeatureUuid(), Feature.class);
                         CategoricalData data = CategoricalData.NewInstance(feature);
                         for (StateDataDto stateDto:((CategoricalDataDto) elementDto).getStates()){
-                            //FIXME 10196
-                            State state = DefinedTermBase.getTermByClassAndUUID(State.class, stateDto.getState().getUuid());
+                            //FIXME 10196 fixed?
+                            DefinedTermBase<?> state = DefinedTermBase.getTermByUUID(stateDto.getState().getUuid(), DefinedTermBase.class);
                             data.addStateData(state);
                             specimenDescription.addElement(data);
                         }
                     }
                     if (elementDto instanceof QuantitativeDataDto){
-                        eu.etaxonomy.cdm.model.description.Character feature = DefinedTermBase.getTermByClassAndUUID(eu.etaxonomy.cdm.model.description.Character.class, elementDto.getFeatureUuid());
+                        Feature feature = DefinedTermBase.getTermByUUID(elementDto.getFeatureUuid(), Feature.class);
                         QuantitativeData data = QuantitativeData.NewInstance(feature);
                         if (((QuantitativeDataDto) elementDto).getMeasurementUnit() != null){
                             MeasurementUnit unit = DefinedTermBase.getTermByClassAndUUID(MeasurementUnit.class, ((QuantitativeDataDto) elementDto).getMeasurementUnit().getUuid());
@@ -330,9 +329,9 @@ public class DescriptiveDataSetService
                 List<DescriptionElementDto> elementDtos = descriptionDto.getElements();
                 for (DescriptionElementDto elementDto: elementDtos){
                     if (elementDto instanceof CategoricalDataDto){
-                        eu.etaxonomy.cdm.model.description.Character feature = DefinedTermBase.getTermByClassAndUUID(eu.etaxonomy.cdm.model.description.Character.class, elementDto.getFeatureUuid());
+                        Feature feature = DefinedTermBase.getTermByUUID(elementDto.getFeatureUuid(), Feature.class);
                         List<DescriptionElementBase> uniqueElementList = specimenDescription.getElements().stream().filter(element -> element.getUuid().equals(elementDto.getElementUuid())).collect(Collectors.toList());
-                        List<State> allStates = new ArrayList<>();
+                        List<DefinedTermBase<?>> allStates = new ArrayList<>();
                         CategoricalData element = null;
                         if (uniqueElementList.size() == 1){
                             element = HibernateProxyHelper.deproxy(uniqueElementList.get(0), CategoricalData.class);
@@ -340,14 +339,14 @@ public class DescriptiveDataSetService
                             element = CategoricalData.NewInstance(feature);
                         }
                         for (StateDataDto stateDto:((CategoricalDataDto) elementDto).getStates()){
-                            //FIXME 10196
-                            State state = DefinedTermBase.getTermByClassAndUUID(State.class, stateDto.getState().getUuid());
+                            //FIXME 10196 fixed?
+                            DefinedTermBase<?> state = DefinedTermBase.getTermByUUID(stateDto.getState().getUuid(), DefinedTermBase.class);
                             allStates.add(state);
                         }
                         element.setStateDataOnly(allStates);
                     }
                     if (elementDto instanceof QuantitativeDataDto){
-                        eu.etaxonomy.cdm.model.description.Character feature = DefinedTermBase.getTermByClassAndUUID(eu.etaxonomy.cdm.model.description.Character.class, elementDto.getFeatureUuid());
+                        Feature feature = DefinedTermBase.getTermByUUID(elementDto.getFeatureUuid(), Feature.class);
                         QuantitativeData data = QuantitativeData.NewInstance(feature);
                         if (((QuantitativeDataDto) elementDto).getMeasurementUnit() != null){
                             MeasurementUnit unit = DefinedTermBase.getTermByClassAndUUID(MeasurementUnit.class, ((QuantitativeDataDto) elementDto).getMeasurementUnit().getUuid());
index 0b65a48883d4feecf61654c59decbf24ca944227..8d18f4f01832b28d94623bdbe223a4628aac6bea 100644 (file)
@@ -25,7 +25,6 @@ import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 
 import eu.etaxonomy.cdm.model.description.CategoricalData;
-import eu.etaxonomy.cdm.model.description.Character;
 import eu.etaxonomy.cdm.model.description.DescriptionBase;
 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
 import eu.etaxonomy.cdm.model.description.Feature;
@@ -239,10 +238,7 @@ public abstract class RowWrapperDTO <T extends DescriptionBase> implements Seria
                 }
             }
         }else{
-            Feature feature = DefinedTermBase.getTermByClassAndUUID(Feature.class, featureUuid);
-            if (feature == null){
-                feature = DefinedTermBase.getTermByClassAndUUID(Character.class, featureUuid);
-            }
+            Feature feature = DefinedTermBase.getTermByUUID(featureUuid, Feature.class);
             categoricalData = new CategoricalDataDto(FeatureDto.fromFeature(feature));
             categoricalData.setStateDataOnly(states);
         }
@@ -305,10 +301,7 @@ public abstract class RowWrapperDTO <T extends DescriptionBase> implements Seria
         }
         QuantitativeDataDto quantitativeData = null;
         if (descriptionElementBase == null){
-            Feature feature = DefinedTermBase.getTermByClassAndUUID(Feature.class, featureUuid);
-            if (feature == null){
-                feature = DefinedTermBase.getTermByClassAndUUID(Character.class, featureUuid);
-            }
+            Feature feature = DefinedTermBase.getTermByUUID(featureUuid, Feature.class);
             quantitativeData = new QuantitativeDataDto(FeatureDto.fromFeature(feature));
         }