From 8e1a8755b0e9366c4e1bca4a22a766fa69c494e5 Mon Sep 17 00:00:00 2001 From: Andreas Bayha <bayha@fortiss.org> Date: Fri, 24 Nov 2023 17:03:14 +0100 Subject: [PATCH] YELLOW Issue-ref: 4346 Issue-URL: https://git.fortiss.org/af3/af3/-/issues/4346 Signed-off-by: Andreas Bayha <bayha@fortiss.org> --- .../tooling/ext/reuse/service/.ratings | 2 +- .../ext/reuse/service/ReuseProviderBase.java | 20 +++++++++---------- 2 files changed, 10 insertions(+), 12 deletions(-) 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 9b973ded3..d103509c5 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 51be8cde5d4aa3ec79433a5d728a6342f18d29ba YELLOW +ReuseProviderBase.java b324d23be4deffbc97e587a76b527be2573942d1 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 cb20718a7..b324d23be 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 @@ -21,7 +21,6 @@ import static org.fortiss.tooling.kernel.utils.EcoreUtils.getChildrenWithType; import static org.fortiss.tooling.kernel.utils.EcoreUtils.replaceEObjectReferences; import java.util.ArrayList; -import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -144,8 +143,9 @@ public class ReuseProviderBase<T extends EObject> implements IReuseProvider<T> { * The {@link EObject} for which all reference targets shall be removed. */ private void removeExternalReferences(EObject element) { - // Whitelist all contained elements as reference targets. + // Whitelist all contained elements as legal references (since they will also be copied). Set<EObject> whitelist = new HashSet<EObject>(getChildrenWithType(element, EObject.class)); + whitelist.add(element); removeReferences(element, whitelist); } @@ -159,27 +159,25 @@ public class ReuseProviderBase<T extends EObject> implements IReuseProvider<T> { */ @SuppressWarnings("unchecked") private void removeReferences(EObject element, Set<EObject> whitelist) { - // FIXME (SeB): the loop below does not get all internal/nested references, which is why it - // will skip the removals of internal references due to no direct references in the given - // element. - for(EReference ref : element.eClass().getEReferences()) { + for(EReference ref : element.eClass().getEAllReferences()) { Object refTarget = element.eGet(ref); if(refTarget == null) { continue; } - if(refTarget instanceof Collection<?>) { - Collection<EObject> refTargetCollection = (Collection<EObject>)refTarget; + if(refTarget instanceof List<?>) { + List<EObject> refTargetList = (List<EObject>)refTarget; if(ref.isContainment()) { // Containment relations must not be removed. Yet, references of children need // to be removed recursively. - refTargetCollection.stream() - .forEach(target -> removeReferences(target, whitelist)); + refTargetList.stream().forEach(target -> removeReferences(target, whitelist)); + } else { - refTargetCollection.removeIf(target -> !whitelist.contains(target)); + refTargetList.removeIf(t -> !whitelist.contains(t)); } + } else { if(ref.isContainment()) { // Keep reference target and make recursive call. -- GitLab