blob: 14af38241c6bef1524380f1f25e3480ada0b626a [file] [log] [blame]
/***************************************************************************
* Copyright (c) 2004 - 2008 Eike Stepper, Germany.
* 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;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.CDOSession;
import org.eclipse.emf.cdo.CDOSessionConfiguration;
import org.eclipse.emf.cdo.CDOTransaction;
import org.eclipse.emf.cdo.common.model.CDOPackage;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.tests.mango.Value;
import org.eclipse.emf.cdo.tests.model1.Company;
import org.eclipse.emf.cdo.tests.model1.PurchaseOrder;
import org.eclipse.emf.cdo.tests.model2.Model2Package;
import org.eclipse.emf.cdo.tests.model2.SpecialPurchaseOrder;
import org.eclipse.emf.cdo.tests.model3.Class1;
import org.eclipse.emf.cdo.tests.model3.Model3Package;
import org.eclipse.emf.cdo.tests.model3.subpackage.Class2;
import org.eclipse.emf.cdo.tests.model3.subpackage.SubpackageFactory;
import org.eclipse.emf.cdo.tests.model3.subpackage.SubpackagePackage;
import org.eclipse.emf.cdo.util.CDOPackageTypeRegistry;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.common.util.URI;
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.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl;
import java.io.IOException;
/**
* @author Eike Stepper
*/
public class PackageRegistryTest extends AbstractCDOTest
{
public void testGeneratedPackage() throws Exception
{
{
// Create resource in session 1
CDOSession session = openModel1Session();
CDOTransaction transaction = session.openTransaction();
CDOResource res = transaction.createResource("/res");
Company company = getModel1Factory().createCompany();
company.setName("Eike");
res.getContents().add(company);
transaction.commit();
}
{
// Load resource in session 2
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource res = transaction.getResource("/res");
Company company = (Company)res.getContents().get(0);
assertEquals("Eike", company.getName());
}
}
public void testCommitTwoPackages() throws Exception
{
{
CDOSession session = openSession();
session.getPackageRegistry().putEPackage(getModel1Package());
session.getPackageRegistry().putEPackage(Model2Package.eINSTANCE);
CDOTransaction transaction = session.openTransaction();
CDOResource res = transaction.createResource("/res");
SpecialPurchaseOrder specialPurchaseOrder = getModel2Factory().createSpecialPurchaseOrder();
specialPurchaseOrder.setDiscountCode("12345");
res.getContents().add(specialPurchaseOrder);
transaction.commit();
}
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource res = transaction.getResource("/res");
SpecialPurchaseOrder specialPurchaseOrder = (SpecialPurchaseOrder)res.getContents().get(0);
assertEquals("12345", specialPurchaseOrder.getDiscountCode());
}
}
public void testCommitUnrelatedPackage() throws Exception
{
{
CDOSession session = openModel1Session();
CDOTransaction transaction = session.openTransaction();
CDOResource res = transaction.createResource("/res");
PurchaseOrder purchaseOrder = getModel1Factory().createPurchaseOrder();
res.getContents().add(purchaseOrder);
transaction.commit();
session.close();
}
{
CDOSession session = openMangoSession();
CDOTransaction transaction = session.openTransaction();
CDOResource res = transaction.getResource("/res");
Value value = getMangoFactory().createValue();
value.setName("V0");
res.getContents().add(value);
transaction.commit();
session.close();
}
}
public void testCommitNestedPackages() throws Exception
{
CDOSession session = openSession();
assertEquals(0, session.getPackageRegistry().size());
try
{
session.getPackageRegistry().putEPackage(SubpackagePackage.eINSTANCE);
fail("IllegalArgumentException expected");
}
catch (IllegalArgumentException success)
{
}
session.close();
}
public void testCommitTopLevelPackages() throws Exception
{
CDOSession session = openSession();
assertEquals(0, session.getPackageRegistry().size());
session.getPackageRegistry().putEPackage(Model3Package.eINSTANCE);
assertEquals(2, session.getPackageRegistry().size());
CDOTransaction transaction = session.openTransaction();
CDOResource res = transaction.createResource("/res");
Class1 class1 = getModel3Factory().createClass1();
res.getContents().add(class1);
transaction.commit();
CDOPackage model3Package = session.getPackageManager().lookupPackage(Model3Package.eINSTANCE.getNsURI());
assertEquals(11, model3Package.getMetaIDRange().size());
assertNotNull(model3Package.getEcore());
CDOPackage subPackage = session.getPackageManager().lookupPackage(SubpackagePackage.eINSTANCE.getNsURI());
assertNull(subPackage.getMetaIDRange());
assertNull(subPackage.getEcore());
session.close();
}
public void testLoadNestedPackages() throws Exception
{
{
CDOSession session = openSession();
session.getPackageRegistry().putEPackage(Model3Package.eINSTANCE);
CDOTransaction transaction = session.openTransaction();
CDOResource res = transaction.createResource("/res");
Class1 class1 = getModel3Factory().createClass1();
res.getContents().add(class1);
transaction.commit();
session.close();
}
{
CDOSession session = openSession();
CDOPackage model3Package = session.getPackageManager().lookupPackage(Model3Package.eINSTANCE.getNsURI());
assertEquals(11, model3Package.getMetaIDRange().size());
assertNotNull(model3Package.getEcore());
CDOPackage subPackage = session.getPackageManager().lookupPackage(SubpackagePackage.eINSTANCE.getNsURI());
assertNull(subPackage.getMetaIDRange());
assertNull(subPackage.getEcore());
session.close();
}
}
public void testCommitCircularPackages() throws Exception
{
{
CDOSession session = openSession();
session.getPackageRegistry().putEPackage(Model3Package.eINSTANCE);
CDOTransaction transaction = session.openTransaction();
CDOResource res1 = transaction.createResource("/res1");
CDOResource res2 = transaction.createResource("/res2");
Class1 class1 = getModel3Factory().createClass1();
Class2 class2 = SubpackageFactory.eINSTANCE.createClass2();
class1.getClass2().add(class2);
res1.getContents().add(class1);
res2.getContents().add(class2);
transaction.commit();
session.close();
}
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource res1 = transaction.getResource("/res1");
Class1 class1 = (Class1)res1.getContents().get(0);
assertNotNull(class1);
Class2 class2 = class1.getClass2().get(0);
assertNotNull(class2);
}
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource res2 = transaction.getResource("/res2");
Class2 class2 = (Class2)res2.getContents().get(0);
assertNotNull(class2);
Class1 class1 = class2.getClass1().get(0);
assertNotNull(class1);
}
}
public void testEagerPackageRegistry() throws Exception
{
CDOPackageTypeRegistry.INSTANCE.register(getModel1Package());
{
// Create resource in session 1
CDOSessionConfiguration configuration = CDOUtil.createSessionConfiguration();
configuration.setConnector(getConnector());
configuration.setRepositoryName(REPOSITORY_NAME);
configuration.setEagerPackageRegistry();
CDOSession session = configuration.openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource res = transaction.createResource("/res");
Company company = getModel1Factory().createCompany();
company.setName("Eike");
res.getContents().add(company);
transaction.commit();
}
{
// Load resource in session 2
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource res = transaction.getResource("/res");
Company company = (Company)res.getContents().get(0);
assertEquals("Eike", company.getName());
}
}
public void testLazyPackageRegistry() throws Exception
{
CDOPackageTypeRegistry.INSTANCE.register(getModel1Package());
{
// Create resource in session 1
CDOSessionConfiguration configuration = CDOUtil.createSessionConfiguration();
configuration.setConnector(getConnector());
configuration.setRepositoryName(REPOSITORY_NAME);
configuration.setLazyPackageRegistry();
CDOSession session = configuration.openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource res = transaction.createResource("/res");
Company company = getModel1Factory().createCompany();
company.setName("Eike");
res.getContents().add(company);
transaction.commit();
}
{
// Load resource in session 2
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource res = transaction.getResource("/res");
Company company = (Company)res.getContents().get(0);
assertEquals("Eike", company.getName());
}
}
/**
* TODO Fix file loading under OSGi
*/
public void _testDynamicPackageFactory() throws Exception
{
{
EPackage model1 = loadModel("model1.ecore");
EClass companyClass = (EClass)model1.getEClassifier("Company");
EAttribute nameAttribute = (EAttribute)companyClass.getEStructuralFeature("name");
// Create resource in session 1
CDOSession session = openSession();
session.getPackageRegistry().putEPackage(model1);
CDOTransaction transaction = session.openTransaction();
CDOResource res = transaction.createResource("/res");
EFactory factory = model1.getEFactoryInstance();
EObject company = factory.create(companyClass);
company.eSet(nameAttribute, "Eike");
res.getContents().add(company);
transaction.commit();
}
{
// Load resource in session 2
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource res = transaction.getResource("/res");
CDOObject company = (CDOObject)res.getContents().get(0);
EClass companyClass = company.eClass();
EAttribute nameAttribute = (EAttribute)companyClass.getEStructuralFeature("name");
String name = (String)company.eGet(nameAttribute);
assertEquals("Eike", name);
}
}
/**
* TODO Fix file loading under OSGi
*/
public void _testDynamicPackageNewInstance() throws Exception
{
{
EPackage model1 = loadModel("model1.ecore");
EClass companyClass = (EClass)model1.getEClassifier("Company");
EAttribute nameAttribute = (EAttribute)companyClass.getEStructuralFeature("name");
// Create resource in session 1
CDOSession session = openSession();
session.getPackageRegistry().putEPackage(model1);
CDOTransaction transaction = session.openTransaction();
CDOResource res = transaction.createResource("/res");
CDOObject company = transaction.newInstance(companyClass);
company.eSet(nameAttribute, "Eike");
res.getContents().add(company);
transaction.commit();
}
{
// Load resource in session 2
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource res = transaction.getResource("/res");
CDOObject company = (CDOObject)res.getContents().get(0);
EClass companyClass = company.eClass();
EAttribute nameAttribute = (EAttribute)companyClass.getEStructuralFeature("name");
String name = (String)company.eGet(nameAttribute);
assertEquals("Eike", name);
}
}
private static EPackage loadModel(String fileName) throws IOException
{
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("*", new EcoreResourceFactoryImpl());
Resource resource = resourceSet.getResource(URI.createFileURI(fileName), true);
return (EPackage)resource.getContents().get(0);
}
}