From 29458c24f1c5d194c50e7bc4ae6b51479f0a49af Mon Sep 17 00:00:00 2001
From: Simon Barner <barner@fortiss.org>
Date: Fri, 9 Mar 2018 12:49:14 +0000
Subject: [PATCH] ComponentArchitectureTransformationBase.transform() Ensure
 that in architectures derived from ComponentArchitectures, annotation are
 instantiated.

AnnotationUtils: Resurrect instantiateAnnotationsRecursive()
refs 3328
---
 .../org/fortiss/tooling/base/utils/.ratings   |  2 +-
 .../tooling/base/utils/AnnotationUtils.java   | 22 +++++++++++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/utils/.ratings b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/utils/.ratings
index 37e3cb9b8..c67b1dccd 100644
--- a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/utils/.ratings
+++ b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/utils/.ratings
@@ -1,5 +1,5 @@
 AngleUtils.java 6aaf8e974481e9bd5c0d813302c1f08d10d1c00d GREEN
-AnnotationUtils.java 941cfdbc8c871da64f8e873ce50ed19c8f9c4b7e GREEN
+AnnotationUtils.java 169d98287f1af1ace01b49f4ab0975e427a1263e YELLOW
 BaseMathUtils.java 7d0e7113af72677b0a7e44fcc40e874624d3bee6 GREEN
 BaseModelElementUtils.java fc0596156b9f5761759ab3a9974fe0302e9889e9 GREEN
 ConstraintsBaseUtils.java ae80d8f4ad3b821b5025ef24ce34a4e6185cc67e GREEN
diff --git a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/utils/AnnotationUtils.java b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/utils/AnnotationUtils.java
index 9d8aeb70d..78553ce6d 100644
--- a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/utils/AnnotationUtils.java
+++ b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/utils/AnnotationUtils.java
@@ -16,6 +16,7 @@
 package org.fortiss.tooling.base.utils;
 
 import static org.fortiss.tooling.base.utils.BaseMathUtils.convertNumber;
+import static org.fortiss.tooling.kernel.utils.EcoreUtils.getChildrenWithType;
 import static org.fortiss.tooling.kernel.utils.EcoreUtils.getEClassForClass;
 import static org.fortiss.tooling.kernel.utils.EcoreUtils.getParentsWithType;
 import static org.fortiss.tooling.kernel.utils.EcoreUtils.pickFirstInstanceOf;
@@ -33,6 +34,7 @@ import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EClassifier;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.fortiss.tooling.base.ToolingBaseActivator;
+import org.fortiss.tooling.base.annotation.IAnnotationValueService;
 import org.fortiss.tooling.base.annotation.valueprovider.AnnotationInstSpec;
 import org.fortiss.tooling.base.annotation.valueprovider.EStructuralFeatureDescriptor;
 import org.fortiss.tooling.base.annotation.valueprovider.IAnnotationValueProvider;
@@ -43,6 +45,7 @@ import org.fortiss.tooling.base.annotation.valueprovider.IAnnotationValueProvide
 import org.fortiss.tooling.base.annotation.valueprovider.IAnnotationValueProvider.AnnotationActionParameters;
 import org.fortiss.tooling.base.annotation.valueprovider.IAnnotationValueProvider.AnnotationActionReqInputParameter;
 import org.fortiss.tooling.base.annotation.valueprovider.IAnnotationValueProvider.AnnotationActionReqInputParameters;
+import org.fortiss.tooling.base.compose.HierarchicElementCompositorBase;
 import org.fortiss.tooling.base.model.element.IAnnotatedSpecification;
 import org.fortiss.tooling.base.model.element.IModelElement;
 import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
@@ -247,4 +250,23 @@ public class AnnotationUtils {
 
 		return new AnnotationAction<T>(randValuePropDescriptor, randomValuePropagation);
 	}
+
+	/**
+	 * Recursively instantiates the annotations for a given {@link IModelElement} and its offspring.
+	 * This is useful to ensure that all annotations are available for programmatically created
+	 * models. While the {@link HierarchicElementCompositorBase} could be used to ensure the
+	 * instantiation of annotations in model-transformations, too, this is not always possible (or
+	 * convenient).
+	 * 
+	 * @param element
+	 *            {@link IModelElement} for which annotations should be instantiated recursively.
+	 */
+	public static void instantiateAnnotationsRecursive(IModelElement element) {
+		IAnnotationValueService as = IAnnotationValueService.getInstance();
+		as.instantiateAnnotations(element);
+		for(IModelElement child : getChildrenWithType(element, IModelElement.class)) {
+			as.instantiateAnnotations(child);
+		}
+	}
+
 }
-- 
GitLab