/*
* Copyright (c) 2010-2012, 2016 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.PurchaseOrder;
import org.eclipse.emf.cdo.tests.model1.Supplier;
import org.eclipse.emf.cdo.tests.model4.GenRefSingleNonContained;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.DanglingReferenceException;
import org.eclipse.net4j.util.transaction.TransactionException;
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;
/**
* @author Simon McDuff
*/
public class ObjyExternalReferenceTest extends AbstractCDOTest
{
static final 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;
}
}