[516572] Change models' superclass to MinimalEObjectImpl$Container
As we heavily rely on containment structures in the comparison model and
the tree node model (navigating to containers, etc.), it would be better
to extend MinimalEObjectImpl$Container rather than using
MinimalEObjectImpl as it is now. MinimalEObjectImpl$Container has a
dedicated field to store the container rather than using the storage
array also for the containment feature.
Bug: 516572
Change-Id: I4ea7a18963d4f0785f8ef075394388689c67c107
Signed-off-by: Philip Langer <planger@eclipsesource.com>
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/ConflictNode.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/ConflictNode.java
index 8b305bd..dccb814 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/ConflictNode.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/ConflictNode.java
@@ -13,7 +13,6 @@
import com.google.common.collect.Iterables;
import org.eclipse.emf.compare.Conflict;
-import org.eclipse.emf.edit.tree.impl.TreeNodeImpl;
/**
* This class is wrapper for TreeNode used to represent a conflict TreeNode.
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/DiffNode.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/DiffNode.java
index 78b1510..f3b393b 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/DiffNode.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/DiffNode.java
@@ -13,7 +13,6 @@
import com.google.common.collect.Iterables;
import org.eclipse.emf.compare.Diff;
-import org.eclipse.emf.edit.tree.impl.TreeNodeImpl;
/**
* This class is wrapper for TreeNode used to represent a diff TreeNode.
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/MatchNode.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/MatchNode.java
index f6b41f9..686aeaa 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/MatchNode.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/MatchNode.java
@@ -13,7 +13,6 @@
import com.google.common.collect.Iterables;
import org.eclipse.emf.compare.Match;
-import org.eclipse.emf.edit.tree.impl.TreeNodeImpl;
/**
* This class is wrapper for TreeNode used to represent a match TreeNode.
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/MatchResourceNode.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/MatchResourceNode.java
index 268d308..54d3955 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/MatchResourceNode.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/MatchResourceNode.java
@@ -13,7 +13,6 @@
import com.google.common.collect.Iterables;
import org.eclipse.emf.compare.MatchResource;
-import org.eclipse.emf.edit.tree.impl.TreeNodeImpl;
/**
* This class is wrapper for TreeNode used to represent a match resource TreeNode.
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/TreeNodeImpl.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/TreeNodeImpl.java
new file mode 100644
index 0000000..8bc8f23
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/nodes/TreeNodeImpl.java
@@ -0,0 +1,327 @@
+/**
+ * Copyright (c) 2002-2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ */
+package org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.nodes;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.InternalEList;
+import org.eclipse.emf.edit.tree.TreeNode;
+import org.eclipse.emf.edit.tree.TreePackage;
+
+/**
+ * <!-- begin-user-doc --> An implementation of the model object '<em><b>Node</b></em>'. <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.emf.edit.tree.impl.TreeNodeImpl#getParent <em>Parent</em>}</li>
+ * <li>{@link org.eclipse.emf.edit.tree.impl.TreeNodeImpl#getChildren <em>Children</em>}</li>
+ * <li>{@link org.eclipse.emf.edit.tree.impl.TreeNodeImpl#getData <em>Data</em>}</li>
+ * </ul>
+ * <p>
+ * This class is an exact copy of org.eclipse.emf.edit.tree.impl.TreeNodeImpl, but inherits from
+ * MinimalEObjectImpl.Container instead of from EObjectImpl to improve efficiency in memory consumtion.
+ * </p>
+ *
+ * @generated
+ */
+public class TreeNodeImpl extends MinimalEObjectImpl.Container implements TreeNode {
+ /**
+ * The cached value of the '{@link #getChildren() <em>Children</em>}' containment reference list. <!--
+ * begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @see #getChildren()
+ * @generated
+ * @ordered
+ */
+ protected EList<TreeNode> children;
+
+ /**
+ * The cached value of the '{@link #getData() <em>Data</em>}' reference. <!-- begin-user-doc --> <!--
+ * end-user-doc -->
+ *
+ * @see #getData()
+ * @generated
+ * @ordered
+ */
+ protected EObject data;
+
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated modifiable
+ */
+ protected TreeNodeImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return TreePackage.Literals.TREE_NODE;
+ }
+
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ public TreeNode getParent() {
+ if (eContainerFeatureID() != TreePackage.TREE_NODE__PARENT) {
+ return null;
+ }
+ return (TreeNode)eInternalContainer();
+ }
+
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ public NotificationChain basicSetParent(TreeNode newParent, NotificationChain msgs) {
+ msgs = eBasicSetContainer((InternalEObject)newParent, TreePackage.TREE_NODE__PARENT, msgs);
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ public void setParent(TreeNode newParent) {
+ if (newParent != eInternalContainer()
+ || (eContainerFeatureID() != TreePackage.TREE_NODE__PARENT && newParent != null)) {
+ if (EcoreUtil.isAncestor(this, newParent)) {
+ throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
+ }
+ NotificationChain msgs = null;
+ if (eInternalContainer() != null) {
+ msgs = eBasicRemoveFromContainer(msgs);
+ }
+ if (newParent != null) {
+ msgs = ((InternalEObject)newParent).eInverseAdd(this, TreePackage.TREE_NODE__CHILDREN,
+ TreeNode.class, msgs);
+ }
+ msgs = basicSetParent(newParent, msgs);
+ if (msgs != null) {
+ msgs.dispatch();
+ }
+ } else if (eNotificationRequired()) {
+ eNotify(new ENotificationImpl(this, Notification.SET, TreePackage.TREE_NODE__PARENT, newParent,
+ newParent));
+ }
+ }
+
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ public EList<TreeNode> getChildren() {
+ if (children == null) {
+ children = new EObjectContainmentWithInverseEList<TreeNode>(TreeNode.class, this,
+ TreePackage.TREE_NODE__CHILDREN, TreePackage.TREE_NODE__PARENT);
+ }
+ return children;
+ }
+
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ public EObject getData() {
+ if (data != null && data.eIsProxy()) {
+ InternalEObject oldData = (InternalEObject)data;
+ data = eResolveProxy(oldData);
+ if (data != oldData) {
+ if (eNotificationRequired()) {
+ eNotify(new ENotificationImpl(this, Notification.RESOLVE, TreePackage.TREE_NODE__DATA,
+ oldData, data));
+ }
+ }
+ }
+ return data;
+ }
+
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ public EObject basicGetData() {
+ return data;
+ }
+
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ public void setData(EObject newData) {
+ EObject oldData = data;
+ data = newData;
+ if (eNotificationRequired()) {
+ eNotify(new ENotificationImpl(this, Notification.SET, TreePackage.TREE_NODE__DATA, oldData,
+ data));
+ }
+ }
+
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case TreePackage.TREE_NODE__PARENT:
+ if (eInternalContainer() != null) {
+ msgs = eBasicRemoveFromContainer(msgs);
+ }
+ return basicSetParent((TreeNode)otherEnd, msgs);
+ case TreePackage.TREE_NODE__CHILDREN:
+ return ((InternalEList<InternalEObject>)(InternalEList<?>)getChildren()).basicAdd(otherEnd,
+ msgs);
+ }
+ return super.eInverseAdd(otherEnd, featureID, msgs);
+ }
+
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case TreePackage.TREE_NODE__PARENT:
+ return basicSetParent(null, msgs);
+ case TreePackage.TREE_NODE__CHILDREN:
+ return ((InternalEList<?>)getChildren()).basicRemove(otherEnd, msgs);
+ }
+ return super.eInverseRemove(otherEnd, featureID, msgs);
+ }
+
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs) {
+ switch (eContainerFeatureID()) {
+ case TreePackage.TREE_NODE__PARENT:
+ return eInternalContainer().eInverseRemove(this, TreePackage.TREE_NODE__CHILDREN,
+ TreeNode.class, msgs);
+ }
+ return super.eBasicRemoveFromContainerFeature(msgs);
+ }
+
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public Object eGet(int featureID, boolean resolve, boolean coreType) {
+ switch (featureID) {
+ case TreePackage.TREE_NODE__PARENT:
+ return getParent();
+ case TreePackage.TREE_NODE__CHILDREN:
+ return getChildren();
+ case TreePackage.TREE_NODE__DATA:
+ if (resolve) {
+ return getData();
+ }
+ return basicGetData();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public void eSet(int featureID, Object newValue) {
+ switch (featureID) {
+ case TreePackage.TREE_NODE__PARENT:
+ setParent((TreeNode)newValue);
+ return;
+ case TreePackage.TREE_NODE__CHILDREN:
+ getChildren().clear();
+ getChildren().addAll((Collection<? extends TreeNode>)newValue);
+ return;
+ case TreePackage.TREE_NODE__DATA:
+ setData((EObject)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID) {
+ switch (featureID) {
+ case TreePackage.TREE_NODE__PARENT:
+ setParent((TreeNode)null);
+ return;
+ case TreePackage.TREE_NODE__CHILDREN:
+ getChildren().clear();
+ return;
+ case TreePackage.TREE_NODE__DATA:
+ setData((EObject)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID) {
+ switch (featureID) {
+ case TreePackage.TREE_NODE__PARENT:
+ return getParent() != null;
+ case TreePackage.TREE_NODE__CHILDREN:
+ return children != null && !children.isEmpty();
+ case TreePackage.TREE_NODE__DATA:
+ return data != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} // TreeNodeImpl
diff --git a/plugins/org.eclipse.emf.compare/model/compare.genmodel b/plugins/org.eclipse.emf.compare/model/compare.genmodel
index 2c696b9..1c6d52f 100644
--- a/plugins/org.eclipse.emf.compare/model/compare.genmodel
+++ b/plugins/org.eclipse.emf.compare/model/compare.genmodel
@@ -5,7 +5,7 @@
editorDirectory="/org.eclipse.emf.compare.editor/src-gen" modelPluginID="org.eclipse.emf.compare"
modelName="Compare" editPluginClass="org.eclipse.emf.compare.provider.EMFCompareEditPlugin"
editorPluginClass="org.eclipse.emf.compare.presentation.EMFCompareEditorPlugin"
- nonNLSMarkers="true" rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl"
+ nonNLSMarkers="true" rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container"
codeFormatting="true" testsDirectory="/org.eclipse.emf.compare.tests/src-gen"
testSuiteClass="org.eclipse.emf.compare.tests.CompareAllTests" importerID="org.eclipse.emf.importer.ecore"
complianceLevel="5.0" colorProviders="true" fontProviders="true" runtimeVersion="2.5"
@@ -27,6 +27,7 @@
<genEnumLiterals ecoreEnumLiteral="compare.ecore#//DifferenceState/UNRESOLVED"/>
<genEnumLiterals ecoreEnumLiteral="compare.ecore#//DifferenceState/MERGED"/>
<genEnumLiterals ecoreEnumLiteral="compare.ecore#//DifferenceState/DISCARDED"/>
+ <genEnumLiterals ecoreEnumLiteral="compare.ecore#//DifferenceState/MERGING"/>
</genEnums>
<genEnums typeSafeEnumCompatible="false" ecoreEnum="compare.ecore#//ConflictKind">
<genEnumLiterals ecoreEnumLiteral="compare.ecore#//ConflictKind/REAL"/>
diff --git a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/ComparisonImpl.java b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/ComparisonImpl.java
index 0b181c0f..52f63c3 100644
--- a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/ComparisonImpl.java
+++ b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/ComparisonImpl.java
@@ -51,7 +51,7 @@
* @generated
*/
@SuppressWarnings("boxing")
-public class ComparisonImpl extends MinimalEObjectImpl implements Comparison {
+public class ComparisonImpl extends MinimalEObjectImpl.Container implements Comparison {
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
diff --git a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/ConflictImpl.java b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/ConflictImpl.java
index 33145c2..fc8b495 100644
--- a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/ConflictImpl.java
+++ b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/ConflictImpl.java
@@ -45,7 +45,7 @@
*
* @generated
*/
-public class ConflictImpl extends MinimalEObjectImpl implements Conflict {
+public class ConflictImpl extends MinimalEObjectImpl.Container implements Conflict {
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/DiffImpl.java b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/DiffImpl.java
index 11e5754..f4cd400 100644
--- a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/DiffImpl.java
+++ b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/DiffImpl.java
@@ -56,7 +56,7 @@
*/
// Supressing warnings : generated code
@SuppressWarnings("all")
-public class DiffImpl extends MinimalEObjectImpl implements Diff {
+public class DiffImpl extends MinimalEObjectImpl.Container implements Diff {
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
diff --git a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/EquivalenceImpl.java b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/EquivalenceImpl.java
index beb2970..f5a208e 100644
--- a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/EquivalenceImpl.java
+++ b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/EquivalenceImpl.java
@@ -41,7 +41,7 @@
*
* @generated
*/
-public class EquivalenceImpl extends MinimalEObjectImpl implements Equivalence {
+public class EquivalenceImpl extends MinimalEObjectImpl.Container implements Equivalence {
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/MatchImpl.java b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/MatchImpl.java
index 2e9d4e8..a68d427 100644
--- a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/MatchImpl.java
+++ b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/MatchImpl.java
@@ -50,7 +50,7 @@
*
* @generated
*/
-public class MatchImpl extends MinimalEObjectImpl implements Match {
+public class MatchImpl extends MinimalEObjectImpl.Container implements Match {
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/MatchResourceImpl.java b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/MatchResourceImpl.java
index 0da7327..7e8283d 100644
--- a/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/MatchResourceImpl.java
+++ b/plugins/org.eclipse.emf.compare/src-gen/org/eclipse/emf/compare/impl/MatchResourceImpl.java
@@ -52,7 +52,7 @@
*/
//Supressing warnings : generated code
@SuppressWarnings("all")
-public class MatchResourceImpl extends MinimalEObjectImpl implements MatchResource {
+public class MatchResourceImpl extends MinimalEObjectImpl.Container implements MatchResource {
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->