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