Skip to main content
summaryrefslogblamecommitdiffstats
blob: 60b79cffe00cd25bf74bc92a855bc1135aeebbbb (plain) (tree)
































































































































































                                                                                                        
/*
 * Copyright (c) 2004 - 2012 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:
 *    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();
  }
}

Back to the top