blob: 0c4da91f0959c6868fcd9ca6938bb537ebf21758 [file] [log] [blame]
/*
* Copyright (c) 2007-2012 Eike Stepper (Loehne, 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.emf.cdo.tests;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.tests.model1.Category;
import org.eclipse.emf.cdo.tests.model1.Company;
import org.eclipse.emf.cdo.tests.model1.Product1;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.cdo.util.CommitException;
import org.eclipse.emf.ecore.EStructuralFeature;
/**
* @author Eike Stepper
*/
public class RollbackTest extends AbstractCDOTest
{
public void testRollbackSameSession() throws Exception
{
CDOSession session = openSession();
CDOTransaction transaction1 = session.openTransaction();
CDOTransaction transaction2 = session.openTransaction();
flow1(transaction1, transaction2);
}
public void testRollbackSeparateSession() throws Exception
{
// Client1
CDOSession session1 = openSession();
CDOTransaction transaction1 = session1.openTransaction();
// Client2
CDOSession session2 = openSession();
CDOTransaction transaction2 = session2.openTransaction();
flow1(transaction1, transaction2);
}
protected void flow1(CDOTransaction transaction1, CDOTransaction transaction2) throws CommitException
{
// Client1
CDOResource resource1 = transaction1.createResource(getResourcePath("/test1"));
Company company1 = getModel1Factory().createCompany();
resource1.getContents().add(company1);
Category category1 = getModel1Factory().createCategory();
company1.getCategories().add(category1);
long commitTime = transaction1.commit().getTimeStamp();
// Client2
transaction2.waitForUpdate(commitTime, DEFAULT_TIMEOUT);
CDOResource resource2 = transaction2.getResource(getResourcePath("/test1"));
Company company2 = (Company)resource2.getContents().get(0); // Infrequent exceptions in legacy mode
Category category2 = company2.getCategories().get(0);
category2.setName("client2");
Product1 product2 = getModel1Factory().createProduct1();
product2.setName("product2");
category2.getProducts().add(product2);
// Client1
category1.setName("client1");
Product1 product1 = getModel1Factory().createProduct1();
product1.setName("product1");
category1.getProducts().add(product1);
msg("Checking state of category");
CDOObject cdoObjectCategory1 = CDOUtil.getCDOObject(category1);
CDOObject cdoObjectProduct1 = CDOUtil.getCDOObject(product1);
msg("Object should contain internalEObject");
EStructuralFeature category_Products1 = getModel1Package().getCategory_Products();
Object testObject = cdoObjectCategory1.cdoRevision().data().get(category_Products1, 0);
assertEquals(product1, testObject);
commitTime = transaction1.commit().getTimeStamp();
msg("Object should contain CDOID");
testObject = cdoObjectCategory1.cdoRevision().data().get(category_Products1, 0);
assertEquals(cdoObjectProduct1.cdoID(), testObject);
transaction2.waitForUpdate(commitTime, DEFAULT_TIMEOUT);
// Client2
assertEquals(true, transaction2.isDirty());
assertEquals(true, transaction2.hasConflict());
try
{
commitTime = transaction2.commit().getTimeStamp();
fail("CommitException expected");
}
catch (CommitException ex)
{
// Commit process should no have changed state of the object
CDOObject cdoObjectCategory2 = CDOUtil.getCDOObject(category2);
EStructuralFeature category_Products2 = getModel1Package().getCategory_Products();
testObject = cdoObjectCategory2.cdoRevision().data().get(category_Products2, 0);
assertEquals(product2, testObject);
transaction2.rollback();
}
assertEquals(false, transaction2.isDirty());
assertEquals(false, transaction2.hasConflict());
assertEquals("client1", category2.getName());
category2.setName("client2");
commitTime = transaction2.commit().getTimeStamp();
assertEquals(false, transaction2.isDirty());
assertEquals(false, transaction2.hasConflict());
assertEquals("client2", category2.getName());
transaction1.waitForUpdate(commitTime, DEFAULT_TIMEOUT);
// Client1
assertEquals(false, transaction1.isDirty());
assertEquals(false, transaction1.hasConflict());
assertEquals("client2", category1.getName());
}
/**
* Bug 296680.
*/
public void test_Bugzilla_296680() throws Exception
{
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("/res"));
resource.getContents().add(getModel1Factory().createCompany());
transaction.commit();
session.close();
}
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.getResource(getResourcePath("/res"));
Company company = (Company)resource.getContents().get(0);
company.setName("MyCompany");
resource.getContents().add(getModel1Factory().createCompany());
transaction.setSavepoint();
resource.getContents().remove(1);
transaction.rollback();
session.close();
}
}