2014-03-28 78 views
1

我創建了我的元模型,名爲WFG.ecoreEMF-如何以編程方式從模型中刪除實例

ATL我設法轉換WFG模型中的bpmn2文件。 ATL轉換給對象WorkFlow,這是WFG中所有其他對象的容器。

現在我想用Java編程修改對象WorkFlow,但我不能。

如何從其容器中刪除對象實例,以及如何從所有實例中刪除對象實例?

下面有一個與實例

  gateways 
      +--------->+----------+ 
      |   |Gateway_1 | 
      ♦   +----------+ 
+-----------+   ^
|WorkFlow_1 |    | nextGateway 0..1 
+-----------+    | 
      ♦   +---------+ 
      |   | Node_1 | 
      +---------->+---------+ 
      nodes 

我想刪除實例Gateway_1,因此,它在WorkFlow_1沒有更多的遏制,使Node_1.getNextGateway->null一個例子。我試着做 WorkFlow_1.getGateways().remove(Gateway_1)但不工作

回答

-1
DeleteCommand.create(editingDomain, Collections.singleton(Gateway_1)); 
editingDomain.getCommandStack().execute(command); 

而對於Node_1:

Node_1.setNextGateway(null); 
+0

所以我必須手動刪除遞歸引用,這是不夠的,只是從容器中刪除一個對象。有沒有辦法自動做到這一點?手動刪除引用很容易出錯,特別是如果我將來添加新的引用,並且很難記住添加相對的刪除代碼。謝謝 – DeLac

+1

EcoreUtil刪除方法可以幫助:http://download.eclipse.org/modeling/emf/emf/javadoc/2.5.0/org/eclipse/emf/ecore/util/EcoreUtil.html – Severin

+0

太棒了!謝謝 – DeLac

1

天真的答案是使用EcoreUtil.delete()Delete命令。這兩種方法都將EObject從其容器中移除,並刪除(即無效)任何交叉引用。一般來說,你不想這樣做,原因如下:

  1. 子引用。雖然EcoreUtil.delete(Gateway_1)將刪除其容器Gateway_1Node_1參考,它不會刪除到Gateway_1孩子,即使他們也將是從他們的容器DELETED任何交叉引用。所以你最終可能會懸掛引用不存在的對象,這些對象是子女Gateway_1

  2. 表現。沒有可靠的方法來有效地找到交叉引用。這意味着模型中的每個EObject都將被檢查以查看它是否具有對Gateway_1的交叉引用,以便可以刪除交叉引用。這使得EcoreUtil.delete()O(n)操作其中n是您的模型中的EObject的數量。

最好的解決方案是雙向參考和參考地圖的某種組合。 Gateway_1應該知道誰在交叉引用它,或者該信息應該可以在其他地方訪問。通過這種方式,您可以高效完整地刪除對Gateway_1的所有引用。

這個回答嚴格遵循this blog post, EMF Dos and Don'ts #11, by Maximilian Koegel and Jonas Helming

順便說一句,EcoreUtil.remove()沒有做交叉引用刪除,它只是從它的容器中刪除EObject。

相關問題