blob: fecb0ace0e3a9e4f386e8131300d46261d327106 [file] [log] [blame]
/*
* Copyright (c) 2011, 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:
* Caspar De Groot - initial API and implementation
*/
package org.eclipse.emf.cdo.tests.bugzilla;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.common.revision.delta.CDOFeatureDelta;
import org.eclipse.emf.cdo.common.revision.delta.CDOListFeatureDelta;
import org.eclipse.emf.cdo.common.revision.delta.CDORemoveFeatureDelta;
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.AbstractCDOTest;
import org.eclipse.emf.cdo.tests.model1.Model1Factory;
import org.eclipse.emf.cdo.tests.model1.OrderDetail;
import org.eclipse.emf.cdo.tests.model1.SalesOrder;
import org.eclipse.emf.cdo.transaction.CDOConflictResolver2;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.cdo.util.CommitException;
import org.eclipse.net4j.util.collection.Pair;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author Caspar De Groot
*/
public class Bugzilla_336590_Test extends AbstractCDOTest
{
private CDOID removedID;
public void test() throws CommitException
{
CDOSession session = openSession();
session.options().setPassiveUpdateEnabled(false);
CDOTransaction tx = session.openTransaction();
tx.options().addConflictResolver(new TestResolver());
CDOResource resource = tx.createResource(getResourcePath("test"));
Model1Factory f = getModel1Factory();
SalesOrder order = f.createSalesOrder();
for (int i = 0; i < 3; i++)
{
order.getOrderDetails().add(f.createOrderDetail());
}
resource.getContents().add(order);
tx.commit();
for (int i = 0; i < 3; i++)
{
order.getOrderDetails().add(f.createOrderDetail());
}
OrderDetail newDetail = f.createOrderDetail();
order.getOrderDetails().add(newDetail);
System.out.println("---> New object: " + newDetail);
doRemovalInOtherSession();
session.refresh();
session.close();
}
private void doRemovalInOtherSession() throws CommitException
{
CDOSession session = openSession();
CDOTransaction tx = session.openTransaction();
CDOResource resource = tx.getResource(getResourcePath("test"));
SalesOrder order = (SalesOrder)resource.getContents().get(0);
OrderDetail removedDetail = order.getOrderDetails().get(0);
removedID = CDOUtil.getCDOObject(removedDetail).cdoID();
order.getOrderDetails().remove(0);
tx.commit();
session.close();
}
/**
* @author Caspar De Groot
*/
private class TestResolver implements CDOConflictResolver2
{
private CDOTransaction tx;
public CDOTransaction getTransaction()
{
return tx;
}
public void setTransaction(CDOTransaction transaction)
{
tx = transaction;
}
public void resolveConflicts(Set<CDOObject> conflicts)
{
throw new UnsupportedOperationException();
}
public void resolveConflicts(Map<CDOObject, Pair<CDORevision, CDORevisionDelta>> conflicts,
List<CDORevisionDelta> allRemoteDeltas)
{
assertEquals(1, allRemoteDeltas.size());
List<CDOFeatureDelta> fDeltas = allRemoteDeltas.get(0).getFeatureDeltas();
assertEquals(1, fDeltas.size());
CDOFeatureDelta fDelta = fDeltas.get(0);
assertEquals(true, fDelta instanceof CDOListFeatureDelta);
List<CDOFeatureDelta> listDeltas = ((CDOListFeatureDelta)fDelta).getListChanges();
for (CDOFeatureDelta lDelta : listDeltas)
{
System.out.println("---> listDelta: " + lDelta);
}
// Should find only 1 delta
assertEquals(1, listDeltas.size());
// And it should be a remove delta
CDOFeatureDelta lDelta = listDeltas.get(0);
assertEquals(true, lDelta instanceof CDORemoveFeatureDelta);
// And its value should be a CDOID
CDORemoveFeatureDelta removeDelta = (CDORemoveFeatureDelta)lDelta;
Object removedValue = removeDelta.getValue();
assertEquals(true, removedValue instanceof CDOID);
// And that CDOID should match the CDOID we kept when removing the
// object in the 2nd session
assertEquals(removedID.toString(), removedValue.toString());
}
}
}