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 cce5157b185d5cfb767558eff2152eef4c693686..25719a7a29447d60158976de8673877ad96c8b12 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; }