/* * Copyright (c) 2010-2012, 2014 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.CDOState; 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.model4.ContainedElementNoOpposite; import org.eclipse.emf.cdo.tests.model4.RefMultiNonContainedNPL; import org.eclipse.emf.cdo.tests.model4.RefSingleNonContainedNPL; 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.EReference; import org.eclipse.emf.ecore.util.EcoreUtil; /** * See bug 298561 * * @author Eike Stepper */ public class Bugzilla_298561_Test extends AbstractCDOTest { private static String RESOURCENAME = "/r1"; public void testNew() throws CommitException { CDOSession session = openSession(); session.options().setPassiveUpdateEnabled(false); session.getPackageRegistry().putEPackage(getModel4Package()); CDOTransaction tx = session.openTransaction(); CDOResource r1 = tx.createResource(getResourcePath(RESOURCENAME)); // Create referencee and store it ContainedElementNoOpposite referencee = getModel4Factory().createContainedElementNoOpposite(); r1.getContents().add(referencee); tx.commit(); // Create referencer, don't store it -- keep it as NEW RefSingleNonContainedNPL referencer = getModel4Factory().createRefSingleNonContainedNPL(); r1.getContents().add(referencer); referencer.setElement(referencee); assertEquals(CDOState.NEW, CDOUtil.getCDOObject(referencer).cdoState()); // Delete the referencee in 2nd session doSecondSession(); // Refresh session.refresh(); EReference ref = getModel4Package().getRefSingleNonContainedNPL_Element(); boolean isSet = referencer.eIsSet(ref); if (isSet) { assertNull(referencer.getElement()); } } public void testDirty() throws CommitException { CDOSession session = openSession(); session.options().setPassiveUpdateEnabled(false); session.getPackageRegistry().putEPackage(getModel4Package()); CDOTransaction tx = session.openTransaction(); CDOResource r1 = tx.createResource(getResourcePath(RESOURCENAME)); // Create referencee and referencer (but no reference yet), and store them ContainedElementNoOpposite referencee = getModel4Factory().createContainedElementNoOpposite(); r1.getContents().add(referencee); RefSingleNonContainedNPL referencer = getModel4Factory().createRefSingleNonContainedNPL(); r1.getContents().add(referencer); tx.commit(); // Create the reference, making the referencer dirty referencer.setElement(referencee); assertEquals(CDOState.DIRTY, CDOUtil.getCDOObject(referencer).cdoState()); // Delete the referencee in 2nd session doSecondSession(); // Refresh session.refresh(); boolean isSet = referencer.eIsSet(getModel4Package().getRefSingleNonContainedNPL_Element()); if (isSet) { assertNull(referencer.getElement()); } } public void testNewMulti() throws CommitException { CDOSession session = openSession(); session.options().setPassiveUpdateEnabled(false); session.getPackageRegistry().putEPackage(getModel4Package()); CDOTransaction tx = session.openTransaction(); CDOResource r1 = tx.createResource(getResourcePath(RESOURCENAME)); // Create referencee and store it ContainedElementNoOpposite referencee = getModel4Factory().createContainedElementNoOpposite(); r1.getContents().add(referencee); tx.commit(); // Create referencer, don't store it -- keep it as NEW RefMultiNonContainedNPL referencer = getModel4Factory().createRefMultiNonContainedNPL(); r1.getContents().add(referencer); referencer.getElements().add(referencee); assertEquals(CDOState.NEW, CDOUtil.getCDOObject(referencer).cdoState()); // Delete the referencee in 2nd session doSecondSession(); // Refresh session.refresh(); boolean isSet = referencer.eIsSet(getModel4Package().getRefMultiNonContainedNPL_Elements()); if (isSet && referencer.getElements().size() > 0) { assertNull(referencer.getElements().get(0)); } } public void testDirtyMulti() throws CommitException { CDOSession session = openSession(); session.options().setPassiveUpdateEnabled(false); session.getPackageRegistry().putEPackage(getModel4Package()); CDOTransaction tx = session.openTransaction(); CDOResource r1 = tx.createResource(getResourcePath(RESOURCENAME)); // Create referencee and referencer (but no reference yet), and store them ContainedElementNoOpposite referencee = getModel4Factory().createContainedElementNoOpposite(); r1.getContents().add(referencee); RefMultiNonContainedNPL referencer = getModel4Factory().createRefMultiNonContainedNPL(); r1.getContents().add(referencer); tx.commit(); // Create the reference, making the referencer dirty referencer.getElements().add(referencee); assertEquals(CDOState.DIRTY, CDOUtil.getCDOObject(referencer).cdoState()); // Delete the referencee in 2nd session doSecondSession(); // Refresh session.refresh(); boolean isSet = referencer.eIsSet(getModel4Package().getRefMultiNonContainedNPL_Elements()); if (isSet && referencer.getElements().size() > 0) { assertNull(referencer.getElements().get(0)); } } private void doSecondSession() throws CommitException { CDOSession session = openSession(); CDOTransaction tx = session.openTransaction(); CDOResource r1 = tx.getResource(getResourcePath(RESOURCENAME)); ContainedElementNoOpposite referencee = (ContainedElementNoOpposite)r1.getContents().get(0); EcoreUtil.delete(referencee); tx.commit(); session.close(); } }