From e21393c465e243d6e83b53c0fa7f69d05c4b259b Mon Sep 17 00:00:00 2001 From: Quang Truong Date: Fri, 4 Jul 2025 13:09:37 +0200 Subject: [PATCH] Fix wrong ID resolver --- .../core/fileservice/ToolboxIDResolver.java | 39 ++++++++++++++++--- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/fileservice/ToolboxIDResolver.java b/java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/fileservice/ToolboxIDResolver.java index 7213b2a83a..3ddd5c963a 100644 --- a/java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/fileservice/ToolboxIDResolver.java +++ b/java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/fileservice/ToolboxIDResolver.java @@ -9,6 +9,10 @@ */ package org.eclipse.set.core.fileservice; +import java.util.Optional; + +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.ecore.EAnnotation; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; @@ -25,6 +29,7 @@ */ public class ToolboxIDResolver { private final GuidCache guidCache = new GuidCache(); + private static final String PLANPRO_ID_REFERENCE_ANNOTATION_SOURCE = "planpro/id_reference"; //$NON-NLS-1$ private ToolboxIDResolver(final PlanPro_Schnittstelle model) { guidCache.prepare(model); @@ -123,13 +128,27 @@ private void resolveIDReference(final EObject ref, final String guid) { } private static void setIDReference(final EObject ref, final EObject value) { + boolean isValid = false; + final Optional idReferenceAnnotation = ref.eClass() + .getEAnnotations() + .stream() + .filter(annotation -> annotation.getSource() + .equals(PLANPRO_ID_REFERENCE_ANNOTATION_SOURCE)) + .findFirst(); + if (idReferenceAnnotation.isPresent()) { + final EList references = idReferenceAnnotation.get() + .getReferences(); + + isValid = references.stream() + .filter(EClass.class::isInstance) + .anyMatch(reference -> isValidReference((EClass) reference, + value)); + } else { + final EReference valueFeature = getValueFeature(ref); + isValid = isValidReference(valueFeature.getEReferenceType(), value); + } - final EClass referenceType = getValueFeature(ref).getEReferenceType(); - - // If we have a value, check whether it is applicable - final Class valueClass = value.getClass(); - final Class referenceClass = referenceType.getInstanceClass(); - if (!referenceClass.isAssignableFrom(valueClass)) { + if (!isValid) { // object found, but has wrong type -> mark invalid ref.eSet(getValidFeature(ref), Boolean.TRUE); ref.eSet(getValueFeature(ref), null); @@ -139,4 +158,12 @@ private static void setIDReference(final EObject ref, final EObject value) { ref.eSet(getValueFeature(ref), value); } + private static boolean isValidReference(final EClass refClass, + final EObject value) { + // If we have a value, check whether it is applicable + final Class valueClass = value.getClass(); + final Class referenceClass = refClass.getInstanceClass(); + return referenceClass.isAssignableFrom(valueClass); + } + }