blob: 1737a2447c18ae097cb2c1227e5e1c37f9ed5821 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2018 Borland Software Corporation and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Borland Software Corporation - initial API and implementation
* Christopher Gerking - bugs 376274, 537041
*******************************************************************************/
package org.eclipse.m2m.tests.qvt.oml;
import java.io.IOException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EFactory;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.impl.EPackageRegistryImpl;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.m2m.internal.qvt.oml.compiler.CompilerUtils;
import org.eclipse.m2m.internal.qvt.oml.compiler.ProjectMetamodelRegistryProvider;
import org.eclipse.m2m.internal.qvt.oml.emf.util.EmfException;
import org.eclipse.m2m.internal.qvt.oml.emf.util.EmfUtilPlugin;
import org.eclipse.m2m.internal.qvt.oml.emf.util.URIUtils;
import org.eclipse.m2m.internal.qvt.oml.emf.util.mmregistry.IMetamodelDesc;
import org.eclipse.m2m.internal.qvt.oml.emf.util.mmregistry.IMetamodelRegistryProvider;
import org.eclipse.m2m.internal.qvt.oml.emf.util.mmregistry.MetamodelRegistry;
import org.eclipse.m2m.internal.qvt.oml.emf.util.urimap.MModelURIMapFactory;
import org.eclipse.m2m.internal.qvt.oml.emf.util.urimap.MappingContainer;
import org.eclipse.m2m.internal.qvt.oml.emf.util.urimap.MetamodelURIMappingHelper;
import org.eclipse.m2m.internal.qvt.oml.emf.util.urimap.URIMapping;
import org.eclipse.m2m.internal.qvt.oml.project.QVTOProjectPlugin;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import junit.framework.TestCase;
public class TestMetamodelRegistry extends TestCase {
private static final String METAMODEL_ID = "qvt.tests.metamodelID"; //$NON-NLS-1$
private static final URI platformTestModelURI = URI.createPlatformPluginURI("org.eclipse.m2m.tests.qvt.oml/models/javaless.ecore", false); //$NON-NLS-1$
private static final String NESTED_PACKAGE_NAME = "nested"; //$NON-NLS-1$
private TestProject myProject;
private URI testEcoreFileURI;
private MetamodelRegistry metamodelRegistry;
@Override
@Before
public void setUp() throws Exception {
myProject = new TestProject("MModelREgistryTest", new String[] {QVTOProjectPlugin.NATURE_ID}); //$NON-NLS-1$
Resource mappingResource = MetamodelURIMappingHelper.createMappingResource(myProject.getProject());
MappingContainer allMappings = MetamodelURIMappingHelper.createNewMappings(mappingResource);
URIMapping uriMapping = MModelURIMapFactory.eINSTANCE.createURIMapping();
uriMapping.setSourceURI(METAMODEL_ID);
URIMapping nestedUriMapping = MModelURIMapFactory.eINSTANCE.createURIMapping();
nestedUriMapping.setSourceURI(METAMODEL_ID + "." + NESTED_PACKAGE_NAME);
URIMapping overridingUriMapping = MModelURIMapFactory.eINSTANCE.createURIMapping();
overridingUriMapping.setSourceURI(EcorePackage.eNS_URI);
testEcoreFileURI = prepareTestMetamodel();
uriMapping.setTargetURI(testEcoreFileURI.toString());
nestedUriMapping.setTargetURI(platformTestModelURI.appendFragment("//" + NESTED_PACKAGE_NAME).toString());
overridingUriMapping.setTargetURI("invalid");
allMappings.getMapping().add(uriMapping);
allMappings.getMapping().add(nestedUriMapping);
allMappings.getMapping().add(overridingUriMapping);
mappingResource.save(null);
// TODO - should rather be MetamodelURIMappingHelper operation
// refresh .settings folder structure
myProject.getProject().refreshLocal(IResource.DEPTH_INFINITE, null);
assertTrue(MetamodelURIMappingHelper.hasMappingResource(myProject.getProject()));
IMetamodelRegistryProvider.IRepositoryContext ctx = createContext();
metamodelRegistry = new ProjectMetamodelRegistryProvider().getRegistry(ctx);
}
private IMetamodelRegistryProvider.IRepositoryContext createContext() {
IFile projectDescFile = myProject.getProject().getFile(".project");
URI projectDescURI = URIUtils.getResourceURI(projectDescFile);
IMetamodelRegistryProvider.IRepositoryContext ctx = CompilerUtils.createContext(projectDescURI);
return ctx;
}
@Override
@After
public void tearDown() throws Exception {
myProject.delete();
}
@Test
public void testProjectContextRegistration() throws Exception {
IMetamodelRegistryProvider.IRepositoryContext ctx = createContext();
IMetamodelDesc metamodelDesc = new ProjectMetamodelRegistryProvider()
.getRegistry(ctx).getMetamodelDesc(METAMODEL_ID);
assertNotNull(metamodelDesc);
EPackage ePackage = metamodelDesc.getModel();
assertEquals(ePackage.eResource().getURI(), testEcoreFileURI);
}
@Test
public void testGlobalContextRegistration() throws Exception {
String knownID = EcorePackage.eINSTANCE.getNsURI();
IMetamodelDesc metamodelDesc = metamodelRegistry.getMetamodelDesc(knownID);
assertNotNull(metamodelDesc);
assertSame(EcorePackage.eINSTANCE, metamodelDesc.getModel());
}
@Test
public void testNestedPackageRegistration() throws Exception {
IMetamodelRegistryProvider.IRepositoryContext ctx = createContext();
IMetamodelDesc metamodelDesc = new ProjectMetamodelRegistryProvider()
.getRegistry(ctx).getMetamodelDesc(METAMODEL_ID + "." + NESTED_PACKAGE_NAME);
assertNotNull(metamodelDesc);
EPackage ePackage = metamodelDesc.getModel();
assertEquals(ePackage.getName(), NESTED_PACKAGE_NAME);
}
@Test
public void testBug376644PackageRegistryFallback() throws Exception {
IMetamodelRegistryProvider.IRepositoryContext ctx = createContext();
IMetamodelDesc metamodelDesc = new ProjectMetamodelRegistryProvider()
.getRegistry(ctx).getMetamodelDesc(EcorePackage.eNS_URI);
assertNotNull(metamodelDesc);
assertTrue(EmfUtilPlugin.isSuccess(metamodelDesc.getLoadStatus()));
EPackage ePackage = metamodelDesc.getModel();
assertSame(EcorePackage.eINSTANCE, ePackage);
}
@Test
public void testBug441094DelegatePackageRegistry() {
EPackage myEPackage = EcoreFactory.eINSTANCE.createEPackage();
final String ID = "myPackageID";
EPackage.Registry delegateRegistry = new EPackageRegistryImpl();
delegateRegistry.put(ID, myEPackage);
EPackage.Registry packageRegistry = new EPackageRegistryImpl(delegateRegistry);
MetamodelRegistry metaRegistry = new MetamodelRegistry(packageRegistry);
EPackage result = metaRegistry.toEPackageRegistry().getEPackage(ID);
assertSame(myEPackage, result);
}
@Test
public void testBug326651UpdateMetamodel() throws Exception {
final String ID = "myPackageID";
EPackage p1 = EcoreFactory.eINSTANCE.createEPackage();
EPackage p2 = EcoreFactory.eINSTANCE.createEPackage();
EPackage.Registry packageRegistry = new EPackageRegistryImpl();
packageRegistry.put(ID, p1);
MetamodelRegistry registry = new MetamodelRegistry(packageRegistry);
IMetamodelDesc desc = registry.getMetamodelDesc(ID);
assertSame(p1, desc.getModel());
packageRegistry.put(ID, p2);
desc = registry.getMetamodelDesc(ID);
assertSame(p2, desc.getModel());
}
@Test
public void testBug435699IllegalRegistration() throws Exception {
final String ID = "myPackageID";
EPackage.Descriptor descriptor = new EPackage.Descriptor() {
public EPackage getEPackage() {
throw new UnsupportedOperationException();
}
public EFactory getEFactory() {
return null;
}
};
EPackage.Registry packageRegistry = new EPackageRegistryImpl();
packageRegistry.put(ID, descriptor);
MetamodelRegistry registry = new MetamodelRegistry(packageRegistry);
IMetamodelDesc desc = registry.getMetamodelDesc(ID);
assertNotNull(desc);
assertTrue(desc.getLoadStatus().getSeverity() == Diagnostic.ERROR);
try {
registry.getMetamodelDesc("unregisteredID");
fail();
}
catch(EmfException e) {
// succeed;
}
}
private URI prepareTestMetamodel() throws IOException {
IFile ecoreFile = myProject.project.getFile("javaless.ecore"); //$NON-NLS-1$
URI uri = URI.createPlatformResourceURI(ecoreFile.getFullPath().toString(), false);
Resource testMetamodelUri = new ResourceSetImpl().getResource(platformTestModelURI, true);
testMetamodelUri.setURI(uri);
testMetamodelUri.save(null);
return uri;
}
}