From 766587e7e273ed349116ba26359a191c61f7abe1 Mon Sep 17 00:00:00 2001
From: Dongyue Mou <mou@fortiss.org>
Date: Mon, 19 Nov 2012 15:39:19 +0000
Subject: [PATCH] fixed dangling reference problem when save the project after
 deleting a component fixed consturctor exception from SIL-Plugin added
 transform action for table specification refs 1030

---
 .../HierarchicElementCompositorBase.java      | 37 ++++++++++++++++---
 1 file changed, 31 insertions(+), 6 deletions(-)

diff --git a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/HierarchicElementCompositorBase.java b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/HierarchicElementCompositorBase.java
index cce5157b1..25719a7a2 100644
--- a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/HierarchicElementCompositorBase.java
+++ b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/HierarchicElementCompositorBase.java
@@ -27,6 +27,7 @@ import org.fortiss.tooling.base.model.element.IConnector;
 import org.fortiss.tooling.base.model.element.IHierarchicElement;
 import org.fortiss.tooling.base.model.element.IHierarchicElementContainer;
 import org.fortiss.tooling.base.model.element.IModelElement;
+import org.fortiss.tooling.base.model.element.IModelElementReference;
 import org.fortiss.tooling.base.model.element.IModelElementSpecification;
 import org.fortiss.tooling.kernel.extension.IElementCompositor;
 import org.fortiss.tooling.kernel.service.IConnectionCompositorService;
@@ -69,8 +70,9 @@ public abstract class HierarchicElementCompositorBase<HE extends IHierarchicElem
 			if(!iterateDecomposeSpecifications((IModelElement)contained)) {
 				return false;
 			}
-			// TODO (CD): https://af3.fortiss.org/issues/389
-			// handle reference removal
+			if(!iterateDecomposeReference((IModelElement)contained)) {
+				return false;
+			}
 		}
 		if(contained instanceof IHierarchicElementContainer) {
 			if(!iterateDecomposeSubelements((IHierarchicElementContainer)contained)) {
@@ -101,6 +103,21 @@ public abstract class HierarchicElementCompositorBase<HE extends IHierarchicElem
 		return decomposeSpecific(contained);
 	}
 
+	/**
+	 * Iterates over references of given {@link IModelElement} and performs
+	 * decomposition.
+	 */
+	private boolean iterateDecomposeReference(IModelElement me) {
+		ArrayList<IModelElementReference> list =
+				new ArrayList<IModelElementReference>(me.getReferencedByList());
+		for(IModelElementReference ref : list) {
+			if(!decomposeReference(ref)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
 	/**
 	 * Iterates over specifications of given {@link IModelElement} and performs
 	 * decomposition.
@@ -171,10 +188,13 @@ public abstract class HierarchicElementCompositorBase<HE extends IHierarchicElem
 		return true;
 	}
 
-	/** Base implementation yet empty. */
-	protected boolean decomposeReferences(@SuppressWarnings("unused") EObject element) {
-		// TODO (FH): https://af3.fortiss.org/issues/389
-		// implement reference removal
+	/**
+	 * Base implementation uses element compositor service's decomposition by
+	 * default and returns <code>true</code>. Subclasses may override.
+	 */
+	protected boolean decomposeReference(IModelElementReference element) {
+		element.setReference(null);
+		EcoreUtil.delete(element);
 		return true;
 	}
 
@@ -202,6 +222,11 @@ public abstract class HierarchicElementCompositorBase<HE extends IHierarchicElem
 				return false;
 			}
 		}
+
+		if(IElementCompositorService.INSTANCE.canDecompose(element)) {
+			return IElementCompositorService.INSTANCE.decompose(element);
+		}
+
 		EcoreUtil.delete(element);
 		return true;
 	}
-- 
GitLab