From 65087f87d7d13b3d1b79f5aa3a0086e23a137d0b Mon Sep 17 00:00:00 2001 From: Simon McDuff Date: Thu, 11 Sep 2008 06:38:38 +0000 Subject: [213402] Support external references https://bugs.eclipse.org/bugs/show_bug.cgi?id=213402 --- .../org/eclipse/emf/cdo/tests/AbstractCDOTest.java | 9 +- .../src/org/eclipse/emf/cdo/tests/AllTests.java | 6 + .../eclipse/emf/cdo/tests/AutoAttacherTest.java | 1 + .../src/org/eclipse/emf/cdo/tests/ComplexTest.java | 36 ++- .../org/eclipse/emf/cdo/tests/ContainmentTest.java | 152 ++++++++++ .../src/org/eclipse/emf/cdo/tests/DetachTest.java | 274 +++++++++++++++++ .../emf/cdo/tests/ExternalReferenceTest.java | 334 +++++++++++++++++++++ .../src/org/eclipse/emf/cdo/tests/InitialTest.java | 53 +++- .../eclipse/emf/cdo/tests/InvalidationTest.java | 60 ++++ .../org/eclipse/emf/cdo/tests/ResourceTest.java | 156 ++++++++++ .../eclipse/emf/cdo/tests/RevisionHolderTest.java | 4 +- .../eclipse/emf/cdo/tests/StateMachineTest.java | 2 +- .../src/org/eclipse/emf/cdo/tests/ViewTest.java | 5 +- .../eclipse/emf/cdo/tests/XATransactionTest.java | 222 ++++++++++++++ .../cdo/tests/bugzilla/Bugzilla_246622_Test.java | 135 +++++++++ .../emf/cdo/tests/store/logic/TestLogic.java | 36 ++- 16 files changed, 1441 insertions(+), 44 deletions(-) create mode 100644 plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/DetachTest.java create mode 100644 plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ExternalReferenceTest.java create mode 100644 plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/XATransactionTest.java create mode 100644 plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_246622_Test.java (limited to 'plugins/org.eclipse.emf.cdo.tests/src') 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,9 +512,13 @@ public class ComplexTest extends AbstractCDOTest CDOTransaction transaction3 = session.openTransaction(); EList elements = transaction3.getResource(resource1path).getContents(); EList containers = transaction3.getResource(resource2path).getContents(); - - RefMultiContained container_work = (RefMultiContained)containers.get(0); + List elementToRemove = new ArrayList(); 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); @@ -553,13 +560,24 @@ public class ComplexTest extends AbstractCDOTest resource2.getContents().add(container); transaction2.commit(); - - EList elements = transaction2.getResource(resource1path).getContents(); - + CDOResource resource1FromTx2 = transaction2.getResource(resource1path); + EList elements = resource1FromTx2.getContents(); + List elementToRemove = new ArrayList(); 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 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 tobeRemoved = new ArrayList(); + 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 tobeRemoved = new ArrayList(); + 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 + *

+ * 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 newPackages = new ArrayList(); private List newObjects = new ArrayList(); private List dirtyObjectDeltas = new ArrayList(); + private List detachedObjects = new ArrayList(); + 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()]); + } } /** -- cgit v1.2.3