blob: 8cd3eff4768da0e17ba0658cdb34080c29fb4f46 [file] [log] [blame]
/*
* Copyright (c) 2011-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:
* Egidijus Vaishnora - initial API and implementation
* Caspar De Groot - initial API and implementation
*/
package org.eclipse.emf.cdo.tests.bugzilla;
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.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.util.EcoreUtil;
/**
* @author Egidijus Vaishnora, Caspar De Groot
*/
public class Bugzilla_333950_Test extends AbstractCDOTest
{
public void testOpposites() throws Exception
{
EPackage pkg = null;
{
// create ECore metamodel. Major aspect is to create two classes, which has linked opposite EReferences and one of
// reference is not persistence
pkg = createUniquePackage();
EClass customClassA = EcoreFactory.eINSTANCE.createEClass();
customClassA.setName("A");
pkg.getEClassifiers().add(customClassA);
EClass customClassB = EcoreFactory.eINSTANCE.createEClass();
customClassB.setName("B");
pkg.getEClassifiers().add(customClassB);
createOpposites(customClassA, customClassB);
}
{
// create model and commit it
CDOSession openSession = openSession();
CDOTransaction openTransaction = openSession.openTransaction();
CDOResource createResource = openTransaction.createResource(getResourcePath("test"));
EClass classAClass = (EClass)pkg.getEClassifier("A");
EClass classBClass = (EClass)pkg.getEClassifier("B");
EObject instanceA = EcoreUtil.create(classAClass);
EObject instanceB = EcoreUtil.create(classBClass);
EStructuralFeature eStructuralFeatureA = classAClass.getEStructuralFeature("AB");
EStructuralFeature eStructuralFeatureB = instanceB.eClass().getEStructuralFeature("_AB");
instanceA.eSet(eStructuralFeatureA, instanceB);
assertEquals(instanceA, instanceB.eGet(eStructuralFeatureB));
createResource.getContents().add(instanceA);
createResource.getContents().add(instanceB);
openTransaction.commit();
assertEquals(true, eStructuralFeatureB.isTransient());
assertEquals(instanceA, instanceB.eGet(eStructuralFeatureB));
System.out.println("---> instanceA: " + CDOUtil.getCDOObject(instanceA).cdoID());
System.out.println("---> instanceB: " + CDOUtil.getCDOObject(instanceB).cdoID());
openSession.close();
}
// open committed model and validate if transient opposite reference is available
CDOSession openSession2 = openSession();
CDOTransaction openTransaction2 = openSession2.openTransaction();
CDOResource resource = openTransaction2.getResource(getResourcePath("test"));
EObject eObjectA = resource.getContents().get(0);
EObject eObjectB = resource.getContents().get(1);
EStructuralFeature eStructuralFeatureA = eObjectA.eClass().getEStructuralFeature("AB");
assertEquals(false, eStructuralFeatureA.isTransient());
assertEquals(eObjectB, eObjectA.eGet(eStructuralFeatureA));
EStructuralFeature eStructuralFeatureB = eObjectB.eClass().getEStructuralFeature("_AB");
assertEquals(true, eStructuralFeatureB.isTransient());
assertEquals(eObjectA, eObjectB.eGet(eStructuralFeatureB));
}
private void createOpposites(EClass A, EClass B)
{
EReference tmpRefA_B = EcoreFactory.eINSTANCE.createEReference();
tmpRefA_B.setName(A.getName() + B.getName());
A.getEStructuralFeatures().add(tmpRefA_B);
tmpRefA_B.setEType(B);
EReference tmpRefB_A = EcoreFactory.eINSTANCE.createEReference();
tmpRefB_A.setTransient(true);
tmpRefB_A.setName("_" + tmpRefA_B.getName());
B.getEStructuralFeatures().add(tmpRefB_A);
tmpRefB_A.setEType(A);
tmpRefA_B.setEOpposite(tmpRefB_A);
tmpRefB_A.setEOpposite(tmpRefA_B);
assertSame(tmpRefA_B, tmpRefB_A.getEOpposite());
}
}