diff options
author | Eike Stepper | 2006-10-31 19:07:53 +0000 |
---|---|---|
committer | Eike Stepper | 2006-10-31 19:07:53 +0000 |
commit | d0c26771aa84bb84a6da73d8209b159e2452b6c0 (patch) | |
tree | 20b857774dd04a564f03e95513e38f0540d79f26 | |
parent | 03b955bc60d8250f2b5671819af5fbed7f4b2e4a (diff) | |
download | cdo-d0c26771aa84bb84a6da73d8209b159e2452b6c0.tar.gz cdo-d0c26771aa84bb84a6da73d8209b159e2452b6c0.tar.xz cdo-d0c26771aa84bb84a6da73d8209b159e2452b6c0.zip |
[162961] CDO objects not loading correctly - https://bugs.eclipse.org/bugs/show_bug.cgi?id=162961
12 files changed, 640 insertions, 13 deletions
diff --git a/plugins/org.eclipse.emf.cdo.tests/launches/CDO All Tests.launch b/plugins/org.eclipse.emf.cdo.tests/launches/CDO All Tests.launch index 6264660043..3bee233005 100644 --- a/plugins/org.eclipse.emf.cdo.tests/launches/CDO All Tests.launch +++ b/plugins/org.eclipse.emf.cdo.tests/launches/CDO All Tests.launch @@ -12,7 +12,6 @@ </listAttribute> <stringAttribute key="selected_target_plugins" value="com.ibm.icu,org.apache.ant,org.apache.xerces,org.eclipse.ant.core,org.eclipse.core.contenttype,org.eclipse.core.expressions,org.eclipse.core.filesystem,org.eclipse.core.filesystem.win32.x86,org.eclipse.core.jobs,org.eclipse.core.resources,org.eclipse.core.resources.compatibility,org.eclipse.core.resources.win32,org.eclipse.core.runtime,org.eclipse.core.runtime.compatibility,org.eclipse.core.runtime.compatibility.auth,org.eclipse.core.runtime.compatibility.registry,org.eclipse.core.variables,org.eclipse.emf.common,org.eclipse.emf.ecore,org.eclipse.emf.ecore.change,org.eclipse.emf.ecore.edit,org.eclipse.emf.ecore.xmi,org.eclipse.emf.edit,org.eclipse.emf.ocl,org.eclipse.equinox.common,org.eclipse.equinox.preferences,org.eclipse.equinox.registry,org.eclipse.osgi,org.eclipse.update.configurator,org.junit"/> <stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/> -<stringAttribute key="org.eclipse.debug.ui.ATTR_CAPTURE_IN_FILE" value="/AllTests.txt"/> <booleanAttribute key="automaticValidate" value="true"/> <booleanAttribute key="org.eclipse.hyades.trace.ui.ATTR_SHOW_HEAP_INSTANCES" value="true"/> <stringAttribute key="org.eclipse.hyades.trace.ui.ATTR_DESTINATION_FILE" value=""/> @@ -21,15 +20,15 @@ <booleanAttribute key="automaticAdd" value="false"/> <stringAttribute key="checked" value="[NONE]"/> <booleanAttribute key="org.eclipse.hyades.trace.ui.ATTR_PROFILE_TO_FILE" value="false"/> -<stringAttribute key="selected_workspace_plugins" value="org.eclipse.emf.cdo.jdbc,org.eclipse.net4j.spring,org.eclipse.net4j.socket,org.eclipse.net4j.core,org.eclipse.net4j.spring.db,org.eclipse.emf.cdo.dbgen,org.eclipse.emf.cdo.tests,org.eclipse.emf.cdo.mapping,org.eclipse.emf.cdo.core,org.eclipse.emf.cdo.client,org.eclipse.net4j.util,org.eclipse.emf.cdo.client.ocl,org.eclipse.emf.cdo.server,org.eclipse.net4j.embedded,org.eclipse.emf.cdo.jdbc.derby,org.eclipse.emf.cdo.dbgen.derby,org.eclipse.emf.cdo.dbgen.oracle,org.eclipse.emf.cdo.jdbc.hsqldb,org.eclipse.emf.cdo.jdbc.mysql,org.eclipse.emf.cdo.dbgen.ansi92,org.eclipse.emf.cdo.dbgen.mysql,org.eclipse.emf.cdo.dbgen.hsqldb"/> +<stringAttribute key="selected_workspace_plugins" value="org.eclipse.emf.cdo.jdbc,org.eclipse.net4j.spring,org.eclipse.net4j.socket,org.eclipse.net4j.core,org.eclipse.net4j.spring.db,org.eclipse.emf.cdo.dbgen,org.eclipse.emf.cdo.tests,org.eclipse.emf.cdo.mapping,org.eclipse.emf.cdo.core,org.eclipse.emf.cdo.client,org.eclipse.net4j.util,org.eclipse.emf.cdo.server,org.eclipse.emf.cdo.client.ocl,org.eclipse.net4j.embedded,org.eclipse.emf.cdo.jdbc.derby,org.eclipse.emf.cdo.dbgen.derby,org.eclipse.emf.cdo.dbgen.oracle,org.eclipse.emf.cdo.jdbc.hsqldb,org.eclipse.emf.cdo.jdbc.mysql,org.eclipse.emf.cdo.dbgen.ansi92,org.eclipse.emf.cdo.dbgen.mysql,org.eclipse.emf.cdo.dbgen.hsqldb"/> <stringAttribute key="location" value="${workspace_loc}/../junit-workspace"/> <stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/> <stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/> <booleanAttribute key="clearws" value="true"/> <stringAttribute key="org.eclipse.hyades.trace.ui.ATTR_DESTINATION_MONITOR" value="DefaultMonitor"/> <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.emf.cdo.tests.model1.AllTests"/> -<booleanAttribute key="org.eclipse.debug.ui.ATTR_CONSOLE_OUTPUT_ON" value="false"/> <stringAttribute key="pde.version" value="3.2a"/> +<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dcdo.test.mode=Client-Server"/> <stringAttribute key="templateConfig" value="${target_home}\configuration\config.ini"/> <booleanAttribute key="default" value="false"/> <booleanAttribute key="clearConfig" value="true"/> diff --git a/plugins/org.eclipse.emf.cdo.tests/model/TestModel1.ecore b/plugins/org.eclipse.emf.cdo.tests/model/TestModel1.ecore index b010a1e23b..7581af6a56 100644 --- a/plugins/org.eclipse.emf.cdo.tests/model/TestModel1.ecore +++ b/plugins/org.eclipse.emf.cdo.tests/model/TestModel1.ecore @@ -8,6 +8,10 @@ eOpposite="#//TreeNode/children"/> <eStructuralFeatures xsi:type="ecore:EReference" name="children" upperBound="-1" eType="#//TreeNode" containment="true" eOpposite="#//TreeNode/parent"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="parent2" eType="#//TreeNode" + eOpposite="#//TreeNode/children2"/> + <eStructuralFeatures xsi:type="ecore:EReference" name="children2" upperBound="-1" + eType="#//TreeNode" containment="true" eOpposite="#//TreeNode/parent2"/> <eStructuralFeatures xsi:type="ecore:EReference" name="references" upperBound="-1" eType="#//TreeNode"/> <eStructuralFeatures xsi:type="ecore:EAttribute" name="booleanFeature" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/> diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/model1/AllTests.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/model1/AllTests.java index cf250fcd48..c7aab3039f 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/model1/AllTests.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/model1/AllTests.java @@ -32,6 +32,7 @@ public class AllTests suite.addTestSuite(Bugzilla154389Test.class); suite.addTestSuite(Bugzilla155899Test.class); suite.addTestSuite(Bugzilla162017Test.class); + suite.addTestSuite(Bugzilla162961Test.class); return suite; } } diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/model1/Bugzilla162961Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/model1/Bugzilla162961Test.java new file mode 100644 index 0000000000..210d7ac54f --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/model1/Bugzilla162961Test.java @@ -0,0 +1,303 @@ +/*************************************************************************** + * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. + * 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: + * Eike Stepper - initial API and implementation + **************************************************************************/ +package org.eclipse.emf.cdo.tests.model1; + + +import org.eclipse.emf.common.util.EList; + +import testmodel1.ExtendedNode; +import testmodel1.TreeNode; + + +/** + * CDO objects not loading correctly. + * + * If I can use the analogy of the library that will help. + * Assume that I have a class for Library which 'contains' all books. + * I also have a class, or classes, for genre that may have non-containment + * references to books. So a book could have references to-from a genre, + * and always has a reference to the Library, which is containment. + * + * Now I want to load all the books so I call library.getBooks(). + * This works consistently. And if I subsequently, during the same session, + * load a genre with a call to fiction.getBooks() that works as well. + * + * However, if I restart to create a new session, and do the genre load + * first I will see the books in the genre loaded correctly, + * but a subsequent call to load all the books in the library will not + * have any of the books initially loaded in the genre. + * + * This is happening consistently, every time. + * + * It appears that loading the containment references from Library is doing + * something a bit different than the load of non-containment references + * for the genre. If the initial load is via containment all the non-containment + * references are correct. However, if the initial load is via non-containment + * references then the other references, specifically the containment reference, + * is not correct. + * + * I suspect this is strictly a client side issue since the object is + * loaded from the server. It seems to be the handling of setting all + * the references for an object is not correct. + * + * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=162961 + */ +public class Bugzilla162961Test extends AbstractModel1Test +{ + public void testViaContainment() throws Exception + { + { + TreeNode root = createNode("root"); + TreeNode books = createNode("books", root); + TreeNode genres = createNode("genres", root); + + ExtendedNode book0 = createExtended("book0", books); + ExtendedNode book1 = createExtended("book1", books); + ExtendedNode book2 = createExtended("book2", books); + ExtendedNode book3 = createExtended("book3", books); + + ExtendedNode genre0 = createExtended("genre0", genres); + ExtendedNode genre1 = createExtended("genre1", genres); + ExtendedNode genre2 = createExtended("genre2", genres); + ExtendedNode genre3 = createExtended("genre3", genres); + + book0.getBidiSource().add(genre0); + book0.getBidiSource().add(genre1); + book0.getBidiSource().add(genre2); + book0.getBidiSource().add(genre3); + + book1.getBidiSource().add(genre0); + book1.getBidiSource().add(genre1); + book1.getBidiSource().add(genre2); + + book2.getBidiSource().add(genre0); + book2.getBidiSource().add(genre1); + + book3.getBidiSource().add(genre0); + saveRoot(root, "/test/res"); + } + + { + TreeNode root = (TreeNode) loadRoot("/test/res"); + TreeNode books = findChild("books", root); + EList children = books.getChildren(); + assertEquals("book0", ((ExtendedNode) children.get(0)).getStringFeature()); + assertEquals("book1", ((ExtendedNode) children.get(1)).getStringFeature()); + assertEquals("book2", ((ExtendedNode) children.get(2)).getStringFeature()); + assertEquals("book3", ((ExtendedNode) children.get(3)).getStringFeature()); + } + } + + public void testViaXRef() throws Exception + { + { + TreeNode root = createNode("root"); + TreeNode books = createNode("books", root); + TreeNode genres = createNode("genres", root); + + ExtendedNode book0 = createExtended("book0", books); + ExtendedNode book1 = createExtended("book1", books); + ExtendedNode book2 = createExtended("book2", books); + ExtendedNode book3 = createExtended("book3", books); + + ExtendedNode genre0 = createExtended("genre0", genres); + ExtendedNode genre1 = createExtended("genre1", genres); + ExtendedNode genre2 = createExtended("genre2", genres); + ExtendedNode genre3 = createExtended("genre3", genres); + + book0.getBidiSource().add(genre0); + book0.getBidiSource().add(genre1); + book0.getBidiSource().add(genre2); + book0.getBidiSource().add(genre3); + + book1.getBidiSource().add(genre0); + book1.getBidiSource().add(genre1); + book1.getBidiSource().add(genre2); + + book2.getBidiSource().add(genre0); + book2.getBidiSource().add(genre1); + + book3.getBidiSource().add(genre0); + saveRoot(root, "/test/res"); + } + + { + TreeNode root = (TreeNode) loadRoot("/test/res"); + TreeNode genres = findChild("genres", root); + ExtendedNode genre0 = (ExtendedNode) genres.getChildren().get(0); + assertEquals("book0", ((ExtendedNode) genre0.getBidiTarget().get(0)).getStringFeature()); + assertEquals("book1", ((ExtendedNode) genre0.getBidiTarget().get(1)).getStringFeature()); + assertEquals("book2", ((ExtendedNode) genre0.getBidiTarget().get(2)).getStringFeature()); + assertEquals("book3", ((ExtendedNode) genre0.getBidiTarget().get(3)).getStringFeature()); + + TreeNode books = findChild("books", root); + EList children = books.getChildren(); + assertEquals("book0", ((ExtendedNode) children.get(0)).getStringFeature()); + assertEquals("book1", ((ExtendedNode) children.get(1)).getStringFeature()); + assertEquals("book2", ((ExtendedNode) children.get(2)).getStringFeature()); + assertEquals("book3", ((ExtendedNode) children.get(3)).getStringFeature()); + } + } + + public void testViaXRefBooksFirst() throws Exception + { + { + TreeNode root = createNode("root"); + TreeNode books = createNode("books", root); + TreeNode genres = createNode("genres", root); + + ExtendedNode book0 = createExtended("book0", books); + ExtendedNode book1 = createExtended("book1", books); + ExtendedNode book2 = createExtended("book2", books); + ExtendedNode book3 = createExtended("book3", books); + + ExtendedNode genre0 = createExtended("genre0", genres); + ExtendedNode genre1 = createExtended("genre1", genres); + ExtendedNode genre2 = createExtended("genre2", genres); + ExtendedNode genre3 = createExtended("genre3", genres); + + book0.getBidiSource().add(genre0); + book0.getBidiSource().add(genre1); + book0.getBidiSource().add(genre2); + book0.getBidiSource().add(genre3); + + book1.getBidiSource().add(genre0); + book1.getBidiSource().add(genre1); + book1.getBidiSource().add(genre2); + + book2.getBidiSource().add(genre0); + book2.getBidiSource().add(genre1); + + book3.getBidiSource().add(genre0); + saveRoot(root, "/test/res"); + } + + { + TreeNode root = (TreeNode) loadRoot("/test/res"); + TreeNode books = findChild("books", root); + TreeNode genres = findChild("genres", root); + + ExtendedNode genre0 = (ExtendedNode) genres.getChildren().get(0); + assertEquals("book0", ((ExtendedNode) genre0.getBidiTarget().get(0)).getStringFeature()); + assertEquals("book1", ((ExtendedNode) genre0.getBidiTarget().get(1)).getStringFeature()); + assertEquals("book2", ((ExtendedNode) genre0.getBidiTarget().get(2)).getStringFeature()); + assertEquals("book3", ((ExtendedNode) genre0.getBidiTarget().get(3)).getStringFeature()); + + EList children = books.getChildren(); + assertEquals("book0", ((ExtendedNode) children.get(0)).getStringFeature()); + assertEquals("book1", ((ExtendedNode) children.get(1)).getStringFeature()); + assertEquals("book2", ((ExtendedNode) children.get(2)).getStringFeature()); + assertEquals("book3", ((ExtendedNode) children.get(3)).getStringFeature()); + } + } + + public void testViaXRefSharedRoot() throws Exception + { + { + TreeNode root = createNode("root"); + + ExtendedNode book0 = createExtended("book0", root); + ExtendedNode book1 = createExtended("book1", root); + ExtendedNode book2 = createExtended("book2", root); + ExtendedNode book3 = createExtended("book3", root); + + ExtendedNode genre0 = createExtended("genre0", root); + ExtendedNode genre1 = createExtended("genre1", root); + ExtendedNode genre2 = createExtended("genre2", root); + ExtendedNode genre3 = createExtended("genre3", root); + + book0.getBidiSource().add(genre0); + book0.getBidiSource().add(genre1); + book0.getBidiSource().add(genre2); + book0.getBidiSource().add(genre3); + + book1.getBidiSource().add(genre0); + book1.getBidiSource().add(genre1); + book1.getBidiSource().add(genre2); + + book2.getBidiSource().add(genre0); + book2.getBidiSource().add(genre1); + + book3.getBidiSource().add(genre0); + saveRoot(root, "/test/res"); + } + + { + TreeNode root = (TreeNode) loadRoot("/test/res"); + + ExtendedNode genre0 = (ExtendedNode) root.getChildren().get(4); + assertEquals("book0", ((ExtendedNode) genre0.getBidiTarget().get(0)).getStringFeature()); + assertEquals("book1", ((ExtendedNode) genre0.getBidiTarget().get(1)).getStringFeature()); + assertEquals("book2", ((ExtendedNode) genre0.getBidiTarget().get(2)).getStringFeature()); + assertEquals("book3", ((ExtendedNode) genre0.getBidiTarget().get(3)).getStringFeature()); + + EList children = root.getChildren(); + assertEquals("book0", ((ExtendedNode) children.get(0)).getStringFeature()); + assertEquals("book1", ((ExtendedNode) children.get(1)).getStringFeature()); + assertEquals("book2", ((ExtendedNode) children.get(2)).getStringFeature()); + assertEquals("book3", ((ExtendedNode) children.get(3)).getStringFeature()); + } + } + + public void testViaXRefChildren2() throws Exception + { + { + TreeNode root = createNode("root"); + + // Insert books into children + ExtendedNode book0 = createExtended("book0", root); + ExtendedNode book1 = createExtended("book1", root); + ExtendedNode book2 = createExtended("book2", root); + ExtendedNode book3 = createExtended("book3", root); + + // Insert genres into children2 + ExtendedNode genre0 = createExtended("genre0"); + genre0.setParent2(root); + ExtendedNode genre1 = createExtended("genre1"); + genre1.setParent2(root); + ExtendedNode genre2 = createExtended("genre2"); + genre2.setParent2(root); + ExtendedNode genre3 = createExtended("genre3"); + genre3.setParent2(root); + + book0.getBidiSource().add(genre0); + book0.getBidiSource().add(genre1); + book0.getBidiSource().add(genre2); + book0.getBidiSource().add(genre3); + + book1.getBidiSource().add(genre0); + book1.getBidiSource().add(genre1); + book1.getBidiSource().add(genre2); + + book2.getBidiSource().add(genre0); + book2.getBidiSource().add(genre1); + + book3.getBidiSource().add(genre0); + saveRoot(root, "/test/res"); + } + + { + TreeNode root = (TreeNode) loadRoot("/test/res"); + + ExtendedNode genre0 = (ExtendedNode) root.getChildren2().get(0); + assertEquals("book0", ((ExtendedNode) genre0.getBidiTarget().get(0)).getStringFeature()); + assertEquals("book1", ((ExtendedNode) genre0.getBidiTarget().get(1)).getStringFeature()); + assertEquals("book2", ((ExtendedNode) genre0.getBidiTarget().get(2)).getStringFeature()); + assertEquals("book3", ((ExtendedNode) genre0.getBidiTarget().get(3)).getStringFeature()); + + EList children = root.getChildren(); + assertEquals("book0", ((ExtendedNode) children.get(0)).getStringFeature()); + assertEquals("book1", ((ExtendedNode) children.get(1)).getStringFeature()); + assertEquals("book2", ((ExtendedNode) children.get(2)).getStringFeature()); + assertEquals("book3", ((ExtendedNode) children.get(3)).getStringFeature()); + } + } +} diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/topology/AbstractTopologyTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/topology/AbstractTopologyTest.java index 10f71ef766..b390ccb00a 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/topology/AbstractTopologyTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/topology/AbstractTopologyTest.java @@ -37,6 +37,10 @@ public abstract class AbstractTopologyTest extends TestCase implements ITopology private long startMemory; + private long startTime; + + private long runTime; + private String label; private static int run; @@ -64,6 +68,8 @@ public abstract class AbstractTopologyTest extends TestCase implements ITopology @Override protected void setUp() throws Exception { + startTime = System.currentTimeMillis(); + System.gc(); startMemory = getUsedMemory(); @@ -75,11 +81,17 @@ public abstract class AbstractTopologyTest extends TestCase implements ITopology super.setUp(); topology.start(); + + startTime = System.currentTimeMillis() - startTime; + runTime = System.currentTimeMillis(); } @Override protected void tearDown() throws Exception { + runTime = System.currentTimeMillis() - runTime; + long stopTime = System.currentTimeMillis(); + Thread.sleep(200); JdbcTemplate jdbc = jdbc(); wipeDatabase(jdbc); @@ -90,8 +102,12 @@ public abstract class AbstractTopologyTest extends TestCase implements ITopology System.gc(); long endMemory = getUsedMemory(); + stopTime = System.currentTimeMillis() - stopTime; - System.out.println("Memory-Delta " + getRun() + "\t " + (endMemory - startMemory)); + String run = getRun(); + System.out.println("Runtime-Stat " + run + "\t " + startTime + "\t " + runTime + "\t " + + stopTime); + System.out.println("Memory-Delta " + run + "\t " + (endMemory - startMemory)); System.out.println("========================================================================="); System.out.println("TC_END " + label); System.out.println("========================================================================="); diff --git a/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/TestModel1Package.java b/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/TestModel1Package.java index aca26add7e..6eb9dbd05a 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/TestModel1Package.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/TestModel1Package.java @@ -93,13 +93,31 @@ public interface TestModel1Package extends EPackage int TREE_NODE__CHILDREN = CDOPackage.CDO_PERSISTENT_FEATURE_COUNT + 1; /** + * The feature id for the '<em><b>Parent2</b></em>' container reference. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + * @ordered + */ + int TREE_NODE__PARENT2 = CDOPackage.CDO_PERSISTENT_FEATURE_COUNT + 2; + + /** + * The feature id for the '<em><b>Children2</b></em>' containment reference list. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + * @ordered + */ + int TREE_NODE__CHILDREN2 = CDOPackage.CDO_PERSISTENT_FEATURE_COUNT + 3; + + /** * The feature id for the '<em><b>References</b></em>' reference list. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated * @ordered */ - int TREE_NODE__REFERENCES = CDOPackage.CDO_PERSISTENT_FEATURE_COUNT + 2; + int TREE_NODE__REFERENCES = CDOPackage.CDO_PERSISTENT_FEATURE_COUNT + 4; /** * The feature id for the '<em><b>Boolean Feature</b></em>' attribute. @@ -108,7 +126,7 @@ public interface TestModel1Package extends EPackage * @generated * @ordered */ - int TREE_NODE__BOOLEAN_FEATURE = CDOPackage.CDO_PERSISTENT_FEATURE_COUNT + 3; + int TREE_NODE__BOOLEAN_FEATURE = CDOPackage.CDO_PERSISTENT_FEATURE_COUNT + 5; /** * The feature id for the '<em><b>Int Feature</b></em>' attribute. @@ -117,7 +135,7 @@ public interface TestModel1Package extends EPackage * @generated * @ordered */ - int TREE_NODE__INT_FEATURE = CDOPackage.CDO_PERSISTENT_FEATURE_COUNT + 4; + int TREE_NODE__INT_FEATURE = CDOPackage.CDO_PERSISTENT_FEATURE_COUNT + 6; /** * The feature id for the '<em><b>String Feature</b></em>' attribute. @@ -126,7 +144,7 @@ public interface TestModel1Package extends EPackage * @generated * @ordered */ - int TREE_NODE__STRING_FEATURE = CDOPackage.CDO_PERSISTENT_FEATURE_COUNT + 5; + int TREE_NODE__STRING_FEATURE = CDOPackage.CDO_PERSISTENT_FEATURE_COUNT + 7; /** * The number of structural features of the '<em>Tree Node</em>' class. @@ -135,7 +153,7 @@ public interface TestModel1Package extends EPackage * @generated * @ordered */ - int TREE_NODE_FEATURE_COUNT = CDOPackage.CDO_PERSISTENT_FEATURE_COUNT + 6; + int TREE_NODE_FEATURE_COUNT = CDOPackage.CDO_PERSISTENT_FEATURE_COUNT + 8; /** * The meta object id for the '{@link testmodel1.impl.ExtendedNodeImpl <em>Extended Node</em>}' class. @@ -166,6 +184,24 @@ public interface TestModel1Package extends EPackage int EXTENDED_NODE__CHILDREN = TREE_NODE__CHILDREN; /** + * The feature id for the '<em><b>Parent2</b></em>' container reference. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + * @ordered + */ + int EXTENDED_NODE__PARENT2 = TREE_NODE__PARENT2; + + /** + * The feature id for the '<em><b>Children2</b></em>' containment reference list. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + * @ordered + */ + int EXTENDED_NODE__CHILDREN2 = TREE_NODE__CHILDREN2; + + /** * The feature id for the '<em><b>References</b></em>' reference list. * <!-- begin-user-doc --> * <!-- end-user-doc --> @@ -266,6 +302,24 @@ public interface TestModel1Package extends EPackage int EMPTY_NODE__CHILDREN = TREE_NODE__CHILDREN; /** + * The feature id for the '<em><b>Parent2</b></em>' container reference. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + * @ordered + */ + int EMPTY_NODE__PARENT2 = TREE_NODE__PARENT2; + + /** + * The feature id for the '<em><b>Children2</b></em>' containment reference list. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + * @ordered + */ + int EMPTY_NODE__CHILDREN2 = TREE_NODE__CHILDREN2; + + /** * The feature id for the '<em><b>References</b></em>' reference list. * <!-- begin-user-doc --> * <!-- end-user-doc --> @@ -339,6 +393,24 @@ public interface TestModel1Package extends EPackage int EMPTY_REF_NODE__CHILDREN = TREE_NODE__CHILDREN; /** + * The feature id for the '<em><b>Parent2</b></em>' container reference. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + * @ordered + */ + int EMPTY_REF_NODE__PARENT2 = TREE_NODE__PARENT2; + + /** + * The feature id for the '<em><b>Children2</b></em>' containment reference list. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + * @ordered + */ + int EMPTY_REF_NODE__CHILDREN2 = TREE_NODE__CHILDREN2; + + /** * The feature id for the '<em><b>References</b></em>' reference list. * <!-- begin-user-doc --> * <!-- end-user-doc --> @@ -425,6 +497,28 @@ public interface TestModel1Package extends EPackage EReference getTreeNode_Children(); /** + * Returns the meta object for the container reference '{@link testmodel1.TreeNode#getParent2 <em>Parent2</em>}'. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @return the meta object for the container reference '<em>Parent2</em>'. + * @see testmodel1.TreeNode#getParent2() + * @see #getTreeNode() + * @generated + */ + EReference getTreeNode_Parent2(); + + /** + * Returns the meta object for the containment reference list '{@link testmodel1.TreeNode#getChildren2 <em>Children2</em>}'. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @return the meta object for the containment reference list '<em>Children2</em>'. + * @see testmodel1.TreeNode#getChildren2() + * @see #getTreeNode() + * @generated + */ + EReference getTreeNode_Children2(); + + /** * Returns the meta object for the reference list '{@link testmodel1.TreeNode#getReferences <em>References</em>}'. * <!-- begin-user-doc --> * <!-- end-user-doc --> @@ -593,6 +687,22 @@ public interface TestModel1Package extends EPackage EReference TREE_NODE__CHILDREN = eINSTANCE.getTreeNode_Children(); /** + * The meta object literal for the '<em><b>Parent2</b></em>' container reference feature. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + */ + EReference TREE_NODE__PARENT2 = eINSTANCE.getTreeNode_Parent2(); + + /** + * The meta object literal for the '<em><b>Children2</b></em>' containment reference list feature. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + */ + EReference TREE_NODE__CHILDREN2 = eINSTANCE.getTreeNode_Children2(); + + /** * The meta object literal for the '<em><b>References</b></em>' reference list feature. * <!-- begin-user-doc --> * <!-- end-user-doc --> diff --git a/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/TreeNode.java b/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/TreeNode.java index ca1f0e173f..b25ae55610 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/TreeNode.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/TreeNode.java @@ -22,6 +22,8 @@ import org.eclipse.emf.common.util.EList; * <ul> * <li>{@link testmodel1.TreeNode#getParent <em>Parent</em>}</li> * <li>{@link testmodel1.TreeNode#getChildren <em>Children</em>}</li> + * <li>{@link testmodel1.TreeNode#getParent2 <em>Parent2</em>}</li> + * <li>{@link testmodel1.TreeNode#getChildren2 <em>Children2</em>}</li> * <li>{@link testmodel1.TreeNode#getReferences <em>References</em>}</li> * <li>{@link testmodel1.TreeNode#isBooleanFeature <em>Boolean Feature</em>}</li> * <li>{@link testmodel1.TreeNode#getIntFeature <em>Int Feature</em>}</li> @@ -82,6 +84,52 @@ public interface TreeNode extends CDOPersistent EList getChildren(); /** + * Returns the value of the '<em><b>Parent2</b></em>' container reference. + * It is bidirectional and its opposite is '{@link testmodel1.TreeNode#getChildren2 <em>Children2</em>}'. + * <!-- begin-user-doc --> + * <p> + * If the meaning of the '<em>Parent2</em>' container reference isn't clear, + * there really should be more of a description here... + * </p> + * <!-- end-user-doc --> + * @return the value of the '<em>Parent2</em>' container reference. + * @see #setParent2(TreeNode) + * @see testmodel1.TestModel1Package#getTreeNode_Parent2() + * @see testmodel1.TreeNode#getChildren2 + * @model opposite="children2" + * @generated + */ + TreeNode getParent2(); + + /** + * Sets the value of the '{@link testmodel1.TreeNode#getParent2 <em>Parent2</em>}' container reference. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @param value the new value of the '<em>Parent2</em>' container reference. + * @see #getParent2() + * @generated + */ + void setParent2(TreeNode value); + + /** + * Returns the value of the '<em><b>Children2</b></em>' containment reference list. + * The list contents are of type {@link testmodel1.TreeNode}. + * It is bidirectional and its opposite is '{@link testmodel1.TreeNode#getParent2 <em>Parent2</em>}'. + * <!-- begin-user-doc --> + * <p> + * If the meaning of the '<em>Children2</em>' containment reference list isn't clear, + * there really should be more of a description here... + * </p> + * <!-- end-user-doc --> + * @return the value of the '<em>Children2</em>' containment reference list. + * @see testmodel1.TestModel1Package#getTreeNode_Children2() + * @see testmodel1.TreeNode#getParent2 + * @model type="testmodel1.TreeNode" opposite="parent2" containment="true" + * @generated + */ + EList getChildren2(); + + /** * Returns the value of the '<em><b>References</b></em>' reference list. * The list contents are of type {@link testmodel1.TreeNode}. * <!-- begin-user-doc --> diff --git a/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/impl/TestModel1FactoryImpl.java b/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/impl/TestModel1FactoryImpl.java index 3751ffa5c3..2441616253 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/impl/TestModel1FactoryImpl.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/impl/TestModel1FactoryImpl.java @@ -13,6 +13,8 @@ import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.impl.EFactoryImpl; import org.eclipse.emf.ecore.plugin.EcorePlugin; +import testmodel1.*; + import testmodel1.EmptyNode; import testmodel1.EmptyRefNode; import testmodel1.ExtendedNode; diff --git a/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/impl/TestModel1PackageImpl.java b/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/impl/TestModel1PackageImpl.java index 78af6e07e3..28bc58c2a2 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/impl/TestModel1PackageImpl.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/impl/TestModel1PackageImpl.java @@ -170,7 +170,7 @@ public class TestModel1PackageImpl extends EPackageImpl implements TestModel1Pac * <!-- end-user-doc --> * @generated */ - public EReference getTreeNode_References() + public EReference getTreeNode_Parent2() { return (EReference) treeNodeEClass.getEStructuralFeatures().get(2); } @@ -180,9 +180,29 @@ public class TestModel1PackageImpl extends EPackageImpl implements TestModel1Pac * <!-- end-user-doc --> * @generated */ + public EReference getTreeNode_Children2() + { + return (EReference) treeNodeEClass.getEStructuralFeatures().get(3); + } + + /** + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + */ + public EReference getTreeNode_References() + { + return (EReference) treeNodeEClass.getEStructuralFeatures().get(4); + } + + /** + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + */ public EAttribute getTreeNode_BooleanFeature() { - return (EAttribute) treeNodeEClass.getEStructuralFeatures().get(3); + return (EAttribute) treeNodeEClass.getEStructuralFeatures().get(5); } /** @@ -192,7 +212,7 @@ public class TestModel1PackageImpl extends EPackageImpl implements TestModel1Pac */ public EAttribute getTreeNode_IntFeature() { - return (EAttribute) treeNodeEClass.getEStructuralFeatures().get(4); + return (EAttribute) treeNodeEClass.getEStructuralFeatures().get(6); } /** @@ -202,7 +222,7 @@ public class TestModel1PackageImpl extends EPackageImpl implements TestModel1Pac */ public EAttribute getTreeNode_StringFeature() { - return (EAttribute) treeNodeEClass.getEStructuralFeatures().get(5); + return (EAttribute) treeNodeEClass.getEStructuralFeatures().get(7); } /** @@ -308,6 +328,8 @@ public class TestModel1PackageImpl extends EPackageImpl implements TestModel1Pac treeNodeEClass = createEClass(TREE_NODE); createEReference(treeNodeEClass, TREE_NODE__PARENT); createEReference(treeNodeEClass, TREE_NODE__CHILDREN); + createEReference(treeNodeEClass, TREE_NODE__PARENT2); + createEReference(treeNodeEClass, TREE_NODE__CHILDREN2); createEReference(treeNodeEClass, TREE_NODE__REFERENCES); createEAttribute(treeNodeEClass, TREE_NODE__BOOLEAN_FEATURE); createEAttribute(treeNodeEClass, TREE_NODE__INT_FEATURE); @@ -367,6 +389,12 @@ public class TestModel1PackageImpl extends EPackageImpl implements TestModel1Pac initEReference(getTreeNode_Children(), this.getTreeNode(), this.getTreeNode_Parent(), "children", null, 0, -1, TreeNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); + initEReference(getTreeNode_Parent2(), this.getTreeNode(), this.getTreeNode_Children2(), + "parent2", null, 0, 1, TreeNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, + !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); + initEReference(getTreeNode_Children2(), this.getTreeNode(), this.getTreeNode_Parent2(), + "children2", null, 0, -1, TreeNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, + IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEReference(getTreeNode_References(), this.getTreeNode(), null, "references", null, 0, -1, TreeNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); diff --git a/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/impl/TreeNodeImpl.java b/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/impl/TreeNodeImpl.java index b5f4a20400..8cef87e439 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/impl/TreeNodeImpl.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/impl/TreeNodeImpl.java @@ -35,6 +35,8 @@ import java.util.Collection; * <ul> * <li>{@link testmodel1.impl.TreeNodeImpl#getParent <em>Parent</em>}</li> * <li>{@link testmodel1.impl.TreeNodeImpl#getChildren <em>Children</em>}</li> + * <li>{@link testmodel1.impl.TreeNodeImpl#getParent2 <em>Parent2</em>}</li> + * <li>{@link testmodel1.impl.TreeNodeImpl#getChildren2 <em>Children2</em>}</li> * <li>{@link testmodel1.impl.TreeNodeImpl#getReferences <em>References</em>}</li> * <li>{@link testmodel1.impl.TreeNodeImpl#isBooleanFeature <em>Boolean Feature</em>}</li> * <li>{@link testmodel1.impl.TreeNodeImpl#getIntFeature <em>Int Feature</em>}</li> @@ -57,6 +59,16 @@ public class TreeNodeImpl extends CDOPersistentImpl implements TreeNode protected EList children = null; /** + * The cached value of the '{@link #getChildren2() <em>Children2</em>}' containment reference list. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @see #getChildren2() + * @generated + * @ordered + */ + protected EList children2 = null; + + /** * The cached value of the '{@link #getReferences() <em>References</em>}' reference list. * <!-- begin-user-doc --> * <!-- end-user-doc --> @@ -218,6 +230,73 @@ public class TreeNodeImpl extends CDOPersistentImpl implements TreeNode * <!-- end-user-doc --> * @generated */ + public TreeNode getParent2() + { + cdoLoad(); + if (eContainerFeatureID != TestModel1Package.TREE_NODE__PARENT2) return null; + return (TreeNode) eContainer(); + } + + /** + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + */ + public NotificationChain basicSetParent2(TreeNode newParent2, NotificationChain msgs) + { + cdoLoad(); + msgs = eBasicSetContainer((InternalEObject) newParent2, TestModel1Package.TREE_NODE__PARENT2, + msgs); + return msgs; + } + + /** + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + */ + public void setParent2(TreeNode newParent2) + { + + if (newParent2 != eInternalContainer() + || (eContainerFeatureID != TestModel1Package.TREE_NODE__PARENT2 && newParent2 != null)) + { + if (EcoreUtil.isAncestor(this, newParent2)) + throw new IllegalArgumentException("Recursive containment not allowed for " + toString()); + NotificationChain msgs = null; + if (eInternalContainer() != null) msgs = eBasicRemoveFromContainer(msgs); + if (newParent2 != null) + msgs = ((InternalEObject) newParent2).eInverseAdd(this, + TestModel1Package.TREE_NODE__CHILDREN2, TreeNode.class, msgs); + msgs = basicSetParent2(newParent2, msgs); + if (msgs != null) msgs.dispatch(); + } + else if (eNotificationRequired()) + eNotify(new ENotificationImpl(this, Notification.SET, TestModel1Package.TREE_NODE__PARENT2, + newParent2, newParent2)); + } + + /** + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + */ + public EList getChildren2() + { + cdoLoad(); + if (children2 == null) + { + children2 = new EObjectContainmentWithInverseEList(TreeNode.class, this, + TestModel1Package.TREE_NODE__CHILDREN2, TestModel1Package.TREE_NODE__PARENT2); + } + return children2; + } + + /** + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + */ public EList getReferences() { cdoLoad(); @@ -322,6 +401,11 @@ public class TreeNodeImpl extends CDOPersistentImpl implements TreeNode return basicSetParent((TreeNode) otherEnd, msgs); case TestModel1Package.TREE_NODE__CHILDREN: return ((InternalEList) getChildren()).basicAdd(otherEnd, msgs); + case TestModel1Package.TREE_NODE__PARENT2: + if (eInternalContainer() != null) msgs = eBasicRemoveFromContainer(msgs); + return basicSetParent2((TreeNode) otherEnd, msgs); + case TestModel1Package.TREE_NODE__CHILDREN2: + return ((InternalEList) getChildren2()).basicAdd(otherEnd, msgs); } return super.eInverseAdd(otherEnd, featureID, msgs); } @@ -340,6 +424,10 @@ public class TreeNodeImpl extends CDOPersistentImpl implements TreeNode return basicSetParent(null, msgs); case TestModel1Package.TREE_NODE__CHILDREN: return ((InternalEList) getChildren()).basicRemove(otherEnd, msgs); + case TestModel1Package.TREE_NODE__PARENT2: + return basicSetParent2(null, msgs); + case TestModel1Package.TREE_NODE__CHILDREN2: + return ((InternalEList) getChildren2()).basicRemove(otherEnd, msgs); } return super.eInverseRemove(otherEnd, featureID, msgs); } @@ -356,6 +444,9 @@ public class TreeNodeImpl extends CDOPersistentImpl implements TreeNode case TestModel1Package.TREE_NODE__PARENT: return eInternalContainer().eInverseRemove(this, TestModel1Package.TREE_NODE__CHILDREN, TreeNode.class, msgs); + case TestModel1Package.TREE_NODE__PARENT2: + return eInternalContainer().eInverseRemove(this, TestModel1Package.TREE_NODE__CHILDREN2, + TreeNode.class, msgs); } return super.eBasicRemoveFromContainerFeature(msgs); } @@ -373,6 +464,10 @@ public class TreeNodeImpl extends CDOPersistentImpl implements TreeNode return getParent(); case TestModel1Package.TREE_NODE__CHILDREN: return getChildren(); + case TestModel1Package.TREE_NODE__PARENT2: + return getParent2(); + case TestModel1Package.TREE_NODE__CHILDREN2: + return getChildren2(); case TestModel1Package.TREE_NODE__REFERENCES: return getReferences(); case TestModel1Package.TREE_NODE__BOOLEAN_FEATURE: @@ -401,6 +496,13 @@ public class TreeNodeImpl extends CDOPersistentImpl implements TreeNode getChildren().clear(); getChildren().addAll((Collection) newValue); return; + case TestModel1Package.TREE_NODE__PARENT2: + setParent2((TreeNode) newValue); + return; + case TestModel1Package.TREE_NODE__CHILDREN2: + getChildren2().clear(); + getChildren2().addAll((Collection) newValue); + return; case TestModel1Package.TREE_NODE__REFERENCES: getReferences().clear(); getReferences().addAll((Collection) newValue); @@ -433,6 +535,12 @@ public class TreeNodeImpl extends CDOPersistentImpl implements TreeNode case TestModel1Package.TREE_NODE__CHILDREN: getChildren().clear(); return; + case TestModel1Package.TREE_NODE__PARENT2: + setParent2((TreeNode) null); + return; + case TestModel1Package.TREE_NODE__CHILDREN2: + getChildren2().clear(); + return; case TestModel1Package.TREE_NODE__REFERENCES: getReferences().clear(); return; @@ -462,6 +570,10 @@ public class TreeNodeImpl extends CDOPersistentImpl implements TreeNode return getParent() != null; case TestModel1Package.TREE_NODE__CHILDREN: return children != null && !children.isEmpty(); + case TestModel1Package.TREE_NODE__PARENT2: + return getParent2() != null; + case TestModel1Package.TREE_NODE__CHILDREN2: + return children2 != null && !children2.isEmpty(); case TestModel1Package.TREE_NODE__REFERENCES: return references != null && !references.isEmpty(); case TestModel1Package.TREE_NODE__BOOLEAN_FEATURE: diff --git a/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/util/TestModel1AdapterFactory.java b/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/util/TestModel1AdapterFactory.java index 8d813a4273..6531ff573c 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/util/TestModel1AdapterFactory.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/util/TestModel1AdapterFactory.java @@ -15,6 +15,8 @@ import org.eclipse.emf.common.notify.Notifier; import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl; import org.eclipse.emf.ecore.EObject; +import testmodel1.*; + import testmodel1.EmptyNode; import testmodel1.EmptyRefNode; import testmodel1.ExtendedNode; diff --git a/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/util/TestModel1Switch.java b/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/util/TestModel1Switch.java index b48228af88..546df8817d 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/util/TestModel1Switch.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/testmodel1/util/TestModel1Switch.java @@ -13,6 +13,8 @@ import org.eclipse.emf.cdo.client.CDOPersistent; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; +import testmodel1.*; + import testmodel1.EmptyNode; import testmodel1.EmptyRefNode; import testmodel1.ExtendedNode; |