diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/.ratings b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/.ratings
index 35590882346f9a0d09d919fb3a4043c9569cf92f..4d98a1b711fdee48b7027080942629bcfc59ba36 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/.ratings
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/.ratings
@@ -1,3 +1,3 @@
AnnotationEntry.java 928240a722fb5177da232619266c0d0dadcfa151 GREEN
-AnnotationValueService.java 19906a1c7a2a33897651a0d7e207c4e5a285d2ff GREEN
-IAnnotationValueService.java 50cea844f4b4ff3308ec1286ba8aadf253d2f3b1 GREEN
+AnnotationValueService.java 01fc46fb381854b16ce78779217ffc7c29036c14 GREEN
+IAnnotationValueService.java 81ff274a7b2d4c58e7b8485db857eb83f99710d0 GREEN
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/AnnotationValueService.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/AnnotationValueService.java
index 19906a1c7a2a33897651a0d7e207c4e5a285d2ff..01fc46fb381854b16ce78779217ffc7c29036c14 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/AnnotationValueService.java
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/AnnotationValueService.java
@@ -156,8 +156,10 @@ public class AnnotationValueService
* Prepares the {@link AnnotationEntry} for a given {@link IModelElement} and ensures that all
* {@link IAnnotatedSpecification}s are instantiated.
*/
- private void prepareAnnotationEntry(final IModelElement element, AnnotationEntry entry,
- final List> registeredHandlers) {
+ private void prepareAnnotationEntry(final IModelElement element, AnnotationEntry entry) {
+ final List> registeredHandlers =
+ getRegisteredHandlers(element.getClass());
+
for(IAnnotationValueProvider annotationProvider : registeredHandlers) {
IAnnotatedSpecification annotatedSpecification = EcoreUtils.pickFirstInstanceOf(
@@ -214,14 +216,16 @@ public class AnnotationValueService
getAnnotationEntry(element, false);
}
- /**
- * Predicate if for the given {@link IModelElement}, {@link #getAnnotationEntry(IModelElement)}
- * will actually instantiate an annotation, i.e. modify the model.
- */
- private boolean requiresAnnotationInstantiation(final IModelElement element,
- final List> registeredHandlers) {
- for(IAnnotationValueProvider annotationProvider : registeredHandlers) {
+ /** {@inheritDoc} */
+ @Override
+ public boolean requiresAnnotationInstantiation(final IModelElement element) {
+ final List> registeredHandlers =
+ getRegisteredHandlers(element.getClass());
+ if(registeredHandlers == null) {
+ return false;
+ }
+ for(IAnnotationValueProvider annotationProvider : registeredHandlers) {
IAnnotatedSpecification annotatedSpecification = pickFirstInstanceOf(
annotationProvider.getAnnotationClazz(), element.getSpecifications());
@@ -252,30 +256,24 @@ public class AnnotationValueService
return null;
}
- final List> registeredHandlers =
- getRegisteredHandlers(element.getClass());
final AnnotationEntry result = new AnnotationEntry(element);
- if(registeredHandlers != null && !registeredHandlers.isEmpty()) {
-
- final ITopLevelElement modelContext =
- IPersistencyService.getInstance().getTopLevelElementFor(element);
-
- // Wrap instantiation of new annotation into command if this method is invoked from the
- // GUI context, i.e. from getAnnotationEntry(final IModelElement element), but only if
- // prepareAnnotationEntry() would actually modify the underlying model, and a model
- // context is available.
- if(requiresAnnotationInstantiation(element, registeredHandlers) &&
- modelContext != null) {
- modelContext.runAsCommand(new Runnable() {
-
- @Override
- public void run() {
- prepareAnnotationEntry(element, result, registeredHandlers);
- }
- });
- } else {
- prepareAnnotationEntry(element, result, registeredHandlers);
- }
+
+ // Wrap instantiation of new annotation into command if this method is invoked from the
+ // GUI context, i.e. from getAnnotationEntry(final IModelElement element), but only if
+ // prepareAnnotationEntry() would actually modify the underlying model, and a model
+ // context is available.
+ final ITopLevelElement modelContext =
+ IPersistencyService.getInstance().getTopLevelElementFor(element);
+ if(requiresAnnotationInstantiation(element) && modelContext != null) {
+ modelContext.runAsCommand(new Runnable() {
+
+ @Override
+ public void run() {
+ prepareAnnotationEntry(element, result);
+ }
+ });
+ } else {
+ prepareAnnotationEntry(element, result);
}
// Only put element into AnnotationEntry <-> IModelElement cache if method is invoked from
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/IAnnotationValueService.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/IAnnotationValueService.java
index 50cea844f4b4ff3308ec1286ba8aadf253d2f3b1..81ff274a7b2d4c58e7b8485db857eb83f99710d0 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/IAnnotationValueService.java
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/IAnnotationValueService.java
@@ -58,4 +58,12 @@ public interface IAnnotationValueService {
*
*/
void instantiateAnnotations(IModelElement element);
+
+ /**
+ * Predicate if the given {@link IModelElement} is missing some of the {@link AnnotationEntry}s
+ * corresponding to the {@link IAnnotatedSpecification}s declared for its type.
+ * Calling {@link #getAnnotationEntry(IModelElement)} will actually instantiate an annotation,
+ * i.e. modify the model.
+ */
+ boolean requiresAnnotationInstantiation(final IModelElement element);
}
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/.ratings b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/.ratings
index 9d0d7f8df1b322b3005d555d7552e4aa62d05156..55aeb1e62590a7cb7f02ed56a9743e9d30b0d7ca 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/.ratings
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/.ratings
@@ -1,3 +1,3 @@
-AddMissingAnnotationsMigrationProvider.java ebc5b9348b61ffb23493942949ecccf1c1fa2ae1 GREEN
+AddMissingAnnotationsMigrationProvider.java 283f11372ce778a26362d0c83dcffdea3290b4df GREEN
RemoveDuplicatedAnnotationsMigrationProvider.java 6920909f8f211b9c5b5990644b5abcd8c4abaa3a GREEN
RemoveOutdatedAnnotationInstanceMigrationProvider.java 245530d6026f9ff29ffc577983d9de03ae5e75e5 GREEN
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/AddMissingAnnotationsMigrationProvider.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/AddMissingAnnotationsMigrationProvider.java
index ebc5b9348b61ffb23493942949ecccf1c1fa2ae1..283f11372ce778a26362d0c83dcffdea3290b4df 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/AddMissingAnnotationsMigrationProvider.java
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/AddMissingAnnotationsMigrationProvider.java
@@ -17,10 +17,13 @@ package org.fortiss.tooling.base.migration;
import static java.util.Collections.emptyMap;
import static org.fortiss.tooling.base.utils.AnnotationUtils.instantiateAnnotationsRecursive;
+import static org.fortiss.tooling.base.utils.AnnotationUtils.requiresAnnotationInstantiation;
+import static org.fortiss.tooling.kernel.utils.EcoreUtils.getFirstChildWith;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
+import java.util.function.Predicate;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.xml.type.AnyType;
@@ -45,7 +48,19 @@ public class AddMissingAnnotationsMigrationProvider implements IMigrationProvide
if(migratedProjects.contains(modelElement)) {
return false;
}
- return true;
+
+ Predicate annotationTest = eObj -> {
+ if(eObj instanceof IModelElement &&
+ requiresAnnotationInstantiation((IModelElement)eObj)) {
+ return true;
+ }
+ return false;
+ };
+
+ if(getFirstChildWith(modelElement.getRootModelElement(), annotationTest) != null) {
+ return true;
+ }
+ return false;
}
/** {@inheritDoc} */
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/.ratings b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/.ratings
index cb56cc2420509be5d99ef48a902127aa8fbb84b5..17fe2979280ecb2168402e468501bd8d0b3beeb8 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/.ratings
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/.ratings
@@ -1,12 +1,10 @@
AngleUtils.java 462551eae71738ff51f92c9906bff9a21a375d2b GREEN
-AnnotationUtils.java d97bf564f04487c2628a4ab03f93726bc2de8678 GREEN
+AnnotationUtils.java 197ceb5f39af6b96eb8f7025e3fe3b1b39c35d42 GREEN
BaseMathUtils.java 65f6c39b641cba3c984a38f42b1bbf7dbf3287a3 GREEN
BaseModelElementUtils.java b8775b7a462efc168cf79a017aa3377a782d10f6 GREEN
-ConstraintsBaseUtils.java bba938b43756ce6f35c338f6cef21c3ab5d49a9d GREEN
DimensionUtils.java 0dc67f9de11a84e6e4c6e1eb627817dee91ff30a GREEN
EllipseLayoutUtils.java 5c3a0126fdca5d5b4fb441694747e1cb0f49cd9f GREEN
LayoutDataUtils.java 5739dd16f0212e8f94927c0a0f51503390f2be69 GREEN
-LayoutModelElementAdapter.java d81dfc551baa832f2761b4804760dcd8f57b7c5b YELLOW
LayoutModelElementFactory.java c49fca2de5a8cb7502fb28cc2b7e64a272df11b0 GREEN
MigrationUtils.java ab9d8682233313c21c6a52b8b03e1c796aacd29c GREEN
OffsetOrientationUtils.java 913cebbac2a5628bdd08b4df669b9412d6e07d94 GREEN
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/AnnotationUtils.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/AnnotationUtils.java
index d97bf564f04487c2628a4ab03f93726bc2de8678..197ceb5f39af6b96eb8f7025e3fe3b1b39c35d42 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/AnnotationUtils.java
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/AnnotationUtils.java
@@ -316,6 +316,13 @@ public class AnnotationUtils {
for(IModelElement child : getChildrenWithType(element, IModelElement.class)) {
as.instantiateAnnotations(child);
}
+ }
+ /**
+ * Compact method to determine whether an {@link IModelElement} requires its annotations to be
+ * instantiated.
+ */
+ public static boolean requiresAnnotationInstantiation(IModelElement element) {
+ return IAnnotationValueService.getInstance().requiresAnnotationInstantiation(element);
}
}