diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.tests.objectivity/src/org/eclipse/emf/cdo/tests/objectivity/ObjyExternalReferenceTest.java')
-rw-r--r-- | plugins/org.eclipse.emf.cdo.tests.objectivity/src/org/eclipse/emf/cdo/tests/objectivity/ObjyExternalReferenceTest.java | 398 |
1 files changed, 398 insertions, 0 deletions
diff --git a/plugins/org.eclipse.emf.cdo.tests.objectivity/src/org/eclipse/emf/cdo/tests/objectivity/ObjyExternalReferenceTest.java b/plugins/org.eclipse.emf.cdo.tests.objectivity/src/org/eclipse/emf/cdo/tests/objectivity/ObjyExternalReferenceTest.java new file mode 100644 index 0000000000..c3ffa79410 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.tests.objectivity/src/org/eclipse/emf/cdo/tests/objectivity/ObjyExternalReferenceTest.java @@ -0,0 +1,398 @@ +/** + * Copyright (c) 2004 - 2010 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Simon McDuff - initial API and implementation + * Eike Stepper - maintenance + */ +package org.eclipse.emf.cdo.tests.objectivity; + +import org.eclipse.emf.cdo.eresource.CDOResource; +import org.eclipse.emf.cdo.session.CDOSession; +import org.eclipse.emf.cdo.tests.AbstractCDOTest; +import org.eclipse.emf.cdo.tests.model1.Company; +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.transaction.CDOTransaction; +import org.eclipse.emf.cdo.transaction.CDOXATransaction; +import org.eclipse.emf.cdo.util.CDOUtil; +import org.eclipse.emf.cdo.util.DanglingReferenceException; +import org.eclipse.emf.cdo.view.CDOViewSet; + +import org.eclipse.net4j.util.transaction.TransactionException; + +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.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.util.EcoreUtil; +import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; + +/** + * @author Simon McDuff + */ +public class ObjyExternalReferenceTest extends AbstractCDOTest +{ + final static public String REPOSITORY2_NAME = "repo2"; + + public void testExternalWithDynamicEObject() throws Exception + { + { + ResourceSet resourceSet = new ResourceSetImpl(); + resourceSet.getResourceFactoryRegistry().getProtocolToFactoryMap().put("test", new XMIResourceFactoryImpl()); + + CDOSession sessionA = openSession(); + sessionA.getPackageRegistry().putEPackage(getModel4InterfacesPackage()); + sessionA.getPackageRegistry().putEPackage(getModel4Package()); + CDOTransaction transactionA1 = sessionA.openTransaction(resourceSet); + + CDOResource resA = transactionA1.createResource("/resA"); + Resource resD = resourceSet.createResource(URI.createURI("test://1")); + + EPackage schoolPackage = createDynamicEPackage(); + resourceSet.getPackageRegistry().put(schoolPackage.getNsURI(), schoolPackage); + + EClass eClass = (EClass)schoolPackage.getEClassifier("SchoolBook"); + EObject schoolbook = EcoreUtil.create(eClass); + + GenRefSingleNonContained objectFromResA = getModel4Factory().createGenRefSingleNonContained(); + objectFromResA.setElement(schoolbook); + resD.getContents().add(schoolbook); + + resA.getContents().add(objectFromResA); + transactionA1.commit(); + } + } + + public void testExternalWithEClass() throws Exception + { + { + ResourceSet resourceSet = new ResourceSetImpl(); + + CDOSession sessionA = openSession(); + sessionA.getPackageRegistry().putEPackage(getModel4InterfacesPackage()); + sessionA.getPackageRegistry().putEPackage(getModel4Package()); + CDOTransaction transactionA1 = sessionA.openTransaction(resourceSet); + + CDOResource resA = transactionA1.createResource("/resA"); + GenRefSingleNonContained objectFromResA = getModel4Factory().createGenRefSingleNonContained(); + objectFromResA.setElement(getModel1Package().getAddress()); + resA.getContents().add(objectFromResA); + transactionA1.commit(); + } + + clearCache(getRepository().getRevisionManager()); + + { + CDOSession sessionA = openSession(); + ResourceSet resourceSet = new ResourceSetImpl(); + resourceSet.getPackageRegistry().put(getModel1Package().getNsURI(), getModel1Package()); + + CDOTransaction transactionA1 = sessionA.openTransaction(resourceSet); + CDOResource resA = transactionA1.getResource("/resA"); + + GenRefSingleNonContained objectFromResA = (GenRefSingleNonContained)resA.getContents().get(0); + assertEquals(getModel1Package().getAddress(), objectFromResA.getElement()); + transactionA1.commit(); + } + } + + public void testExternalWithEPackage() throws Exception + { + { + CDOSession sessionA = openSession(); + + ResourceSet resourceSet = new ResourceSetImpl(); + + sessionA.getPackageRegistry().putEPackage(getModel4Package()); + sessionA.getPackageRegistry().putEPackage(getModel4InterfacesPackage()); + + CDOTransaction transactionA1 = sessionA.openTransaction(resourceSet); + CDOResource resA = transactionA1.createResource("/resA"); + GenRefSingleNonContained objectFromResA = getModel4Factory().createGenRefSingleNonContained(); + objectFromResA.setElement(getModel1Package()); + resA.getContents().add(objectFromResA); + transactionA1.commit(); + } + + clearCache(getRepository().getRevisionManager()); + { + CDOSession sessionA = openSession(); + + ResourceSet resourceSet = new ResourceSetImpl(); + resourceSet.getPackageRegistry().put(getModel1Package().getNsURI(), getModel1Package()); + + CDOTransaction transactionA1 = sessionA.openTransaction(resourceSet); + CDOResource resA = transactionA1.getResource("/resA"); + + GenRefSingleNonContained objectFromResA = (GenRefSingleNonContained)resA.getContents().get(0); + assertEquals(getModel1Package(), objectFromResA.getElement()); + transactionA1.commit(); + } + } + + public void testOneXMIResourceManyViewsOnOneResourceSet() throws Exception + { + return; + + /* + byte[] dataOfresD = null; + getRepository(REPOSITORY2_NAME); + + { + CDOSession sessionA = openSession(); + CDOSession sessionB = openSession(REPOSITORY2_NAME); + ResourceSet resourceSet = new ResourceSetImpl(); + resourceSet.getResourceFactoryRegistry().getProtocolToFactoryMap().put("test", new XMIResourceFactoryImpl()); + + sessionA.getPackageRegistry().putEPackage(getModel1Package()); + sessionA.getPackageRegistry().putEPackage(Model2Package.eINSTANCE); + sessionB.getPackageRegistry().putEPackage(getModel1Package()); + 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"); + + EList<Resource> resources = resourceSet.getResources(); + assertEquals(4, resources.size()); + + CDOResource resC = transactionA1.createResource("/resC"); + assertNotNull(resC); + assertEquals(5, resources.size()); + + Resource resD = resourceSet.createResource(URI.createURI("test://1")); + assertEquals(6, resources.size()); + assertEquals(false, resD instanceof CDOResource); + + Company companyA = getModel1Factory().createCompany(); + companyA.setName("VALUEA"); + + Company companyB = getModel1Factory().createCompany(); + companyB.setName("VALUEB"); + + Company companyD = getModel1Factory().createCompany(); + companyD.setName("VALUED"); + + resD.getContents().add(companyD); + resA.getContents().add(companyA); + resB.getContents().add(companyB); + + Supplier supplier = getModel1Factory().createSupplier(); + PurchaseOrder purchaseOrder = getModel1Factory().createPurchaseOrder(); + + supplier.getPurchaseOrders().add(purchaseOrder); + resD.getContents().add(supplier); + resA.getContents().add(purchaseOrder); + + CDOXATransaction transSet = CDOUtil.createXATransaction(); + + transSet.add(CDOUtil.getViewSet(resourceSet)); + + transactionA1.commit(); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + resD.save(outputStream, null); + dataOfresD = outputStream.toByteArray(); + } + + clearCache(getRepository().getRevisionManager()); + + { + 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(getModel1Package().getNsURI(), getModel1Package()); + resourceSet.getResourceFactoryRegistry().getProtocolToFactoryMap().put("test", new XMIResourceFactoryImpl()); + + Resource resD = resourceSet.createResource(URI.createURI("test://1")); + resD.load(new ByteArrayInputStream(dataOfresD), null); + + 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, CDOUtil.getCDOObject(pO).cdoView()); + assertEquals(supplierD, pO.getSupplier()); + } + */ + } + + public void testManyViewsOnOneResourceSet() throws Exception + { + /* + getRepository(REPOSITORY2_NAME); + + { + CDOSession sessionA = openSession(); + sessionA.getPackageRegistry().putEPackage(getModel1Package()); + + CDOSession sessionB = openSession(REPOSITORY2_NAME); + + ResourceSet resourceSet = new ResourceSetImpl(); + CDOTransaction transactionA1 = sessionA.openTransaction(resourceSet); + CDOTransaction transactionB1 = sessionB.openTransaction(resourceSet); + + CDOResource resA = transactionA1.createResource("/resA"); + CDOResource resB = transactionB1.createResource("/resB"); + + Supplier supplier = getModel1Factory().createSupplier(); + PurchaseOrder purchaseOrder = getModel1Factory().createPurchaseOrder(); + + supplier.getPurchaseOrders().add(purchaseOrder); + resB.getContents().add(supplier); + resA.getContents().add(purchaseOrder); + + CDOXATransaction transSet = CDOUtil.createXATransaction(); + transSet.add(CDOUtil.getViewSet(resourceSet)); + + transactionA1.commit(); + } + + clearCache(getRepository().getRevisionManager()); + + { + 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, CDOUtil.getCDOObject(pO).cdoView()); + + assertEquals(transactionB, CDOUtil.getCDOObject(supplierB).cdoView()); + + assertEquals(supplierB, pO.getSupplier()); + assertEquals(supplierB.getPurchaseOrders().get(0), pO); + } + */ + } + + public void testObjectNotAttached() throws Exception + { + msg("Opening session"); + CDOSession session = openSession(); + + msg("Opening transaction"); + CDOTransaction transaction = session.openTransaction(); + + msg("Creating resource"); + CDOResource resource1 = transaction.createResource("/test1"); + + msg("Adding company"); + Supplier supplier = getModel1Factory().createSupplier(); + PurchaseOrder purchaseOrder = getModel1Factory().createPurchaseOrder(); + supplier.getPurchaseOrders().add(purchaseOrder); + + resource1.getContents().add(supplier); + + try + { + msg("Committing"); + transaction.commit(); + fail("TransactionException expected"); + } + catch (TransactionException success) + { + assertEquals(true, success.getCause() instanceof DanglingReferenceException); + assertSame(purchaseOrder, ((DanglingReferenceException)success.getCause()).getTarget()); + } + } + + public void testUsingObjectsBetweenSameTransaction() throws Exception + { + msg("Opening session"); + CDOSession session = openSession(); + + msg("Opening transaction"); + CDOTransaction transaction1 = session.openTransaction(); + CDOTransaction transaction2 = session.openTransaction(); + + msg("Creating resource"); + CDOResource resource1 = transaction1.createResource("/test1"); + CDOResource resource2 = transaction2.createResource("/test2"); + + msg("Adding company"); + Supplier supplier = getModel1Factory().createSupplier(); + PurchaseOrder purchaseOrder = getModel1Factory().createPurchaseOrder(); + supplier.getPurchaseOrders().add(purchaseOrder); + + resource1.getContents().add(supplier); + resource2.getContents().add(purchaseOrder); + + msg("Committing"); + transaction1.commit(); + } + + 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; + } +} |