blob: f81a33cac4a353b51335d076a06359bb3aed5390 [file] [log] [blame]
/***************************************************************************
* 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.PurchaseOrder;
import org.eclipse.emf.cdo.tests.model1.Supplier;
import org.eclipse.emf.cdo.tests.model4.GenRefSingleNonContained;
import org.eclipse.emf.cdo.tests.model4.model4Package;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.internal.cdo.CDOSessionImpl;
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
{
getRepository(REPOSITORY2_NAME);
CDOSession sessionA = openSession();
CDOSession sessionB = openSession(REPOSITORY2_NAME);
ResourceSet resourceSet = new ResourceSetImpl();
CDOXATransaction xaTransaction = CDOUtil.createXATransaction();
CDOSessionImpl.prepareResourceSet(resourceSet);
xaTransaction.add(CDOUtil.getViewSet(resourceSet));
sessionA.getPackageRegistry().putEPackage(getModel1Package());
sessionB.getPackageRegistry().putEPackage(getModel1Package());
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);
assertNew(resA, transactionA1);
assertNew(resB, transactionB1);
xaTransaction.rollback();
assertTransient(resA);
assertTransient(resB);
xaTransaction.commit();
}
public void testRollback_AfterSetpoint() throws Exception
{
getRepository(REPOSITORY2_NAME);
CDOSession sessionA = openSession();
CDOSession sessionB = openSession(REPOSITORY2_NAME);
ResourceSet resourceSet = new ResourceSetImpl();
CDOXATransaction xaTransaction = CDOUtil.createXATransaction();
CDOSessionImpl.prepareResourceSet(resourceSet);
xaTransaction.add(CDOUtil.getViewSet(resourceSet));
sessionA.getPackageRegistry().putEPackage(getModel1Package());
sessionB.getPackageRegistry().putEPackage(getModel1Package());
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);
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
{
getRepository(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 = getModel4Factory().createGenRefSingleNonContained();
GenRefSingleNonContained objectFromResB = getModel4Factory().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
{
getRepository(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 = getModel4Factory().createGenRefSingleNonContained();
GenRefSingleNonContained objectFromResB = getModel4Factory().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();
}
}
}