From be7e58834566e2e94b86990bb25801177a9a726f Mon Sep 17 00:00:00 2001 From: Simon Barner <barner@fortiss.org> Date: Tue, 21 Sep 2021 08:26:09 +0200 Subject: [PATCH] setAnnotationValue(): Case distinction based on structural feature * More stable than deciding based on provided value Issue-Ref: 4092 Issue-Url: https://git.fortiss.org/af3/af3/-/issues/4092 Signed-off-by: Simon Barner <barner@fortiss.org> --- .../base/annotation/valueprovider/.ratings | 2 +- .../EStructuralFeatureValueProviderBase.java | 37 +++++++++++-------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/valueprovider/.ratings b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/valueprovider/.ratings index 426ad25ba..1074b9c9f 100644 --- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/valueprovider/.ratings +++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/valueprovider/.ratings @@ -1,6 +1,6 @@ AnnotationInstSpec.java 7a6cb55bfa9cafa9ead1f72089e554ee8142e8bf GREEN DerivedAnnotationValueProviderBase.java afedd21d3469127bbb20adb34c191b5c9c980f6c GREEN EStructuralFeatureDescriptor.java 169ece3fc0740c6ca1e5dde06a1be577d7cb9f80 YELLOW -EStructuralFeatureValueProviderBase.java 287facbbce47c16d892bae82a214f64ceeef2263 GREEN +EStructuralFeatureValueProviderBase.java 8dcecac16f8f654732ee0af7098443fe13ce1c85 YELLOW IAnnotationValueProvider.java 08e0e5f66dc97865e9ac03e1ac646af332845e14 GREEN ValueProviderBase.java e4e866840845346ec99a4304048f5327c4890996 GREEN diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/valueprovider/EStructuralFeatureValueProviderBase.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/valueprovider/EStructuralFeatureValueProviderBase.java index 287facbbc..8dcecac16 100644 --- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/valueprovider/EStructuralFeatureValueProviderBase.java +++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/valueprovider/EStructuralFeatureValueProviderBase.java @@ -16,6 +16,7 @@ package org.fortiss.tooling.base.annotation.valueprovider; import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; import static org.fortiss.tooling.kernel.utils.LoggingUtils.error; import java.util.ArrayList; @@ -230,25 +231,29 @@ public abstract class EStructuralFeatureValueProviderBase<T extends IAnnotatedSp } setAnnotationValueFromString((String)value, specification); - } else if(value instanceof Collection<?>) { - Collection<?> collection = (Collection<?>)value; - if(collection.isEmpty()) { - specification.eSet(eStructuralFeature, emptyList()); - } else { - if(collection.iterator().next() instanceof String) { - setAnnotationValueFromString((Collection<String>)value, specification); + } else { + if(eStructuralFeature.isMany()) { + Collection<?> collection = (value instanceof Collection<?>) ? (Collection<?>)value + : singletonList(value); + + if(collection.isEmpty()) { + specification.eSet(eStructuralFeature, emptyList()); } else { - specification.eSet(eStructuralFeature, value); + if(collection.iterator().next() instanceof String) { + setAnnotationValueFromString((Collection<String>)collection, specification); + } else { + specification.eSet(eStructuralFeature, collection); + } } - } - } else { - if(value != null) { - specification.eSet(eStructuralFeature, value); } else { - // Treat 'null' as special value used to unset EStructural features. This - // implementation choice prevents to distinguish between 'null' and unset for - // EReferences). - specification.eUnset(eStructuralFeature); + if(value != null) { + specification.eSet(eStructuralFeature, value); + } else { + // Treat 'null' as special value used to unset EStructural features. This + // implementation choice prevents to distinguish between 'null' and unset for + // EReferences). + specification.eUnset(eStructuralFeature); + } } } } -- GitLab