/* * Copyright (c) 2012, 2016 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: * Christian W. Damus - initial API and implementation */ package org.eclipse.emf.cdo.tests.uml; import org.eclipse.emf.cdo.common.model.CDOPackageInfo; import org.eclipse.emf.cdo.common.model.CDOPackageUnit; 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.config.impl.ConfigTest.Requires; import org.eclipse.emf.cdo.tests.config.impl.ModelConfig; import org.eclipse.emf.cdo.transaction.CDOTransaction; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EFactory; 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.util.EcoreUtil; /** * Tests legacy-mode support for registered dynamic packages. This is not strictly a * UML-specific concern, but UML uses registered dynamic packages in profiles, so it * serves as a "control" test. */ @Requires(ModelConfig.CAPABILITY_LEGACY) public class LegacyDynamicPackageTest extends AbstractCDOTest { private final EPackage stuffPackage = EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/cdo/tests/schema/stuff/1.0"); private final EFactory originalStuffFactory = stuffPackage.getEFactoryInstance(); private final EClass thingClass = (EClass)stuffPackage.getEClassifier("Thing"); private final EClass propertyClass = (EClass)stuffPackage.getEClassifier("Property"); private final EClass worldClass = (EClass)stuffPackage.getEClassifier("World"); private final EAttribute thingName = (EAttribute)thingClass.getEStructuralFeature("name"); private final EReference thingProperties = (EReference)thingClass.getEStructuralFeature("properties"); private final EAttribute propertyName = (EAttribute)propertyClass.getEStructuralFeature("name"); private final EAttribute propertyIntrinsic = (EAttribute)propertyClass.getEStructuralFeature("intrinsic"); private final EReference worldProperties = (EReference)worldClass.getEStructuralFeature("propertiesOfThings"); private final EReference worldThings = (EReference)worldClass.getEStructuralFeature("things"); // // Test cases // public void testInstancesOfRegisteredDynamicPackage() throws Exception { CDOSession session = openSession(); session.getPackageRegistry().putEPackage(stuffPackage); // despite that it's registered, this is a dynamic package CDOPackageInfo info = session.getPackageRegistry().getPackageInfo(stuffPackage); CDOPackageUnit unit = info.getPackageUnit(); assertEquals(CDOPackageUnit.Type.DYNAMIC, unit.getOriginalType()); assertEquals(CDOPackageUnit.State.NEW, unit.getState()); final EFactory stuffFactory = stuffPackage.getEFactoryInstance(); EObject world = stuffFactory.create(worldClass); EObject colour = stuffFactory.create(propertyClass); colour.eSet(propertyName, "colour"); colour.eSet(propertyIntrinsic, true); EObject apple = stuffFactory.create(thingClass); apple.eSet(thingName, "apple"); list(apple, thingProperties).add(colour); list(world, worldProperties).add(colour); list(world, worldThings).add(apple); // keep an exact replica for later comparison, because 'world' will be owned by a transaction that has since closed final EObject oldWorld = EcoreUtil.copy(world); CDOTransaction transaction = session.openTransaction(); CDOResource res = transaction.createResource(getResourcePath("/world1.stuff")); res.getContents().add(world); transaction.commit(); // load the stuff again in a new session (hence new package registry) session.close(); session = openSession(); transaction = session.openTransaction(); res = transaction.getResource(getResourcePath("/world1.stuff"), true); assertEquals(true, res.isLoaded()); assertEquals(1, res.getContents().size()); EObject newWorld = res.getContents().get(0); EPackage newPackage = newWorld.eClass().getEPackage(); assertSame(stuffPackage, newPackage); // now the package is in loaded state info = session.getPackageRegistry().getPackageInfo(stuffPackage); unit = info.getPackageUnit(); assertEquals(CDOPackageUnit.Type.DYNAMIC, unit.getOriginalType()); assertEquals(CDOPackageUnit.State.LOADED, unit.getState()); // we correctly and completely loaded the model assertEquals(true, EcoreUtil.equals(oldWorld, newWorld)); } // // Test framework // @Override protected void doTearDown() throws Exception { // restore the factory replaced by CDO stuffPackage.setEFactoryInstance(originalStuffFactory); super.doTearDown(); } @SuppressWarnings("unchecked") private <T> EList<T> list(EObject owner, EStructuralFeature feature) { return (EList<T>)owner.eGet(feature); } }