blob: ba5096e0f8ba3e33d19ddec8e774483eae7bbed8 [file] [log] [blame]
/*
* Copyright (c) 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.bugzilla;
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.AbstractCDOTest;
import org.eclipse.emf.cdo.tests.model1.Company;
import org.eclipse.emf.cdo.tests.model1.PurchaseOrder;
import org.eclipse.emf.cdo.tests.model1.Supplier;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.net4j.util.concurrent.RWOLockManager;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import java.util.Collections;
/**
* @author Eike Stepper
*/
public class Bugzilla_385268_Test extends AbstractCDOTest
{
public void testDetachment() throws Exception
{
Supplier supplier = getModel1Factory().createSupplier();
PurchaseOrder purchaseOrder = getModel1Factory().createPurchaseOrder();
supplier.getPurchaseOrders().add(purchaseOrder);
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("test1"));
EList<EObject> contents = resource.getContents();
contents.add(supplier);
contents.add(purchaseOrder);
transaction.commit();
contents.remove(purchaseOrder);
assertDirty(supplier, transaction); // supplier must be dirty so that a posible ext-ref can be committed later.
}
public void testReattachment() throws Exception
{
Supplier supplier = getModel1Factory().createSupplier();
PurchaseOrder purchaseOrder = getModel1Factory().createPurchaseOrder();
supplier.getPurchaseOrders().add(purchaseOrder);
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("test1"));
EList<EObject> contents = resource.getContents();
contents.add(supplier);
contents.add(purchaseOrder);
transaction.commit();
contents.remove(purchaseOrder);
contents.add(purchaseOrder);
assertClean(supplier, transaction);
}
public void testReattachment2() throws Exception
{
System.err.println("\nMain");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("test1"));
Company company = getModel1Factory().createCompany();
Supplier supplier = getModel1Factory().createSupplier();
PurchaseOrder purchaseOrder = getModel1Factory().createPurchaseOrder();
EList<PurchaseOrder> purchaseOrders = company.getPurchaseOrders();
purchaseOrders.add(purchaseOrder);
supplier.getPurchaseOrders().add(purchaseOrder);
company.getSuppliers().add(supplier);
resource.getContents().add(company);
transaction.commit();
System.err.println("\nRemoteUser");
RemoteUser remoteUser = new RemoteUser();
remoteUser.changeSupplierAndLockIt();
System.err.println("\nMain");
for (int i = 0; i < 1000; i++)
{
purchaseOrders.clear();
purchaseOrders.add(purchaseOrder);
}
transaction.commit();
remoteUser.dispose();
}
/**
* @author Eike Stepper
*/
private final class RemoteUser
{
private CDOTransaction transaction;
private CDOResource resource;
public RemoteUser()
{
CDOSession session = openSession();
transaction = session.openTransaction();
resource = transaction.getResource(getResourcePath("test1"));
}
public void dispose()
{
transaction = null;
resource = null;
}
public void changeSupplierAndLockIt() throws InterruptedException
{
Company company = (Company)resource.getContents().get(0);
Supplier supplier = company.getSuppliers().get(0);
CDOObject cdoObject = CDOUtil.getCDOObject(supplier);
transaction.lockObjects(Collections.singleton(cdoObject), RWOLockManager.LockType.WRITE, DEFAULT_TIMEOUT);
}
}
}