Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon McDuff2008-09-11 06:38:38 +0000
committerSimon McDuff2008-09-11 06:38:38 +0000
commit65087f87d7d13b3d1b79f5aa3a0086e23a137d0b (patch)
tree6cbd5ba0450b6ed791c407207033ed8fe0e18afd /plugins/org.eclipse.emf.cdo.tests/src
parent128d02f77c213ee2aca3ecd23ef6bba7a16dfa09 (diff)
downloadcdo-65087f87d7d13b3d1b79f5aa3a0086e23a137d0b.tar.gz
cdo-65087f87d7d13b3d1b79f5aa3a0086e23a137d0b.tar.xz
cdo-65087f87d7d13b3d1b79f5aa3a0086e23a137d0b.zip
[213402] Support external references
https://bugs.eclipse.org/bugs/show_bug.cgi?id=213402
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.tests/src')
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractCDOTest.java9
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTests.java6
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AutoAttacherTest.java1
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ComplexTest.java36
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ContainmentTest.java152
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/DetachTest.java274
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ExternalReferenceTest.java334
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/InitialTest.java53
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/InvalidationTest.java60
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ResourceTest.java156
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionHolderTest.java4
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/StateMachineTest.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ViewTest.java5
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/XATransactionTest.java222
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_246622_Test.java135
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/store/logic/TestLogic.java36
16 files changed, 1441 insertions, 44 deletions
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractCDOTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractCDOTest.java
index 0398f97304..b5160b138a 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractCDOTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractCDOTest.java
@@ -142,7 +142,8 @@ public abstract class AbstractCDOTest extends AbstractTransportTest
// assertEquals(null, object.cdoID());
// assertEquals(null, object.cdoRevision());
// assertEquals(null, object.cdoView());
- assertEquals(object.eResource(), object.cdoResource());
+ //assertEquals(bject.eResource(), object.cdoResource());
+ //assertEquals(null, object.cdoResource());
}
protected static void assertNotTransient(CDOObject object, CDOView view)
@@ -151,9 +152,9 @@ public abstract class AbstractCDOTest extends AbstractTransportTest
assertNotNull(object.cdoID());
assertNotNull(object.cdoRevision());
assertNotNull(object.cdoView());
- assertNotNull(object.cdoResource());
+ //assertNotNull(object.cdoResource());
assertNotNull(object.eResource());
- assertEquals(object.eResource(), object.cdoResource());
+ //assertEquals(object.eResource(), object.cdoResource());
assertEquals(view, object.cdoView());
assertEquals(object, view.getObject(object.cdoID(), false));
}
@@ -190,10 +191,10 @@ public abstract class AbstractCDOTest extends AbstractTransportTest
protected static void assertContent(CDOObject container, CDOObject contained)
{
assertEquals(container.eResource(), contained.eResource());
- assertEquals(container.cdoResource(), contained.cdoResource());
assertTrue(container.eContents().contains(contained));
if (container instanceof CDOResource)
{
+ assertEquals(container.eResource(), container.cdoResource());
assertEquals(null, contained.eContainer());
assertTrue(((CDOResource)container).getContents().contains(contained));
}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTests.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTests.java
index c6631ef5ce..738628412b 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTests.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTests.java
@@ -12,6 +12,7 @@ package org.eclipse.emf.cdo.tests;
import org.eclipse.emf.cdo.tests.bugzilla.Bugzilla_241464_Test;
import org.eclipse.emf.cdo.tests.bugzilla.Bugzilla_243310_Test;
+import org.eclipse.emf.cdo.tests.bugzilla.Bugzilla_246622_Test;
import junit.framework.Test;
import junit.framework.TestSuite;
@@ -27,6 +28,7 @@ public class AllTests
// $JUnit-BEGIN$
suite.addTestSuite(InitialTest.class);
+
suite.addTestSuite(ComplexTest.class);
suite.addTestSuite(AttributeTest.class);
suite.addTestSuite(EnumTest.class);
@@ -49,9 +51,13 @@ public class AllTests
suite.addTestSuite(NoLegacyTest.class);
suite.addTestSuite(Bugzilla_241464_Test.class);
suite.addTestSuite(Bugzilla_243310_Test.class);
+ suite.addTestSuite(Bugzilla_246622_Test.class);
suite.addTestSuite(AutoAttacherTest.class);
suite.addTestSuite(SavepointTest.class);
suite.addTestSuite(ChangeSubscriptionTest.class);
+ suite.addTestSuite(DetachTest.class);
+ suite.addTestSuite(ExternalReferenceTest.class);
+ suite.addTestSuite(XATransactionTest.class);
// Specific for MEMStore
suite.addTestSuite(QueryTest.class);
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AutoAttacherTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AutoAttacherTest.java
index c7ec73619e..b869e12b9f 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AutoAttacherTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AutoAttacherTest.java
@@ -7,6 +7,7 @@
*
* Contributors:
* Simon McDuff - initial API and implementation
+ * Eike Stepper - maintenance
**************************************************************************/
package org.eclipse.emf.cdo.tests;
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ComplexTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ComplexTest.java
index 7c04ca19d6..39f49bb0c8 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ComplexTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ComplexTest.java
@@ -50,6 +50,9 @@ import org.eclipse.emf.cdo.tests.model4interfaces.model4interfacesPackage;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* @author Eike Stepper
*/
@@ -509,10 +512,14 @@ public class ComplexTest extends AbstractCDOTest
CDOTransaction transaction3 = session.openTransaction();
EList<EObject> elements = transaction3.getResource(resource1path).getContents();
EList<EObject> containers = transaction3.getResource(resource2path).getContents();
-
- RefMultiContained container_work = (RefMultiContained)containers.get(0);
+ List<EObject> elementToRemove = new ArrayList<EObject>();
for (EObject o : elements)
{
+ elementToRemove.add(o);
+ }
+ RefMultiContained container_work = (RefMultiContained)containers.get(0);
+ for (EObject o : elementToRemove)
+ {
MultiContainedElement element_work = (MultiContainedElement)o;
container_work.getElements().add(element_work);
transaction3.commit();
@@ -553,13 +560,24 @@ public class ComplexTest extends AbstractCDOTest
resource2.getContents().add(container);
transaction2.commit();
-
- EList<EObject> elements = transaction2.getResource(resource1path).getContents();
-
+ CDOResource resource1FromTx2 = transaction2.getResource(resource1path);
+ EList<EObject> elements = resource1FromTx2.getContents();
+ List<EObject> elementToRemove = new ArrayList<EObject>();
for (EObject o : elements)
{
+ elementToRemove.add(o);
+ }
+
+ for (EObject o : elementToRemove)
+ {
MultiContainedElement element_work = (MultiContainedElement)o;
+ assertEquals(resource1FromTx2, element_work.cdoResource());
+ assertEquals(resource1FromTx2, element_work.eResource());
+
container.getElements().add(element_work);
+
+ assertEquals(null, element_work.cdoResource());
+ assertEquals(resource2, element_work.eResource());
transaction2.commit();
}
}
@@ -582,7 +600,7 @@ public class ComplexTest extends AbstractCDOTest
assertTrue(element.getParent() == container2);
assertTrue(element.eContainer() == container2);
- assertTrue(element.cdoResource() == resource2);
+ assertTrue(element.cdoResource() == null);
assertTrue(container1.getElement() == null);
assertTrue(container1.cdoResource() == resource1);
@@ -614,11 +632,13 @@ public class ComplexTest extends AbstractCDOTest
assertTrue(elementA.getParent() == container2);
assertTrue(elementA.eContainer() == container2);
- assertTrue(elementA.cdoResource() == resource2);
+ assertTrue(elementA.cdoResource() == null);
+ assertTrue(elementA.eResource() == resource2);
assertTrue(elementB.getParent() == container1);
assertTrue(elementB.eContainer() == container1);
- assertTrue(elementB.cdoResource() == resource1);
+ assertTrue(elementB.cdoResource() == null);
+ assertTrue(elementB.eResource() == resource1);
assertTrue(container1.cdoResource() == resource1);
assertEquals(1, container1.getElements().size());
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ContainmentTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ContainmentTest.java
index be37769fa6..eb5203a9d2 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ContainmentTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ContainmentTest.java
@@ -17,12 +17,26 @@ import org.eclipse.emf.cdo.tests.model1.Address;
import org.eclipse.emf.cdo.tests.model1.Category;
import org.eclipse.emf.cdo.tests.model1.Company;
import org.eclipse.emf.cdo.tests.model1.Model1Factory;
+import org.eclipse.emf.cdo.tests.model1.Model1Package;
+import org.eclipse.emf.cdo.tests.model1.Order;
import org.eclipse.emf.cdo.tests.model1.Supplier;
import org.eclipse.emf.cdo.tests.model2.Model2Factory;
import org.eclipse.emf.cdo.tests.model2.SpecialPurchaseOrder;
import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EcoreFactory;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
/**
* @author Eike Stepper
@@ -325,4 +339,142 @@ public class ContainmentTest extends AbstractCDOTest
assertContent(resource, order);
assertNull(order.getShippingAddress());
}
+
+ public void testObjectNotSameResourceThanItsContainer() throws Exception
+ {
+ {
+ ResourceSet resourceSet = new ResourceSetImpl();
+
+ CDOSession session = openSession();
+
+ CDOTransaction transaction = session.openTransaction(resourceSet);
+
+ resourceSet.getResourceFactoryRegistry().getProtocolToFactoryMap().put("file", new XMIResourceFactoryImpl());
+
+ session.getPackageRegistry().putEPackage(Model1Package.eINSTANCE);
+ Resource resource1 = resourceSet.createResource(URI.createFileURI("c:\\1.xml"));
+ Resource resource2 = transaction.createResource("test");
+
+ EPackage packageObject = createDynamicEPackage();
+ EClass eClass = (EClass)packageObject.getEClassifier("SchoolBook");
+
+ EObject container = packageObject.getEFactoryInstance().create(eClass);
+ Order contained = Model1Factory.eINSTANCE.createOrder();
+
+ resource1.getContents().add(container);
+ resource2.getContents().add(contained);
+
+ container.eSet(container.eClass().getEStructuralFeature("proxyElement"), contained);
+
+ assertEquals(resource1, container.eResource());
+ assertEquals(resource2, contained.eResource());
+
+ // If the relationship is define has resolveProxy this is true if not.. this is false.
+ assertEquals(container, contained.eContainer());
+
+ resource1.save(null);
+ transaction.commit();
+ }
+ {
+ EPackage packageObject = createDynamicEPackage();
+ ResourceSet resourceSet = new ResourceSetImpl();
+ resourceSet.getPackageRegistry().put(packageObject.getNsURI(), packageObject);
+ CDOSession session = openSession();
+
+ CDOTransaction transaction = session.openTransaction(resourceSet);
+
+ resourceSet.getResourceFactoryRegistry().getProtocolToFactoryMap().put("file", new XMIResourceFactoryImpl());
+
+ Resource resource = transaction.getResource("test");
+
+ Order order = (Order)resource.getContents().get(0);
+
+ Resource resourceXMI = resourceSet.getResource(URI.createFileURI("c:\\1.xml"), true);
+
+ assertEquals(resourceXMI.getContents().get(0), order.eContainer());
+ }
+
+ }
+
+ public void testObjectNotSameResourceThanItsContainer_WithoutCDO() throws Exception
+ {
+ ResourceSet resourceSet = new ResourceSetImpl();
+
+ resourceSet.getResourceFactoryRegistry().getProtocolToFactoryMap().put("file", new XMIResourceFactoryImpl());
+
+ Resource resource1 = resourceSet.createResource(URI.createFileURI("c:\\1.xml"));
+ Resource resource2 = resourceSet.createResource(URI.createFileURI("c:\\2.xml"));
+ EPackage packageObject = createDynamicEPackage();
+ EClass eClass = (EClass)packageObject.getEClassifier("SchoolBook");
+
+ EObject container = packageObject.getEFactoryInstance().create(eClass);
+ EObject contained = packageObject.getEFactoryInstance().create(eClass);
+
+ resource1.getContents().add(container);
+ resource2.getContents().add(contained);
+
+ container.eSet(container.eClass().getEStructuralFeature("proxyElement"), contained);
+ // resource1.getContents().add(container);
+
+ assertEquals(resource1, container.eResource());
+ assertEquals(resource2, contained.eResource());
+
+ // If the relationship is define has resolveProxy this is true if not.. this is false.
+ assertEquals(container, contained.eContainer());
+ }
+
+ // Do not support legacy system
+ public void _testBug246540() throws Exception
+ {
+ CDOSession session = openModel1Session();
+ CDOTransaction transaction = session.openTransaction();
+
+ CDOResource resource = transaction.createResource("/my/resource1");
+
+ for (EClassifier eClassifier : EcorePackage.eINSTANCE.getEClassifiers())
+ {
+ resource.getContents().add(eClassifier);
+ }
+
+ transaction.commit();
+ session.close();
+ }
+
+ private EPackage createDynamicEPackage()
+ {
+ final EcoreFactory efactory = EcoreFactory.eINSTANCE;
+ final EcorePackage epackage = EcorePackage.eINSTANCE;
+
+ EClass schoolBookEClass = efactory.createEClass();
+ schoolBookEClass.setName("SchoolBook");
+
+ // create a new attribute for this EClass
+ EAttribute level = efactory.createEAttribute();
+ level.setName("level");
+ level.setEType(epackage.getEInt());
+ schoolBookEClass.getEStructuralFeatures().add(level);
+
+ EReference proxyElement = efactory.createEReference();
+ proxyElement.setName("proxyElement");
+ proxyElement.setEType(epackage.getEObject());
+ proxyElement.setResolveProxies(true);
+ proxyElement.setContainment(true);
+ schoolBookEClass.getEStructuralFeatures().add(proxyElement);
+
+ EReference element = efactory.createEReference();
+ element.setName("element");
+ element.setEType(epackage.getEObject());
+ element.setContainment(true);
+ element.setResolveProxies(false);
+ schoolBookEClass.getEStructuralFeatures().add(element);
+
+ // Create a new EPackage and add the new EClasses
+ EPackage schoolPackage = efactory.createEPackage();
+ schoolPackage.setName("elv");
+ schoolPackage.setNsPrefix("elv");
+ schoolPackage.setNsURI("http:///www.elver.org/School");
+ schoolPackage.getEClassifiers().add(schoolBookEClass);
+ return schoolPackage;
+
+ }
}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/DetachTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/DetachTest.java
new file mode 100644
index 0000000000..c3e9c21399
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/DetachTest.java
@@ -0,0 +1,274 @@
+/***************************************************************************
+ * Copyright (c) 2004 - 2008 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:
+ * Simon McDuff - initial API and implementation
+ **************************************************************************/
+package org.eclipse.emf.cdo.tests;
+
+import org.eclipse.emf.cdo.CDOSavepoint;
+import org.eclipse.emf.cdo.CDOSession;
+import org.eclipse.emf.cdo.CDOTransaction;
+import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.eresource.CDOResource;
+import org.eclipse.emf.cdo.tests.model1.Company;
+import org.eclipse.emf.cdo.tests.model1.Model1Factory;
+import org.eclipse.emf.cdo.tests.model1.Order;
+import org.eclipse.emf.cdo.tests.model1.OrderDetail;
+import org.eclipse.emf.cdo.util.CDOUtil;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+
+import junit.framework.Assert;
+
+/**
+ * @author Simon McDuff
+ */
+public class DetachTest extends AbstractCDOTest
+{
+ public void testNewObjectDeletion() throws Exception
+ {
+ CDOSession session = openModel1Session();
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource("/my/resource");
+
+ Company c1 = Model1Factory.eINSTANCE.createCompany();
+ c1.setName("Test");
+ resource.getContents().add(c1);
+
+ final URI uriC1 = EcoreUtil.getURI(c1);
+
+ assertEquals(c1, transaction.getResourceSet().getEObject(uriC1, false));
+
+ resource.getContents().remove(0); // remove object by index
+
+ try
+ {
+ transaction.getResourceSet().getEObject(uriC1, false);
+ fail("Object shouldn't be available anymore");
+ }
+ catch (Exception ex)
+ {
+
+ }
+
+ transaction.commit();
+ }
+
+ public void testCleanObjectDeletion() throws Exception
+ {
+ CDOSession session = openModel1Session();
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource("/my/resource");
+
+ Company c1 = Model1Factory.eINSTANCE.createCompany();
+ c1.setName("Test");
+ resource.getContents().add(c1);
+ transaction.commit(); // (1)
+
+ final URI uriC1 = EcoreUtil.getURI(c1);
+
+ assertEquals(c1, transaction.getResourceSet().getEObject(uriC1, false));
+
+ resource.getContents().remove(c1);
+
+ assertTransient(c1);
+
+ // We should not be able to access that objects
+ try
+ {
+ transaction.getResourceSet().getEObject(uriC1, false);
+ fail("Cannot access objects detach");
+ }
+ catch (Exception excp)
+ {
+
+ }
+
+ transaction.commit();
+
+ assertTransient(c1);
+
+ try
+ {
+ transaction.getResourceSet().getEObject(uriC1, false);
+ fail("Cannot access objects detach");
+ }
+ catch (Exception excp)
+ {
+
+ }
+
+
+ }
+
+ public void testSavePointNewObjectDeletion() throws Exception
+ {
+ CDOSession session = openModel1Session();
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource("/my/resource");
+
+ Company c1 = Model1Factory.eINSTANCE.createCompany();
+ c1.setName("Test");
+ resource.getContents().add(c1);
+
+ testSavePointObjectDeletion(transaction, resource);
+ }
+
+ public void testSavePointCleanObjectDeletion() throws Exception
+ {
+ CDOSession session = openModel1Session();
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource("/my/resource");
+
+ Company c1 = Model1Factory.eINSTANCE.createCompany();
+ c1.setName("Test");
+ resource.getContents().add(c1);
+
+ URI uriC1 = EcoreUtil.getURI(c1);
+
+ assertEquals(c1, transaction.getResourceSet().getEObject(uriC1, false));
+
+ transaction.commit();
+
+ testSavePointObjectDeletion(transaction, resource);
+
+ }
+
+ private void testSavePointObjectDeletion(CDOTransaction transaction, CDOResource resource)
+ {
+ Company c1 = (Company)resource.getContents().get(0);
+
+ URI uriC1 = EcoreUtil.getURI(c1);
+
+ c1.setName("SIMON");
+
+ CDOSavepoint savepoint = transaction.setSavepoint();
+
+ resource.getContents().remove(0); // remove object by index
+
+ CDOSavepoint savepoint2 = transaction.setSavepoint();
+ try
+ {
+ transaction.getResourceSet().getEObject(uriC1, false);
+ fail("Object shouldn't be available anymore");
+ }
+ catch (Exception ex)
+ {
+
+ }
+ savepoint2.rollback();
+
+ assertEquals("SIMON", c1.getName());
+
+ try
+ {
+ transaction.getResourceSet().getEObject(uriC1, false);
+ fail("Object shouldn't be available anymore");
+ }
+ catch (Exception ex)
+ {
+
+ }
+
+ savepoint.rollback();
+
+ assertEquals("SIMON", c1.getName());
+ assertEquals(c1, transaction.getResourceSet().getEObject(uriC1, false));
+
+ transaction.commit();
+ }
+
+ public void testKeepValue() throws Exception
+ {
+ {
+ CDOSession session = openModel1Session();
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource("/my/resource");
+
+ Company c1 = Model1Factory.eINSTANCE.createCompany();
+ c1.setName("Test");
+ resource.getContents().add(c1);
+
+ transaction.commit();
+ }
+
+ CDOSession session = openModel1Session();
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.getOrCreateResource("/my/resource");
+
+ Company c1 = (Company)resource.getContents().get(0); // remove object by index
+
+ assertEquals("Test", c1.getName());
+
+ resource.getContents().remove(0);
+
+ assertEquals("Test", c1.getName());
+
+ transaction.commit();
+
+ assertEquals("Test", c1.getName());
+ }
+
+ private void detachResource(ResourceSet rset, CDOResource resource) throws Exception
+ {
+ Order order = Model1Factory.eINSTANCE.createOrder();
+ OrderDetail orderDetail = Model1Factory.eINSTANCE.createOrderDetail();
+ resource.getContents().add(order);
+ order.getOrderDetails().add(orderDetail);
+
+ assertActive(resource);
+ Assert.assertEquals(1, CDOUtil.getViewSet(rset).getViews().length);
+ Assert.assertEquals(1, rset.getResources().size());
+
+ resource.delete(null);
+
+ assertTransient(resource);
+
+ Assert.assertEquals(1, CDOUtil.getViewSet(rset).getViews().length);
+ Assert.assertEquals(0, rset.getResources().size());
+ }
+
+ public void testDetachNewResource() throws Exception
+ {
+ msg("Opening session");
+ CDOSession session = openModel1Session();
+
+ msg("Opening transaction");
+ CDOTransaction transaction = session.openTransaction();
+
+ ResourceSet rset = transaction.getResourceSet();
+
+ msg("Creating resource");
+ CDOResource resource = transaction.createResource("/test1");
+ detachResource(rset, resource);
+
+ }
+
+ public void testDetachPersistedResource() throws Exception
+ {
+ msg("Opening session");
+ CDOSession session = openModel1Session();
+
+ msg("Opening transaction");
+ CDOTransaction transaction = session.openTransaction();
+
+ ResourceSet rset = transaction.getResourceSet();
+
+ msg("Creating resource");
+ CDOResource resource = transaction.createResource("/test1");
+
+ transaction.commit();
+ CDOID resourceID = resource.cdoID();
+ detachResource(rset, resource);
+
+ assertEquals(true, transaction.getDetachedObjects().contains(resourceID));
+ }
+
+}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ExternalReferenceTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ExternalReferenceTest.java
new file mode 100644
index 0000000000..641bd7421e
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ExternalReferenceTest.java
@@ -0,0 +1,334 @@
+/***************************************************************************
+ * Copyright (c) 2004 - 2008 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:
+ * Simon McDuff - initial API and implementation
+ **************************************************************************/
+package org.eclipse.emf.cdo.tests;
+
+import org.eclipse.emf.cdo.CDOSession;
+import org.eclipse.emf.cdo.CDOTransaction;
+import org.eclipse.emf.cdo.CDOViewSet;
+import org.eclipse.emf.cdo.CDOXATransaction;
+import org.eclipse.emf.cdo.eresource.CDOResource;
+import org.eclipse.emf.cdo.tests.model1.Company;
+import org.eclipse.emf.cdo.tests.model1.Model1Factory;
+import org.eclipse.emf.cdo.tests.model1.Model1Package;
+import org.eclipse.emf.cdo.tests.model1.PurchaseOrder;
+import org.eclipse.emf.cdo.tests.model1.Supplier;
+import org.eclipse.emf.cdo.tests.model2.Model2Package;
+import org.eclipse.emf.cdo.tests.model4.GenRefSingleNonContained;
+import org.eclipse.emf.cdo.tests.model4.model4Factory;
+import org.eclipse.emf.cdo.tests.model4.model4Package;
+import org.eclipse.emf.cdo.util.CDOUtil;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EcoreFactory;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
+
+/**
+ * @author Simon McDuff
+ */
+public class ExternalReferenceTest extends AbstractCDOTest
+{
+ final static public String REPOSITORY2_NAME = "repo2";
+
+
+ public void testExternalWithDynamicEObject() throws Exception
+ {
+ {
+ CDOSession sessionA = openSession();
+
+ ResourceSet resourceSet = new ResourceSetImpl();
+ resourceSet.getResourceFactoryRegistry().getProtocolToFactoryMap().put("file", new XMIResourceFactoryImpl());
+
+ EPackage schoolPackage = createDynamicEPackage();
+ EClass classifier = (EClass)schoolPackage.getEClassifier("SchoolBook");
+
+ EObject schoolbook = schoolPackage.getEFactoryInstance().create(classifier);
+ sessionA.getPackageRegistry().putEPackage(model4Package.eINSTANCE);
+ CDOTransaction transactionA1 = sessionA.openTransaction(resourceSet);
+
+ CDOResource resA = transactionA1.createResource("/resA");
+ Resource resD = resourceSet.createResource(URI.createFileURI("c:\\1.xml"));
+
+ GenRefSingleNonContained objectFromResA = model4Factory.eINSTANCE.createGenRefSingleNonContained();
+ objectFromResA.setElement(schoolbook);
+ resD.getContents().add(schoolbook);
+
+ resA.getContents().add(objectFromResA);
+
+ transactionA1.commit();
+ }
+ }
+
+ public void testExternalWithEClass() throws Exception
+ {
+ {
+ CDOSession sessionA = openSession();
+
+ ResourceSet resourceSet = new ResourceSetImpl();
+
+ sessionA.getPackageRegistry().putEPackage(model4Package.eINSTANCE);
+
+ CDOTransaction transactionA1 = sessionA.openTransaction(resourceSet);
+ CDOResource resA = transactionA1.createResource("/resA");
+ GenRefSingleNonContained objectFromResA = model4Factory.eINSTANCE.createGenRefSingleNonContained();
+ objectFromResA.setElement(Model1Package.eINSTANCE.getAddress());
+ resA.getContents().add(objectFromResA);
+ transactionA1.commit();
+ }
+
+ {
+ CDOSession sessionA = openSession();
+
+ ResourceSet resourceSet = new ResourceSetImpl();
+ resourceSet.getPackageRegistry().put(Model1Package.eINSTANCE.getNsURI(), Model1Package.eINSTANCE);
+
+ CDOTransaction transactionA1 = sessionA.openTransaction(resourceSet);
+ CDOResource resA = transactionA1.getResource("/resA");
+
+ GenRefSingleNonContained objectFromResA = (GenRefSingleNonContained)resA.getContents().get(0);
+ assertEquals(Model1Package.eINSTANCE.getAddress(), objectFromResA.getElement());
+ transactionA1.commit();
+ }
+ }
+ public void testExternalWithEPackage() throws Exception
+ {
+ {
+ CDOSession sessionA = openSession();
+
+ ResourceSet resourceSet = new ResourceSetImpl();
+
+ sessionA.getPackageRegistry().putEPackage(model4Package.eINSTANCE);
+
+ CDOTransaction transactionA1 = sessionA.openTransaction(resourceSet);
+ CDOResource resA = transactionA1.createResource("/resA");
+ GenRefSingleNonContained objectFromResA = model4Factory.eINSTANCE.createGenRefSingleNonContained();
+ objectFromResA.setElement(Model1Package.eINSTANCE);
+ resA.getContents().add(objectFromResA);
+ transactionA1.commit();
+ }
+
+ {
+ CDOSession sessionA = openSession();
+
+ ResourceSet resourceSet = new ResourceSetImpl();
+ resourceSet.getPackageRegistry().put(Model1Package.eINSTANCE.getNsURI(), Model1Package.eINSTANCE);
+
+ CDOTransaction transactionA1 = sessionA.openTransaction(resourceSet);
+ CDOResource resA = transactionA1.getResource("/resA");
+
+ GenRefSingleNonContained objectFromResA = (GenRefSingleNonContained)resA.getContents().get(0);
+ assertEquals(Model1Package.eINSTANCE, objectFromResA.getElement());
+ transactionA1.commit();
+ }
+ }
+
+ public void testOneXMIResourceManyViewsOnOneResourceSet() throws Exception
+ {
+ URI a = URI.createURI("file:/c:/temp");
+ URI b = URI.createURI("file://c:/temp");
+ URI c = URI.createURI("file:///c:/temp");
+
+ System.out.println(a.authority());
+ System.out.println(b.authority());
+ System.out.println(c.authority());
+
+ createRepository(REPOSITORY2_NAME);
+ {
+ CDOSession sessionA = openSession();
+ CDOSession sessionB = openSession(REPOSITORY2_NAME);
+ ResourceSet resourceSet = new ResourceSetImpl();
+ resourceSet.getResourceFactoryRegistry().getProtocolToFactoryMap().put("file", new XMIResourceFactoryImpl());
+
+ sessionA.getPackageRegistry().putEPackage(Model1Package.eINSTANCE);
+ sessionA.getPackageRegistry().putEPackage(Model2Package.eINSTANCE);
+ sessionB.getPackageRegistry().putEPackage(Model1Package.eINSTANCE);
+ sessionB.getPackageRegistry().putEPackage(Model2Package.eINSTANCE);
+
+ CDOTransaction transactionA1 = sessionA.openTransaction(resourceSet);
+ CDOTransaction transactionB1 = sessionB.openTransaction(resourceSet);
+
+ CDOResource resA = transactionA1.createResource("/resA");
+ CDOResource resB = transactionB1.createResource("/resB");
+
+ assertEquals(2, resourceSet.getResources().size());
+ // assertEquals(resA, resourceSet.getResource(CDOUtil.createResourceURI(sessionA, "/resA"), false));
+ // assertEquals(resB, resourceSet.getResource(CDOUtil.createResourceURI(sessionA, "/resB"), false));
+
+ // CDOResource resC = (CDOResource)resourceSet.createResource(CDOUtil.createResourceURI(sessionA, "/resC"));
+ // assertEquals(transactionA1, resC.cdoView());
+ CDOResource resC = transactionA1.createResource("/resC");
+ assertNotNull(resC);
+
+ assertEquals(3, resourceSet.getResources().size());
+ // assertEquals(resC, resourceSet.getResource(CDOUtil.createResourceURI(sessionA, "/resC"), false));
+
+ Resource resD = resourceSet.createResource(URI.createFileURI("c:\\1.xml"));
+
+ assertEquals(4, resourceSet.getResources().size());
+ assertEquals(false, resD instanceof CDOResource);
+
+ Company companyA = Model1Factory.eINSTANCE.createCompany();
+ companyA.setName("VALUEA");
+
+ Company companyB = Model1Factory.eINSTANCE.createCompany();
+ companyB.setName("VALUEB");
+
+ Company companyD = Model1Factory.eINSTANCE.createCompany();
+ companyD.setName("VALUED");
+
+ resD.getContents().add(companyD);
+ resA.getContents().add(companyA);
+ resB.getContents().add(companyB);
+
+ Supplier supplier = Model1Factory.eINSTANCE.createSupplier();
+ PurchaseOrder purchaseOrder = Model1Factory.eINSTANCE.createPurchaseOrder();
+
+ supplier.getPurchaseOrders().add(purchaseOrder);
+ resD.getContents().add(supplier);
+ resA.getContents().add(purchaseOrder);
+
+ CDOXATransaction transSet = CDOUtil.createXATransaction();
+
+ transSet.add(CDOUtil.getViewSet(resourceSet));
+
+ transactionA1.commit();
+
+ resD.save(null);
+ }
+
+ {
+ ResourceSet resourceSet = new ResourceSetImpl();
+ CDOSession session = openSession();
+ CDOTransaction transaction = session.openTransaction(resourceSet);
+
+ CDOSession session2 = openSession(REPOSITORY2_NAME);
+ CDOTransaction transaction2 = session2.openTransaction(resourceSet);
+
+ CDOViewSet set = CDOUtil.getViewSet(resourceSet);
+ assertNotNull(set);
+
+ resourceSet.getPackageRegistry().put(Model1Package.eINSTANCE.getNsURI(), Model1Package.eINSTANCE);
+ resourceSet.getResourceFactoryRegistry().getProtocolToFactoryMap().put("file", new XMIResourceFactoryImpl());
+
+ Resource resD = resourceSet.getResource(URI.createFileURI("c:\\1.xml"), true);
+ CDOResource resA = transaction.getResource("/resA");
+ CDOResource resB = transaction2.getResource("/resB");
+ Company companyA = (Company)resA.getContents().get(0);
+ Company companyB = (Company)resB.getContents().get(0);
+ Company companyD = (Company)resD.getContents().get(0);
+
+ assertNotSame(resA.getURI(), resB.getURI());
+ assertNotSame(resA.getPath(), "/resA");
+ assertNotSame(resB.getPath(), "/resB");
+ assertNotSame(resA.cdoView(), transaction2);
+ assertNotSame(resB.cdoView(), transaction);
+
+ assertEquals("VALUEA", companyA.getName());
+ assertEquals("VALUEB", companyB.getName());
+ assertEquals("VALUED", companyD.getName());
+
+ Supplier supplierD = (Supplier)resD.getContents().get(1);
+ PurchaseOrder pO = supplierD.getPurchaseOrders().get(0);
+ assertEquals(transaction, pO.cdoView());
+ assertEquals(supplierD, pO.getSupplier());
+ }
+ }
+
+ public void testManyViewsOnOneResourceSet() throws Exception
+ {
+ createRepository(REPOSITORY2_NAME);
+ {
+ CDOSession sessionA = openSession();
+ CDOSession sessionB = openSession(REPOSITORY2_NAME);
+
+ ResourceSet resourceSet = new ResourceSetImpl();
+
+ sessionA.getPackageRegistry().putEPackage(Model1Package.eINSTANCE);
+ sessionB.getPackageRegistry().putEPackage(Model1Package.eINSTANCE);
+
+ CDOTransaction transactionA1 = sessionA.openTransaction(resourceSet);
+ CDOTransaction transactionB1 = sessionB.openTransaction(resourceSet);
+
+ CDOResource resA = transactionA1.createResource("/resA");
+ CDOResource resB = transactionB1.createResource("/resB");
+
+ Supplier supplier = Model1Factory.eINSTANCE.createSupplier();
+ PurchaseOrder purchaseOrder = Model1Factory.eINSTANCE.createPurchaseOrder();
+
+ supplier.getPurchaseOrders().add(purchaseOrder);
+ resB.getContents().add(supplier);
+ resA.getContents().add(purchaseOrder);
+
+ CDOXATransaction transSet = CDOUtil.createXATransaction();
+ transSet.add(CDOUtil.getViewSet(resourceSet));
+
+ transactionA1.commit();
+ }
+
+ {
+ ResourceSet resourceSet = new ResourceSetImpl();
+ CDOSession sessionA = openSession();
+ CDOTransaction transactionA = sessionA.openTransaction(resourceSet);
+
+ CDOSession sessionB = openSession(REPOSITORY2_NAME);
+ CDOTransaction transactionB = sessionB.openTransaction(resourceSet);
+
+ CDOResource resA = transactionA.getResource("/resA");
+ assertNotNull(resA);
+
+ CDOResource resB = transactionB.getResource("/resB");
+ assertNotNull(resB);
+
+ Supplier supplierB = (Supplier)resB.getContents().get(0);
+ PurchaseOrder pO = supplierB.getPurchaseOrders().get(0);
+
+ assertEquals(transactionA, pO.cdoView());
+
+ assertEquals(transactionB, supplierB.cdoView());
+
+ assertEquals(supplierB, pO.getSupplier());
+ assertEquals(supplierB.getPurchaseOrders().get(0), pO);
+
+ }
+ }
+
+ private EPackage createDynamicEPackage()
+ {
+ final EcoreFactory efactory = EcoreFactory.eINSTANCE;
+ final EcorePackage epackage = EcorePackage.eINSTANCE;
+
+ EClass schoolBookEClass = efactory.createEClass();
+ schoolBookEClass.setName("SchoolBook");
+
+ // create a new attribute for this EClass
+ EAttribute level = efactory.createEAttribute();
+ level.setName("level");
+ level.setEType(epackage.getEInt());
+ schoolBookEClass.getEStructuralFeatures().add(level);
+
+ // Create a new EPackage and add the new EClasses
+ EPackage schoolPackage = efactory.createEPackage();
+ schoolPackage.setName("elv");
+ schoolPackage.setNsPrefix("elv");
+ schoolPackage.setNsURI("http:///www.elver.org/School");
+ schoolPackage.getEClassifiers().add(schoolBookEClass);
+ return schoolPackage;
+
+ }
+
+}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/InitialTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/InitialTest.java
index 200f14e5fa..e80a4a60c2 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/InitialTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/InitialTest.java
@@ -21,6 +21,7 @@ import org.eclipse.emf.cdo.tests.model1.OrderAddress;
import org.eclipse.emf.cdo.tests.model1.OrderDetail;
import org.eclipse.emf.cdo.tests.model1.PurchaseOrder;
import org.eclipse.emf.cdo.tests.model1.Supplier;
+import org.eclipse.emf.cdo.util.CDOURIUtil;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.net4j.buffer.IBufferHandler;
@@ -151,7 +152,7 @@ public class InitialTest extends AbstractCDOTest
msg("Creating resource");
CDOResource resource = transaction.createResource("/test1");
assertNew(resource, transaction);
- assertEquals(URI.createURI("cdo:/test1"), resource.getURI());
+ assertEquals(URI.createURI("cdo://" + session.getRepositoryUUID() + "/test1"), resource.getURI());
ResourceSet expected = transaction.getResourceSet();
ResourceSet actual = resource.getResourceSet();
assertEquals(expected, actual);
@@ -174,11 +175,14 @@ public class InitialTest extends AbstractCDOTest
msg("Opening transaction");
CDOTransaction transaction = session.openTransaction(resourceSet);
-
+ final URI newURI = CDOURIUtil.createResourceURI(session, "test1");
msg("Verifying resource");
assertNew(resource, transaction);
- assertEquals(uri, resource.getURI());
+ assertEquals(newURI, resource.getURI());
assertEquals(transaction.getResourceSet(), resource.getResourceSet());
+
+ assertEquals(resource, resourceSet.getResource(CDOURIUtil.createResourceURI(session, "test1"), false));
+
}
public void testAttachViewWithObject() throws Exception
@@ -225,7 +229,7 @@ public class InitialTest extends AbstractCDOTest
msg("Verifying resource");
assertNew(resource, transaction);
- assertEquals(uri, resource.getURI());
+ assertEquals(CDOURIUtil.createResourceURI(session, uri.path()), resource.getURI());
assertEquals(transaction.getResourceSet(), resource.getResourceSet());
msg("Verifying contents");
@@ -447,18 +451,35 @@ public class InitialTest extends AbstractCDOTest
transaction.commit();
enableConsole();
}
+ {
+ msg("Opening transaction");
+ CDOTransaction transaction = session.openTransaction();
- msg("Opening transaction");
- CDOTransaction transaction = session.openTransaction();
+ msg("Getting resource");
+ CDOResource resource = transaction.getResource("/test1");
+ assertNotNull(resource);
+ assertEquals(URI.createURI("cdo://" + session.getRepositoryUUID() + "/test1"), resource.getURI());
+ assertEquals(transaction.getResourceSet(), resource.getResourceSet());
+ assertEquals(1, transaction.getResourceSet().getResources().size());
+ assertEquals(CDOState.PROXY, resource.cdoState());
+ assertEquals(transaction, resource.cdoView());
+ assertNull(resource.cdoRevision());
+ }
+ {
+ msg("Opening transaction");
+ CDOTransaction transaction = session.openTransaction();
- msg("Getting resource");
- CDOResource resource = transaction.getResource("/test1");
- assertNotNull(resource);
- assertEquals(URI.createURI("cdo:/test1"), resource.getURI());
- assertEquals(transaction.getResourceSet(), resource.getResourceSet());
- assertEquals(CDOState.PROXY, resource.cdoState());
- assertEquals(transaction, resource.cdoView());
- assertNull(resource.cdoRevision());
+ msg("Getting resource");
+ CDOResource resource = (CDOResource)transaction.getResourceSet().getResource(
+ CDOURIUtil.createResourceURI(transaction, "/test1"), true);
+ assertNotNull(resource);
+ assertEquals(URI.createURI("cdo://" + session.getRepositoryUUID() + "/test1"), resource.getURI());
+ assertEquals(transaction.getResourceSet(), resource.getResourceSet());
+ assertEquals(1, transaction.getResourceSet().getResources().size());
+ assertEquals(CDOState.PROXY, resource.cdoState());
+ assertEquals(transaction, resource.cdoView());
+ assertNull(resource.cdoRevision());
+ }
}
public void testGetContents() throws Exception
@@ -580,7 +601,7 @@ public class InitialTest extends AbstractCDOTest
msg("Getting resource");
CDOResource resource = transaction.getResource("/test1");
assertNotNull(resource);
- assertEquals(URI.createURI("cdo:/test1"), resource.getURI());
+ assertEquals(URI.createURI("cdo://" + session.getRepositoryUUID() + "/test1"), resource.getURI());
assertEquals(transaction.getResourceSet(), resource.getResourceSet());
assertEquals(CDOState.PROXY, resource.cdoState());
assertEquals(transaction, resource.cdoView());
@@ -774,6 +795,8 @@ public class InitialTest extends AbstractCDOTest
resource1.getContents().add(cat1);
cat1.getCategories().add(cat2);
+ assertEquals(null, cat2.cdoResource());
+ assertEquals(resource1, cat1.cdoResource());
assertEquals(null, ((InternalEObject)cat2).eDirectResource());
assertEquals(resource1, ((InternalEObject)cat1).eDirectResource());
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/InvalidationTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/InvalidationTest.java
index 8ce0145543..6b21cc5f94 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/InvalidationTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/InvalidationTest.java
@@ -22,6 +22,7 @@ import org.eclipse.emf.cdo.tests.model1.Company;
import org.eclipse.emf.cdo.tests.model1.Model1Factory;
import org.eclipse.emf.internal.cdo.CDOTransactionImpl;
+import org.eclipse.emf.internal.cdo.util.FSMUtil;
import org.eclipse.net4j.util.event.IEvent;
import org.eclipse.net4j.util.event.IListener;
@@ -628,4 +629,63 @@ public class InvalidationTest extends AbstractCDOTest
assertEquals(false, timeOuterB_2.timedOut());
assertEquals(false, timeOuterC_2.timedOut());
}
+
+
+ public void testDetach() throws Exception
+ {
+ msg("Creating category1");
+ final Category categoryA = Model1Factory.eINSTANCE.createCategory();
+ categoryA.setName("category1");
+
+ msg("Opening sessionA");
+ final CDOSession sessionA = openModel1Session();
+
+ msg("Attaching transaction");
+ final CDOTransaction transaction = sessionA.openTransaction();
+
+ msg("Creating resource");
+ final CDOResource resourceA = transaction.createResource("/test1");
+
+ msg("Adding company");
+ resourceA.getContents().add(categoryA);
+
+ msg("Committing");
+ transaction.commit();
+
+ // ************************************************************* //
+
+ msg("Opening sessionB");
+ final CDOSession sessionB = openModel1Session();
+
+ msg("Attaching viewB");
+ final CDOView viewB = sessionB.openTransaction();
+
+ msg("Loading resource");
+ final CDOResource resourceB = viewB.getResource("/test1");
+ assertProxy(resourceB);
+
+ EList<EObject> contents = resourceB.getContents();
+ final Category categoryB = (Category)contents.get(0);
+
+ // ************************************************************* //
+
+ resourceA.getContents().remove(categoryA);
+ ITimeOuter timeOuter = new PollingTimeOuter(20, 100)
+ {
+ @Override
+ protected boolean successful()
+ {
+ return FSMUtil.isTransient(categoryB);
+ }
+ };
+
+ msg("Checking before commit");
+ assertEquals(true, timeOuter.timedOut());
+
+ msg("Committing");
+ transaction.commit();
+
+ msg("Checking after commit");
+ assertEquals(false, timeOuter.timedOut());
+ }
}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ResourceTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ResourceTest.java
index afb36d7bbc..3ee8650932 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ResourceTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ResourceTest.java
@@ -1,6 +1,7 @@
package org.eclipse.emf.cdo.tests;
import org.eclipse.emf.cdo.CDOSession;
+import org.eclipse.emf.cdo.CDOState;
import org.eclipse.emf.cdo.CDOTransaction;
import org.eclipse.emf.cdo.CDOView;
import org.eclipse.emf.cdo.eresource.CDOResource;
@@ -10,12 +11,21 @@ import org.eclipse.emf.cdo.server.IStore;
import org.eclipse.emf.cdo.tests.model1.Model1Factory;
import org.eclipse.emf.cdo.tests.model1.Product;
import org.eclipse.emf.cdo.tests.model1.VAT;
+import org.eclipse.emf.cdo.util.CDOURIUtil;
+import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import java.util.ArrayList;
import java.util.List;
+import junit.framework.Assert;
+
public class ResourceTest extends AbstractCDOTest
{
/**
@@ -54,6 +64,151 @@ public class ResourceTest extends AbstractCDOTest
session.close();
}
+ public void testCreateResource_FromResourceSet() throws Exception
+ {
+ final URI uri = URI.createURI("cdo:/test1");
+
+ msg("Creating resourceSet");
+ ResourceSet resourceSet = new ResourceSetImpl();
+
+ msg("Opening session");
+ CDOSession session = openModel1Session();
+
+ msg("Opening transaction");
+ CDOTransaction transaction = session.openTransaction(resourceSet);
+
+ msg("Creating resource");
+ CDOResource resource = (CDOResource)resourceSet.createResource(uri);
+ assertActive(resource);
+
+ msg("Verifying resource");
+ assertNew(resource, transaction);
+ assertEquals(CDOURIUtil.createResourceURI(session, "test1"), resource.getURI());
+ assertEquals(transaction.getResourceSet(), resource.getResourceSet());
+ }
+
+ public void testCreateResource_FromTransaction() throws Exception
+ {
+ msg("Opening session");
+ CDOSession session = openModel1Session();
+
+ msg("Opening transaction");
+ CDOTransaction transaction = session.openTransaction();
+
+ msg("Creating resource");
+ CDOResource resource = transaction.createResource("/test1");
+ assertActive(resource);
+ CDOResource resourceCopy = transaction.getOrCreateResource("/test1");
+ assertEquals(resource, resourceCopy);
+
+ msg("Verifying resource");
+ assertNew(resource, transaction);
+ assertEquals(CDOURIUtil.createResourceURI(session, "test1"), resource.getURI());
+ assertEquals(transaction.getResourceSet(), resource.getResourceSet());
+ }
+
+ public void testRemoveResourceWithCloseView() throws Exception
+ {
+ {
+ msg("Opening session");
+ CDOSession session = openModel1Session();
+
+ msg("Opening transaction");
+ CDOTransaction transaction = session.openTransaction();
+ ResourceSet rset = transaction.getResourceSet();
+ msg("Creating resource");
+ CDOResource resource = transaction.createResource("/test1");
+ assertActive(resource);
+ transaction.commit();
+
+ Assert.assertEquals(1, rset.getResources().size());
+ Assert.assertEquals(1, CDOUtil.getViewSet(rset).getViews().length);
+
+ transaction.close();
+
+ Assert.assertEquals(0, CDOUtil.getViewSet(rset).getViews().length);
+ Assert.assertEquals(0, rset.getResources().size());
+ session.close();
+ }
+ {
+ CDOSession session = openModel1Session();
+ msg("Opening transaction");
+ CDOTransaction transaction = session.openTransaction();
+
+ msg("Getting resource");
+ CDOResource resource = (CDOResource)transaction.getResourceSet().getResource(
+ CDOURIUtil.createResourceURI(transaction, "/test1"), true);
+ assertNotNull(resource);
+ assertEquals(transaction.getResourceSet(), resource.getResourceSet());
+ assertEquals(1, transaction.getResourceSet().getResources().size());
+ assertEquals(CDOState.PROXY, resource.cdoState());
+ assertEquals(transaction, resource.cdoView());
+ assertNull(resource.cdoRevision());
+ }
+ }
+
+ public void testAttachManyResources() throws Exception
+ {
+ CDOSession session = openModel1Session();
+ CDOTransaction transaction = session.openTransaction();
+
+ CDOResource resource1 = transaction.createResource("/my/resource1");
+ CDOResource resource2 = transaction.createResource("/my/resource2");
+ CDOResource resource3 = transaction.createResource("/my/resource3");
+
+ List<Resource> tobeRemoved = new ArrayList<Resource>();
+ tobeRemoved.add(resource1);
+ tobeRemoved.add(resource3);
+
+ assertEquals(3, transaction.getResourceSet().getResources().size());
+
+ transaction.getResourceSet().getResources().removeAll(tobeRemoved);
+
+ assertEquals(1, transaction.getResourceSet().getResources().size());
+ assertEquals(null, transaction.getResourceSet().getResource(resource1.getURI(), false));
+ assertEquals(resource2, transaction.getResourceSet().getResource(resource2.getURI(), false));
+ assertEquals(null, transaction.getResourceSet().getResource(resource3.getURI(), false));
+
+ transaction.getResourceSet().getResources().addAll(tobeRemoved);
+
+ assertEquals(3, transaction.getResourceSet().getResources().size());
+ assertEquals(resource1, transaction.getResourceSet().getResource(resource1.getURI(), false));
+ assertEquals(resource2, transaction.getResourceSet().getResource(resource2.getURI(), false));
+ assertEquals(resource3, transaction.getResourceSet().getResource(resource3.getURI(), false));
+
+ transaction.commit();
+
+ session.close();
+ }
+
+ public void testDetachManyResources() throws Exception
+ {
+ CDOSession session = openModel1Session();
+ CDOTransaction transaction = session.openTransaction();
+
+ CDOResource resource1 = transaction.createResource("/my/resource1");
+ CDOResource resource2 = transaction.createResource("/my/resource2");
+ CDOResource resource3 = transaction.createResource("/my/resource3");
+
+ List<Resource> tobeRemoved = new ArrayList<Resource>();
+ tobeRemoved.add(resource1);
+ tobeRemoved.add(resource3);
+
+ assertEquals(3, transaction.getResourceSet().getResources().size());
+
+ transaction.getResourceSet().getResources().removeAll(tobeRemoved);
+
+ assertEquals(1, transaction.getResourceSet().getResources().size());
+ assertEquals(null, transaction.getResourceSet().getResource(resource1.getURI(), false));
+ assertEquals(resource2, transaction.getResourceSet().getResource(resource2.getURI(), false));
+ assertEquals(null, transaction.getResourceSet().getResource(resource3.getURI(), false));
+
+ transaction.commit();
+ session.close();
+ }
+
+
+
/**
* http://bugs.eclipse.org/208689
*/
@@ -198,4 +353,5 @@ public class ResourceTest extends AbstractCDOTest
assertEquals(expected, resources.size());
}
+
}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionHolderTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionHolderTest.java
index a328b00ea6..f37e6d0a7b 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionHolderTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionHolderTest.java
@@ -295,7 +295,7 @@ public class RevisionHolderTest extends AbstractOMTest
throw new UnsupportedOperationException();
}
- public CDOID getContainerID()
+ public Object getContainerID()
{
throw new UnsupportedOperationException();
}
@@ -370,7 +370,7 @@ public class RevisionHolderTest extends AbstractOMTest
throw new UnsupportedOperationException();
}
- public void setContainerID(CDOID containerID)
+ public void setContainerID(Object containerID)
{
throw new UnsupportedOperationException();
}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/StateMachineTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/StateMachineTest.java
index 884f70d62a..ff65ede716 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/StateMachineTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/StateMachineTest.java
@@ -46,7 +46,7 @@ public class StateMachineTest extends AbstractCDOTest
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource("/test1");
assertNew(resource, transaction);
- assertEquals(URI.createURI("cdo:/test1"), resource.getURI());
+ assertEquals(URI.createURI("cdo://" + session.getRepositoryUUID() + "/test1"), resource.getURI());
assertEquals(transaction.getResourceSet(), resource.getResourceSet());
// Attach single object
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ViewTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ViewTest.java
index 5fef75fbee..bd3c90d40f 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ViewTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ViewTest.java
@@ -103,10 +103,7 @@ public class ViewTest extends AbstractCDOTest
CDORevisionData revision = resource.cdoRevision().getData();
CDOResourcePackage resourcePackage = session.getPackageManager().getCDOResourcePackage();
CDOContentsFeature contentsFeature = resourcePackage.getCDOResourceClass().getCDOContentsFeature();
- assertEquals(false, revision.get(contentsFeature, 0) instanceof CDOReferenceProxy);
- assertEquals(false, revision.get(contentsFeature, 1) instanceof CDOReferenceProxy);
- assertEquals(false, revision.get(contentsFeature, 2) instanceof CDOReferenceProxy);
- assertEquals(false, revision.get(contentsFeature, 99) instanceof CDOReferenceProxy);
+ assertEquals(true, revision.get(contentsFeature, 99) instanceof CDOReferenceProxy);
assertEquals(false, revision.get(contentsFeature, 100) instanceof CDOReferenceProxy);
session.close();
}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/XATransactionTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/XATransactionTest.java
new file mode 100644
index 0000000000..5c19da3a7f
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/XATransactionTest.java
@@ -0,0 +1,222 @@
+/***************************************************************************
+ * Copyright (c) 2004 - 2008 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:
+ * Simon McDuff - initial API and implementation
+ **************************************************************************/
+package org.eclipse.emf.cdo.tests;
+
+import org.eclipse.emf.cdo.CDOSavepoint;
+import org.eclipse.emf.cdo.CDOSession;
+import org.eclipse.emf.cdo.CDOTransaction;
+import org.eclipse.emf.cdo.CDOXATransaction;
+import org.eclipse.emf.cdo.eresource.CDOResource;
+import org.eclipse.emf.cdo.tests.model1.Model1Factory;
+import org.eclipse.emf.cdo.tests.model1.Model1Package;
+import org.eclipse.emf.cdo.tests.model1.PurchaseOrder;
+import org.eclipse.emf.cdo.tests.model1.Supplier;
+import org.eclipse.emf.cdo.tests.model4.GenRefSingleNonContained;
+import org.eclipse.emf.cdo.tests.model4.model4Factory;
+import org.eclipse.emf.cdo.tests.model4.model4Package;
+import org.eclipse.emf.cdo.util.CDOUtil;
+
+import org.eclipse.emf.internal.cdo.CDOTransactionImpl;
+
+import org.eclipse.net4j.util.transaction.TransactionException;
+
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+
+import java.util.Date;
+
+/**
+ * @author Simon McDuff
+ */
+public class XATransactionTest extends AbstractCDOTest
+{
+ final static public String REPOSITORY2_NAME = "repo2";
+
+ public void testRollback() throws Exception
+ {
+ createRepository(REPOSITORY2_NAME);
+
+ CDOSession sessionA = openSession();
+ CDOSession sessionB = openSession(REPOSITORY2_NAME);
+
+ ResourceSet resourceSet = new ResourceSetImpl();
+ CDOXATransaction xaTransaction = CDOUtil.createXATransaction();
+
+ CDOUtil.prepareResourceSet(resourceSet);
+ xaTransaction.add(CDOUtil.getViewSet(resourceSet));
+
+ sessionA.getPackageRegistry().putEPackage(Model1Package.eINSTANCE);
+ sessionB.getPackageRegistry().putEPackage(Model1Package.eINSTANCE);
+
+ CDOTransaction transactionA1 = sessionA.openTransaction(resourceSet);
+ CDOTransaction transactionB1 = sessionB.openTransaction(resourceSet);
+
+ CDOResource resA = transactionA1.createResource("/resA");
+ CDOResource resB = transactionB1.createResource("/resB");
+
+ Supplier supplier = Model1Factory.eINSTANCE.createSupplier();
+ PurchaseOrder purchaseOrder = Model1Factory.eINSTANCE.createPurchaseOrder();
+
+ supplier.getPurchaseOrders().add(purchaseOrder);
+ resB.getContents().add(supplier);
+ resA.getContents().add(purchaseOrder);
+
+ assertNew(resA, transactionA1);
+ assertNew(resB, transactionB1);
+
+ xaTransaction.rollback();
+
+ assertTransient(resA);
+ assertTransient(resB);
+
+ xaTransaction.commit();
+ }
+
+ public void testRollback_AfterSetpoint() throws Exception
+ {
+ createRepository(REPOSITORY2_NAME);
+
+ CDOSession sessionA = openSession();
+ CDOSession sessionB = openSession(REPOSITORY2_NAME);
+
+ ResourceSet resourceSet = new ResourceSetImpl();
+ CDOXATransaction xaTransaction = CDOUtil.createXATransaction();
+
+ CDOUtil.prepareResourceSet(resourceSet);
+ xaTransaction.add(CDOUtil.getViewSet(resourceSet));
+
+ sessionA.getPackageRegistry().putEPackage(Model1Package.eINSTANCE);
+ sessionB.getPackageRegistry().putEPackage(Model1Package.eINSTANCE);
+
+ CDOTransaction transactionA1 = sessionA.openTransaction(resourceSet);
+ CDOTransaction transactionB1 = sessionB.openTransaction(resourceSet);
+
+ CDOResource resA = transactionA1.createResource("/resA");
+ CDOResource resB = transactionB1.createResource("/resB");
+
+ Supplier supplier = Model1Factory.eINSTANCE.createSupplier();
+ PurchaseOrder purchaseOrder = Model1Factory.eINSTANCE.createPurchaseOrder();
+
+ supplier.getPurchaseOrders().add(purchaseOrder);
+ resB.getContents().add(supplier);
+ resA.getContents().add(purchaseOrder);
+
+ assertNew(resA, transactionA1);
+ assertNew(resB, transactionB1);
+
+ CDOSavepoint savepoint1 = xaTransaction.setSavepoint();
+
+ purchaseOrder.setDate(new Date());
+ supplier.setCity("OTTAWA");
+
+ CDOSavepoint savepoint2 = xaTransaction.setSavepoint();
+
+ savepoint1.rollback();
+
+ assertNew(resA, transactionA1);
+ assertNew(resB, transactionB1);
+
+ assertEquals(null, supplier.getCity());
+ assertEquals(null, purchaseOrder.getDate());
+ assertEquals(supplier, purchaseOrder.getSupplier());
+
+ try
+ {
+ savepoint2.rollback();
+ fail("Should have an exception");
+ }
+ catch (Exception ex)
+ {
+
+ }
+
+ xaTransaction.commit();
+
+ }
+
+ public void testCommitFromTransactionDisabled() throws Exception
+ {
+ createRepository(REPOSITORY2_NAME);
+ {
+ CDOSession sessionA = openSession();
+ CDOSession sessionB = openSession(REPOSITORY2_NAME);
+ ResourceSet resourceSet = new ResourceSetImpl();
+ sessionA.getPackageRegistry().putEPackage(model4Package.eINSTANCE);
+ sessionB.getPackageRegistry().putEPackage(model4Package.eINSTANCE);
+ CDOTransactionImpl transactionA1 = (CDOTransactionImpl)sessionA.openTransaction(resourceSet);
+ CDOTransactionImpl transactionB1 = (CDOTransactionImpl)sessionB.openTransaction(resourceSet);
+
+ CDOResource resA = transactionA1.createResource("/resA");
+ CDOResource resB = transactionB1.createResource("/resB");
+
+ transactionA1.setTransactionStrategy(null);
+ GenRefSingleNonContained objectFromResA = model4Factory.eINSTANCE.createGenRefSingleNonContained();
+ GenRefSingleNonContained objectFromResB = model4Factory.eINSTANCE.createGenRefSingleNonContained();
+
+ objectFromResA.setElement(objectFromResB);
+ resA.getContents().add(objectFromResA);
+ resB.getContents().add(objectFromResB);
+
+ CDOXATransaction transSet = CDOUtil.createXATransaction();
+
+ transSet.setAllowRequestFromTransactionEnabled(false);
+
+ transSet.add(CDOUtil.getViewSet(resourceSet));
+
+ try
+ {
+ transactionA1.commit();
+ fail("We should have an exception");
+ }
+ catch (TransactionException exp)
+ {
+
+ }
+ transSet.commit();
+ }
+ }
+
+ public void testNotUsingXATransaction_Exception() throws Exception
+ {
+ createRepository(REPOSITORY2_NAME);
+ {
+ CDOSession sessionA = openSession();
+ CDOSession sessionB = openSession(REPOSITORY2_NAME);
+ ResourceSet resourceSet = new ResourceSetImpl();
+ sessionA.getPackageRegistry().putEPackage(model4Package.eINSTANCE);
+ sessionB.getPackageRegistry().putEPackage(model4Package.eINSTANCE);
+ CDOTransactionImpl transactionA1 = (CDOTransactionImpl)sessionA.openTransaction(resourceSet);
+ CDOTransactionImpl transactionB1 = (CDOTransactionImpl)sessionB.openTransaction(resourceSet);
+
+ CDOResource resA = transactionA1.createResource("/resA");
+ CDOResource resB = transactionB1.createResource("/resB");
+ GenRefSingleNonContained objectFromResA = model4Factory.eINSTANCE.createGenRefSingleNonContained();
+ GenRefSingleNonContained objectFromResB = model4Factory.eINSTANCE.createGenRefSingleNonContained();
+
+ objectFromResA.setElement(objectFromResB);
+ resA.getContents().add(objectFromResA);
+ resB.getContents().add(objectFromResB);
+
+ try
+ {
+ transactionA1.commit();
+ fail("We should have an exception");
+ }
+ catch (TransactionException exp)
+ {
+ }
+ CDOXATransaction transSet = CDOUtil.createXATransaction();
+ transSet.add(CDOUtil.getViewSet(resourceSet));
+
+ transactionA1.commit();
+ }
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_246622_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_246622_Test.java
new file mode 100644
index 0000000000..91d0b00b5d
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_246622_Test.java
@@ -0,0 +1,135 @@
+/***************************************************************************
+ * Copyright (c) 2004 - 2008 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:
+ * Simon McDuff - initial API and implementation
+ **************************************************************************/
+package org.eclipse.emf.cdo.tests.bugzilla;
+
+import org.eclipse.emf.cdo.CDOSession;
+import org.eclipse.emf.cdo.CDOTransaction;
+import org.eclipse.emf.cdo.common.model.CDOFeature;
+import org.eclipse.emf.cdo.eresource.CDOResource;
+import org.eclipse.emf.cdo.tests.AbstractCDOTest;
+import org.eclipse.emf.cdo.tests.model1.Model1Factory;
+import org.eclipse.emf.cdo.tests.model1.Model1Package;
+import org.eclipse.emf.cdo.tests.model1.Order;
+import org.eclipse.emf.cdo.tests.model1.OrderDetail;
+import org.eclipse.emf.cdo.tests.model1.PurchaseOrder;
+import org.eclipse.emf.cdo.tests.model1.Supplier;
+
+/**
+ * 246622: CDOStore.set doesn't affect variable correctly - Could cause memory retention
+ * <p>
+ * See https://bugs.eclipse.org/243310
+ *
+ * @author Simon McDuff
+ */
+public class Bugzilla_246622_Test extends AbstractCDOTest
+{
+ public void testContainerAndMany() throws Exception
+ {
+ CDOSession session = openModel1Session();
+
+ CDOTransaction transaction1 = session.openTransaction();
+ CDOResource res = transaction1.createResource("/test1");
+ Order order = Model1Factory.eINSTANCE.createOrder();
+ OrderDetail orderDetail = Model1Factory.eINSTANCE.createOrderDetail();
+
+ res.getContents().add(order);
+ order.getOrderDetails().add(orderDetail);
+ CDOFeature order_OrderDetailFeature = session.getPackageManager().convert(Model1Package.eINSTANCE.getOrder_OrderDetails());
+ assertEquals(orderDetail, order.cdoRevision().getData().get(order_OrderDetailFeature, 0));
+
+ assertEquals(order, orderDetail.cdoRevision().getData().getContainerID());
+
+ Order order2 = Model1Factory.eINSTANCE.createOrder();
+ OrderDetail orderDetail2 = Model1Factory.eINSTANCE.createOrderDetail();
+
+ order2.getOrderDetails().add(orderDetail2);
+ res.getContents().add(order2);
+
+ assertEquals(orderDetail2, order2.cdoRevision().getData().get(order_OrderDetailFeature, 0));
+ assertEquals(order2, orderDetail2.cdoRevision().getData().getContainerID());
+
+ msg("Committing");
+ transaction1.commit();
+
+ assertEquals(orderDetail.cdoID(), order.cdoRevision().getData().get(order_OrderDetailFeature, 0));
+ assertEquals(orderDetail2.cdoID(), order2.cdoRevision().getData().get(order_OrderDetailFeature, 0));
+
+ assertEquals(order.cdoID(), orderDetail.cdoRevision().getData().getContainerID());
+ assertEquals(order2.cdoID(), orderDetail2.cdoRevision().getData().getContainerID());
+
+ Order order3 = Model1Factory.eINSTANCE.createOrder();
+
+ res.getContents().add(order3);
+ order3.getOrderDetails().add(orderDetail2);
+
+ assertEquals(orderDetail2.cdoID(), order3.cdoRevision().getData().get(order_OrderDetailFeature, 0));
+ assertEquals(order3, orderDetail2.cdoRevision().getData().getContainerID());
+
+ msg("Committing");
+ transaction1.commit();
+ }
+ public void testSet() throws Exception
+ {
+ CDOSession session = openModel1Session();
+
+ CDOTransaction transaction1 = session.openTransaction();
+ CDOResource res = transaction1.createResource("/test1");
+
+
+ msg("Test set with link before");
+ PurchaseOrder purchaseOrder = Model1Factory.eINSTANCE.createPurchaseOrder();
+ Supplier supplier = Model1Factory.eINSTANCE.createSupplier();
+
+ purchaseOrder.setSupplier(supplier);
+
+ res.getContents().add(purchaseOrder);
+ res.getContents().add(supplier);
+
+ CDOFeature supplier_PurchaseOrder = session.getPackageManager().convert(Model1Package.eINSTANCE.getSupplier_PurchaseOrders());
+ CDOFeature purchaseOrder_Supplier = session.getPackageManager().convert(Model1Package.eINSTANCE.getPurchaseOrder_Supplier());
+
+
+ assertEquals(supplier, purchaseOrder.cdoRevision().getData().get(purchaseOrder_Supplier, 0));
+ assertEquals(purchaseOrder, supplier.cdoRevision().getData().get(supplier_PurchaseOrder, 0));
+
+ msg("Test set with link after");
+ PurchaseOrder purchaseOrder2 = Model1Factory.eINSTANCE.createPurchaseOrder();
+ Supplier supplier2 = Model1Factory.eINSTANCE.createSupplier();
+
+ res.getContents().add(purchaseOrder2);
+ res.getContents().add(supplier2);
+ purchaseOrder2.setSupplier(supplier2);
+
+ assertEquals(supplier2, purchaseOrder2.cdoRevision().getData().get(purchaseOrder_Supplier, 0));
+ assertEquals(purchaseOrder2, supplier2.cdoRevision().getData().get(supplier_PurchaseOrder, 0));
+
+ msg("Committing");
+ transaction1.commit();
+
+
+ assertEquals(supplier2.cdoID(), purchaseOrder2.cdoRevision().getData().get(purchaseOrder_Supplier, 0));
+ assertEquals(purchaseOrder2.cdoID(), supplier2.cdoRevision().getData().get(supplier_PurchaseOrder, 0));
+
+ assertEquals(supplier.cdoID(), purchaseOrder.cdoRevision().getData().get(purchaseOrder_Supplier, 0));
+ assertEquals(purchaseOrder.cdoID(), supplier.cdoRevision().getData().get(supplier_PurchaseOrder, 0));
+
+ msg("Test set with persisted CDOID");
+ PurchaseOrder purchaseOrder3 = Model1Factory.eINSTANCE.createPurchaseOrder();
+ purchaseOrder3.setSupplier(supplier2);
+ res.getContents().add(purchaseOrder3);
+
+ assertEquals(supplier2.cdoID(), purchaseOrder3.cdoRevision().getData().get(purchaseOrder_Supplier, 0));
+ assertEquals(purchaseOrder3, supplier2.cdoRevision().getData().get(supplier_PurchaseOrder, 1));
+
+ msg("Committing");
+ transaction1.commit();
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/store/logic/TestLogic.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/store/logic/TestLogic.java
index 6ff3df60ca..3f4be3aa8f 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/store/logic/TestLogic.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/store/logic/TestLogic.java
@@ -10,6 +10,7 @@
**************************************************************************/
package org.eclipse.emf.cdo.tests.store.logic;
+import org.eclipse.emf.cdo.common.CDOProtocolView;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.id.CDOIDMetaRange;
import org.eclipse.emf.cdo.common.id.CDOIDTemp;
@@ -26,7 +27,8 @@ import org.eclipse.emf.cdo.internal.common.revision.CDORevisionImpl;
import org.eclipse.emf.cdo.internal.server.Repository;
import org.eclipse.emf.cdo.internal.server.Session;
import org.eclipse.emf.cdo.internal.server.Transaction;
-import org.eclipse.emf.cdo.internal.server.Transaction.TransactionPackageManager;
+import org.eclipse.emf.cdo.internal.server.Transaction.InternalCommitContext;
+import org.eclipse.emf.cdo.internal.server.TransactionCommitContextImpl.TransactionPackageManager;
import org.eclipse.emf.cdo.internal.server.protocol.CDOServerProtocol;
import org.eclipse.emf.cdo.server.IStore;
import org.eclipse.emf.cdo.server.IRepository.Props;
@@ -181,20 +183,22 @@ public abstract class TestLogic extends AbstractOMTest
{
private int viewID;
- private long timeStamp;
-
private CDOServerProtocol protocol;
private Session session;
private Transaction transaction;
+ private InternalCommitContext transactionCommitContext;
+
private List<CDOPackage> newPackages = new ArrayList<CDOPackage>();
private List<CDORevision> newObjects = new ArrayList<CDORevision>();
private List<CDORevisionDelta> dirtyObjectDeltas = new ArrayList<CDORevisionDelta>();
+ private List<CDOID> detachedObjects = new ArrayList<CDOID>();
+
public CommitTemplate()
{
this(1, 12345);
@@ -203,12 +207,12 @@ public abstract class TestLogic extends AbstractOMTest
public CommitTemplate(int viewID, long timeStamp)
{
this.viewID = viewID;
- this.timeStamp = timeStamp;
protocol = createProtocol();
session = repository.getSessionManager().openSession(protocol, true);
protocol.setInfraStructure(session);
transaction = createTransaction(session);
- transaction.preCommit();
+ transactionCommitContext = transaction.createCommitContext(timeStamp);
+ transactionCommitContext.preCommit();
}
public Session getSession()
@@ -218,8 +222,13 @@ public abstract class TestLogic extends AbstractOMTest
public Transaction run() throws Exception
{
- transaction.commit(getNewPackages(), getNewObjects(), getDirtyObjectDeltas());
- transaction.postCommit(true);
+ transactionCommitContext.setNewPackages(getNewPackages());
+ transactionCommitContext.setNewObjects(getNewObjects());
+ transactionCommitContext.setDirtyObjectDeltas(getDirtyObjectDeltas());
+ transactionCommitContext.setDetachedObjects(getDetachedObjects());
+ transactionCommitContext.write();
+ transactionCommitContext.commit();
+ transactionCommitContext.postCommit(true);
return transaction;
}
@@ -247,7 +256,7 @@ public abstract class TestLogic extends AbstractOMTest
idRange = CDOSessionImpl.registerEPackage(ePackage, 1, null, null);
}
- TransactionPackageManager packageManager = transaction.getPackageManager();
+ TransactionPackageManager packageManager = transactionCommitContext.getPackageManager();
CDOPackage newPackage = CDOModelUtil.createPackage(packageManager, uri, name, ecore, dynamic, idRange, parentURI);
ModelUtil.initializeCDOPackage(ePackage, newPackage);
packageManager.addPackage(newPackage);
@@ -264,8 +273,10 @@ public abstract class TestLogic extends AbstractOMTest
public Revision addNewObject(int id, EClass eClass)
{
+
String uri = eClass.getEPackage().getNsURI();
- CDOPackage cdoPackage = transaction.getPackageManager().lookupPackage(uri);
+
+ CDOPackage cdoPackage = transactionCommitContext.getPackageManager().lookupPackage(uri);
CDOClass cdoClass = cdoPackage.lookupClass(eClass.getClassifierID());
return addRevision(id, cdoClass);
}
@@ -290,7 +301,7 @@ public abstract class TestLogic extends AbstractOMTest
protected Transaction createTransaction(Session session)
{
- return session.openTransaction(viewID, timeStamp);
+ return (Transaction)session.openView(viewID, CDOProtocolView.Type.TRANSACTION);
}
private CDOPackage[] getNewPackages()
@@ -307,6 +318,11 @@ public abstract class TestLogic extends AbstractOMTest
{
return dirtyObjectDeltas.toArray(new CDORevisionDelta[dirtyObjectDeltas.size()]);
}
+
+ private CDOID[] getDetachedObjects()
+ {
+ return detachedObjects.toArray(new CDOID[detachedObjects.size()]);
+ }
}
/**

Back to the top