/* * 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(); } }