blob: ef8b5951fd11d250be1dbf47306716a6208232ee [file] [log] [blame]
/*
* Copyright (c) 2009-2013 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:
* Gonzague Reydet - initial API and implementation
*/
package org.eclipse.emf.cdo.tests;
import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta;
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.OrderDetail;
import org.eclipse.emf.cdo.tests.model1.PurchaseOrder;
import org.eclipse.emf.cdo.tests.model1.Supplier;
import org.eclipse.emf.cdo.transaction.CDOPushTransaction;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CommitException;
import org.eclipse.emf.cdo.util.ObjectNotFoundException;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.net4j.util.WrappedException;
import org.eclipse.net4j.util.om.OMPlatform;
import java.io.File;
import java.io.IOException;
import java.util.Date;
/**
* @author Gonzague Reydet
*/
public class PushTransactionTest extends AbstractCDOTest
{
private String resourcePath = "res1";
private String supplierName = "supplier0";
private File file;
@Override
protected void doSetUp() throws Exception
{
OMPlatform.INSTANCE.setDebugging(false);
super.doSetUp();
populateRepository();
}
@Override
protected void doTearDown() throws Exception
{
if (file != null)
{
file.delete();
}
super.doTearDown();
}
public void testUpdateExistingObject() throws Exception
{
String newName = "supplier" + System.currentTimeMillis();
{
msg("Open session & local transaction");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction);
file = pushTransaction.getFile();
CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath));
msg("Make a diff in existing element");
Supplier supplier = (Supplier)resource.getContents().get(0);
supplier.setName(newName);
msg("Commit");
pushTransaction.commit();
session.close();
}
{
msg("Reload previous local session");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction, file);
assertEquals(true, transaction.isDirty());
assertEquals(1, transaction.getRevisionDeltas().size());
push(transaction, pushTransaction);
session.close();
}
CDOSession session = openSession();
CDOView view = session.openView();
CDOResource resource = view.getResource(getResourcePath(resourcePath));
assertEquals(2, resource.getContents().size());
Supplier supplier = (Supplier)resource.getContents().get(0);
assertNotNull(supplier);
assertEquals(newName, supplier.getName());
}
public void testDeleteExistingObject() throws Exception
{
{
msg("Open session & local transaction");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction);
file = pushTransaction.getFile();
CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath));
msg("Remove an existing element");
Supplier supplier = (Supplier)resource.getContents().get(0);
resource.getContents().remove(supplier);
msg("Commit");
pushTransaction.commit();
session.close();
}
{
msg("Reload previous local session");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction, file);
assertEquals(true, transaction.isDirty());
assertEquals(1, transaction.getRevisionDeltas().size());
push(transaction, pushTransaction);
session.close();
}
CDOSession session = openSession();
CDOView view = session.openView();
CDOResource resource = view.getResource(getResourcePath(resourcePath));
assertEquals(1, resource.getContents().size());
}
public void testAddNewObjectInResource() throws Exception
{
{
msg("Open session & local transaction");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction);
file = pushTransaction.getFile();
CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath));
msg("Create a new element");
Supplier supplier = getModel1Factory().createSupplier();
supplier.setName("supplier" + System.currentTimeMillis());
resource.getContents().add(supplier);
msg("Commit");
pushTransaction.commit();
session.close();
}
{
msg("Reload previous local session");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction, file);
assertEquals(true, transaction.isDirty());
assertEquals(1, transaction.getRevisionDeltas().size());
CDORevisionDelta delta = transaction.getRevisionDeltas().values().iterator().next();
assertNotNull(delta);
push(transaction, pushTransaction);
session.close();
}
CDOSession session = openSession();
CDOView view = session.openView();
CDOResource resource = view.getResource(getResourcePath(resourcePath));
assertEquals(3, resource.getContents().size());
}
public void testAddNewObjectInObject() throws Exception
{
{
msg("Open session & local transaction");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction);
file = pushTransaction.getFile();
CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath));
msg("Create a new element");
Category category = getModel1Factory().createCategory();
Company company = (Company)resource.getContents().get(1);
company.getCategories().add(category);
msg("Commit");
pushTransaction.commit();
session.close();
}
{
msg("Reload previous local session");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction, file);
assertEquals(true, transaction.isDirty());
assertEquals(1, transaction.getRevisionDeltas().size());
CDORevisionDelta delta = transaction.getRevisionDeltas().values().iterator().next();
assertNotNull(delta);
push(transaction, pushTransaction);
session.close();
}
CDOSession session = openSession();
CDOView view = session.openView();
CDOResource resource = view.getResource(getResourcePath(resourcePath));
assertEquals(2, resource.getContents().size());
}
public void testAddNewObjectInObjectBetweenReloadAndPush() throws Exception
{
{
msg("Open session & local transaction");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction);
file = pushTransaction.getFile();
CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath));
msg("Create a new element");
Category category = getModel1Factory().createCategory();
Company company = (Company)resource.getContents().get(1);
company.getCategories().add(category);
msg("Commit");
pushTransaction.commit();
session.close();
}
{
msg("Reload previous local session");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction, file);
assertEquals(true, transaction.isDirty());
assertEquals(1, transaction.getRevisionDeltas().size());
CDORevisionDelta delta = transaction.getRevisionDeltas().values().iterator().next();
assertNotNull(delta);
msg("Create a new element");
Category category = getModel1Factory().createCategory();
CDOResource resource = transaction.getResource(getResourcePath(resourcePath));
resource.getContents().add(category);
msg("Commit");
pushTransaction.commit();
push(transaction, pushTransaction);
session.close();
}
CDOSession session = openSession();
CDOView view = session.openView();
CDOResource resource = view.getResource(getResourcePath(resourcePath));
assertEquals(3, resource.getContents().size());
}
public void testAddNewObjectInObjectTwiceBetweenReloadAndPush() throws Exception
{
{
msg("Open session & local transaction");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction);
file = pushTransaction.getFile();
CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath));
msg("Create a new element");
Category category = getModel1Factory().createCategory();
Company company = (Company)resource.getContents().get(1);
company.getCategories().add(category);
msg("Commit");
pushTransaction.commit();
session.close();
}
{
msg("Reload previous local session");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction, file);
assertEquals(true, transaction.isDirty());
assertEquals(1, transaction.getRevisionDeltas().size());
CDORevisionDelta delta = transaction.getRevisionDeltas().values().iterator().next();
assertNotNull(delta);
msg("Create a new element");
Category category = getModel1Factory().createCategory();
CDOResource resource = transaction.getResource(getResourcePath(resourcePath));
resource.getContents().add(category);
msg("Commit");
pushTransaction.commit();
msg("Create a new element");
category = getModel1Factory().createCategory();
resource.getContents().add(category);
msg("Commit");
pushTransaction.commit();
push(transaction, pushTransaction);
session.close();
}
CDOSession session = openSession();
CDOView view = session.openView();
CDOResource resource = view.getResource(getResourcePath(resourcePath));
assertEquals(4, resource.getContents().size());
}
public void testAddNewHierarchy() throws Exception
{
final String currentSupplierName = "supplier" + System.currentTimeMillis();
final Date orderDate = new Date();
final Float orderDetailPrice = 10.5F;
{
msg("Open session & local transaction");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction);
file = pushTransaction.getFile();
CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath));
msg("Create a new element");
Supplier supplier = getModel1Factory().createSupplier();
supplier.setName(currentSupplierName);
resource.getContents().add(supplier);
msg("Create a new child");
PurchaseOrder order = getModel1Factory().createPurchaseOrder();
order.setDate(orderDate);
supplier.getPurchaseOrders().add(order);
resource.getContents().add(order);
OrderDetail detail = getModel1Factory().createOrderDetail();
detail.setPrice(orderDetailPrice);
order.getOrderDetails().add(detail);
msg("Commit");
pushTransaction.commit();
session.close();
}
{
msg("Reload previous local session");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction, file);
assertEquals(true, transaction.isDirty());
assertEquals(1, transaction.getRevisionDeltas().size());
CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath));
assertEquals(4, resource.getContents().size());
push(transaction, pushTransaction);
session.close();
}
CDOSession session = openSession();
CDOView view = session.openView();
CDOResource resource = view.getResource(getResourcePath(resourcePath));
assertEquals(4, resource.getContents().size());
Supplier supplier = (Supplier)resource.getContents().get(2);
assertEquals(currentSupplierName, supplier.getName());
assertEquals(1, supplier.getPurchaseOrders().size());
PurchaseOrder order = supplier.getPurchaseOrders().get(0);
assertNotNull(order);
assertEquals(orderDate, order.getDate());
assertEquals(1, order.getOrderDetails().size());
OrderDetail detail = order.getOrderDetails().get(0);
assertNotNull(detail);
assertEquals(orderDetailPrice, detail.getPrice());
}
public void testMoveObject() throws Exception
{
{
msg("Open session & local transaction");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction);
file = pushTransaction.getFile();
CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath));
msg("Create a new elements");
Supplier supplier2 = getModel1Factory().createSupplier();
supplier2.setName("supplier" + System.currentTimeMillis());
resource.getContents().add(supplier2);
msg("Move first supplier");
Supplier supplier1 = (Supplier)resource.getContents().get(0);
resource.getContents().move(1, supplier1);
assertEquals(supplierName, ((Supplier)resource.getContents().get(1)).getName());
msg("Commit");
pushTransaction.commit();
session.close();
}
{
msg("Reload previous local session");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction, file);
assertEquals(true, transaction.isDirty());
CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath));
assertEquals(supplierName, ((Supplier)resource.getContents().get(1)).getName());
push(transaction, pushTransaction);
session.close();
}
CDOSession session = openSession();
CDOView view = session.openView();
CDOResource resource = view.getResource(getResourcePath(resourcePath));
assertEquals(supplierName, ((Supplier)resource.getContents().get(1)).getName());
}
public void testClearObjects() throws Exception
{
{
msg("Open session & local transaction");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction);
file = pushTransaction.getFile();
CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath));
msg("Create a new elements");
Supplier supplier2 = getModel1Factory().createSupplier();
supplier2.setName("supplier" + System.currentTimeMillis());
resource.getContents().add(supplier2);
msg("Clear contents");
resource.getContents().clear();
msg("Commit");
pushTransaction.commit();
session.close();
}
{
msg("Reload previous local session");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction, file);
assertEquals(true, transaction.isDirty());
CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath));
assertEquals(0, resource.getContents().size());
push(transaction, pushTransaction);
session.close();
}
CDOSession session = openSession();
CDOView view = session.openView();
CDOResource resource = view.getResource(getResourcePath(resourcePath));
assertEquals(0, resource.getContents().size());
}
public void testUnsetValue() throws Exception
{
{
msg("Open session & local transaction");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction);
file = pushTransaction.getFile();
CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath));
Supplier supplier = (Supplier)resource.getContents().get(0);
supplier.setName(null);
msg("Commit");
pushTransaction.commit();
session.close();
}
{
msg("Reload previous local session");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction, file);
assertEquals(true, transaction.isDirty());
CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath));
Supplier supplier = (Supplier)resource.getContents().get(0);
assertNull(supplier.getName());
push(transaction, pushTransaction);
session.close();
}
CDOSession session = openSession();
CDOView view = session.openView();
CDOResource resource = view.getResource(getResourcePath(resourcePath));
Supplier supplier = (Supplier)resource.getContents().get(0);
assertNull(supplier.getName());
}
public void testUnsetValueWithoutPushTX() throws Exception
{
{
msg("Open session & local transaction");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath));
Supplier supplier = (Supplier)resource.getContents().get(0);
supplier.setName(null);
msg("Commit");
transaction.commit();
session.close();
}
CDOSession session = openSession();
CDOView view = session.openView();
CDOResource resource = view.getResource(getResourcePath(resourcePath));
Supplier supplier = (Supplier)resource.getContents().get(0);
assertNull(supplier.getName());
}
public void testConflictWithRemovedObject() throws Exception
{
{
msg("Open session & local transaction");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction);
file = pushTransaction.getFile();
CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath));
msg("Make a diff in existing element");
Supplier supplier = (Supplier)resource.getContents().get(0);
supplier.setName(null);
msg("Commit");
pushTransaction.commit();
session.close();
}
{
msg("Open transaction & commit changes to repo");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath));
resource.getContents().remove(0);
transaction.commit();
session.close();
}
msg("Reload previous local session");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
try
{
openPushTransaction(transaction, file);
fail("ObjectNotFoundException expected");
}
catch (ObjectNotFoundException expected)
{
// SUCCESS
}
}
public void testConflictWithModifiedObject() throws Exception
{
{
msg("Open session & local transaction");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction);
file = pushTransaction.getFile();
CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath));
msg("Make a diff in existing element");
Supplier supplier = (Supplier)resource.getContents().get(0);
supplier.setName("" + System.currentTimeMillis());
msg("Commit");
pushTransaction.commit();
session.close();
}
{
msg("Open transaction & commit changes to repo");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.getOrCreateResource(getResourcePath(resourcePath));
Supplier supplier = (Supplier)resource.getContents().get(0);
supplier.setName("" + System.currentTimeMillis());
transaction.commit();
session.close();
}
msg("Reload previous local session");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOPushTransaction pushTransaction = openPushTransaction(transaction, file);
assertEquals(true, transaction.hasConflict());
try
{
pushTransaction.push();
fail("CommitException expected");
}
catch (CommitException expected)
{
// SUCCESS
}
}
protected CDOPushTransaction openPushTransaction(CDOTransaction transaction) throws IOException
{
return new CDOPushTransaction(transaction);
}
protected CDOPushTransaction openPushTransaction(CDOTransaction transaction, File file) throws IOException
{
return new CDOPushTransaction(transaction, file);
}
protected void push(CDOTransaction transaction, CDOPushTransaction pushTransaction) throws CommitException
{
msg("Publish previous modifications");
pushTransaction.push();
assertEquals(false, transaction.isDirty());
}
private void populateRepository()
{
msg("Populate the repository the classic way");
msg("Create resource");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath(resourcePath));
msg("Populate resource");
Supplier supplier0 = getModel1Factory().createSupplier();
supplier0.setName(supplierName);
resource.getContents().add(supplier0);
Company company0 = getModel1Factory().createCompany();
resource.getContents().add(company0);
try
{
msg("Commit");
transaction.commit();
}
catch (CommitException ex)
{
throw WrappedException.wrap(ex);
}
session.close();
}
}