diff --git a/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/service/.ratings b/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/service/.ratings index f8540890c8d392bcc33f3ca89394f4c9a6f113e0..7c56142f7d1f62a0beee52ac6272bd687efbfdf3 100644 --- a/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/service/.ratings +++ b/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/service/.ratings @@ -1,5 +1,5 @@ IReuseProvider.java 18d293f7f1f072883188f16fb6eeb52c8d6042cf GREEN IReuseProviderService.java bcc70de0bb8d39c330e3a25d884abc7092dc1b7e GREEN LayoutedReuseProviderBase.java b0e4ce3cda818b0723ec37b925a4c4c3d0c41909 GREEN -ReuseProviderBase.java ac47f5ecafed0bdef6ef5183c7194aa756f723fd GREEN +ReuseProviderBase.java c956ba13df1b7b5c8dbd7cd1a9205a06b5cebba1 YELLOW ReuseProviderService.java c4ef33283002d6dac6167f9c6c8f71d2c2ce39d1 GREEN diff --git a/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/service/ReuseProviderBase.java b/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/service/ReuseProviderBase.java index ac47f5ecafed0bdef6ef5183c7194aa756f723fd..c956ba13df1b7b5c8dbd7cd1a9205a06b5cebba1 100644 --- a/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/service/ReuseProviderBase.java +++ b/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/service/ReuseProviderBase.java @@ -20,9 +20,11 @@ import static org.fortiss.tooling.ext.variability.util.VariabilityUtils.getOptVa import static org.fortiss.tooling.kernel.utils.EcoreUtils.replaceEObjectReferences; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EReference; import org.fortiss.tooling.base.model.element.IHierarchicElement; import org.fortiss.tooling.base.model.element.IHierarchicElementContainer; import org.fortiss.tooling.base.model.element.IModelElement; @@ -48,6 +50,9 @@ public class ReuseProviderBase<T extends EObject> implements IReuseProvider<T> { if(reuseElement instanceof IModelElement) { removeVariabilitySpecifications((IModelElement)reuseElement); } + + removeExternalReferences(reuseElement); + return true; } @@ -124,4 +129,35 @@ public class ReuseProviderBase<T extends EObject> implements IReuseProvider<T> { } } } + + /** + * Recursively removes all external (i.e. non-containment) reference targets from this and all + * contained {@link EObject}s. + * + * @param eObj + * The {@link EObject} for which all reference targets shall be removed. + */ + @SuppressWarnings("unchecked") + private void removeExternalReferences(EObject eObj) { + for(EReference ref : eObj.eClass().getEReferences()) { + Object refTarget = eObj.eGet(ref); + + if(refTarget == null) { + continue; + } + + if(ref.isContainment()) { + // Containment relations must not be removed. Yet, references of childs need to be + // removed recursively. + if(refTarget instanceof Collection<?>) { + ((Collection<EObject>)refTarget).stream() + .forEach(t -> removeExternalReferences(t)); + } else { + removeExternalReferences((EObject)refTarget); + } + } else { + eObj.eSet(ref, null); + } + } + } }