| /** |
| * <copyright> |
| * |
| * Copyright (c) 2010,2011 E.D.Willink 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: |
| * E.D.Willink - initial API and implementation |
| * |
| * </copyright> |
| * |
| * $Id$ |
| */ |
| package org.eclipse.ocl.examples.test.xtext; |
| |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.emf.compare.match.MatchOptions; |
| import org.eclipse.emf.ecore.EObject; |
| 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.ocl.examples.common.utils.ClassUtils; |
| import org.eclipse.ocl.examples.domain.utilities.ProjectMap; |
| import org.eclipse.ocl.examples.pivot.NamedElement; |
| import org.eclipse.ocl.examples.pivot.ecore.Ecore2Pivot; |
| import org.eclipse.ocl.examples.pivot.ecore.Pivot2Ecore; |
| import org.eclipse.ocl.examples.pivot.manager.MetaModelManager; |
| import org.eclipse.ocl.examples.pivot.manager.MetaModelManagerResourceSetAdapter; |
| import org.eclipse.ocl.examples.pivot.uml.Pivot2UML; |
| import org.eclipse.ocl.examples.pivot.uml.UML2Pivot; |
| import org.eclipse.ocl.examples.pivot.uml.UMLUtils; |
| import org.eclipse.ocl.examples.pivot.utilities.PivotResource; |
| import org.eclipse.ocl.examples.xtext.base.cs2pivot.CS2Pivot; |
| import org.eclipse.ocl.examples.xtext.base.cs2pivot.CS2Pivot.MessageBinder; |
| import org.eclipse.ocl.examples.xtext.base.pivot2cs.Pivot2CS; |
| import org.eclipse.ocl.examples.xtext.base.utilities.BaseCSResource; |
| import org.eclipse.ocl.examples.xtext.base.utilities.CS2PivotResourceAdapter; |
| import org.eclipse.ocl.examples.xtext.completeocl.pivot2cs.CompleteOCLPivot2CS; |
| import org.eclipse.ocl.examples.xtext.completeocl.pivot2cs.CompleteOCLSplitter; |
| import org.eclipse.ocl.examples.xtext.oclinecore.oclinEcoreCST.OCLinEcoreCSTPackage; |
| import org.eclipse.ocl.examples.xtext.oclinecore.pivot2cs.OCLinEcorePivot2CS; |
| import org.eclipse.ocl.examples.xtext.tests.XtextTestCase; |
| import org.eclipse.uml2.uml.UMLPackage; |
| import org.eclipse.xtext.resource.XtextResource; |
| |
| /** |
| * Test that an Ecore file can be loaded as OCLinEcore then saved back as Ecore. |
| */ |
| public class RoundTripTests extends XtextTestCase |
| { |
| public Resource createEcoreFromPivot(MetaModelManager metaModelManager, PivotResource pivotResource, URI ecoreURI) throws IOException { |
| Resource ecoreResource = Pivot2Ecore.createResource(metaModelManager, pivotResource, ecoreURI, null); |
| assertNoResourceErrors("To Ecore errors", ecoreResource); |
| if (ecoreURI != null) { |
| ecoreResource.save(null); |
| } |
| return ecoreResource; |
| } |
| public PivotResource createPivotFromEcore(MetaModelManager metaModelManager, Resource ecoreResource) throws IOException { |
| Ecore2Pivot ecore2Pivot = Ecore2Pivot.getAdapter(ecoreResource, metaModelManager); |
| org.eclipse.ocl.examples.pivot.Package pivotRoot = ecore2Pivot.getPivotRoot(); |
| PivotResource pivotResource = (PivotResource) pivotRoot.eResource(); |
| assertNoResourceErrors("Ecore2Pivot failed", pivotResource); |
| assertNoValidationErrors("Ecore2Pivot invalid", pivotResource); |
| return pivotResource; |
| } |
| public PivotResource createPivotFromXtext(MetaModelManager metaModelManager, BaseCSResource xtextResource, int expectedContentCount) throws IOException { |
| CS2PivotResourceAdapter adapter = null; |
| try { |
| adapter = CS2PivotResourceAdapter.getAdapter(xtextResource, null); |
| PivotResource pivotResource = (PivotResource)adapter.getPivotResource(xtextResource); |
| assertNoResourceErrors("To Pivot errors", xtextResource); |
| assertNoUnresolvedProxies("Unresolved proxies", xtextResource); |
| List<EObject> pivotContents = pivotResource.getContents(); |
| assertEquals(expectedContentCount, pivotContents.size()); |
| assertNoValidationErrors("Pivot validation errors", pivotContents.get(0)); |
| return pivotResource; |
| } |
| finally { |
| if (adapter != null) { |
| adapter.dispose(); |
| } |
| } |
| } |
| public BaseCSResource createXtextFromPivot(MetaModelManager metaModelManager, PivotResource pivotResource, URI xtextURI) throws IOException { |
| XtextResource xtextResource = (XtextResource) resourceSet.createResource(xtextURI, OCLinEcoreCSTPackage.eCONTENT_TYPE); |
| Map<Resource, Resource> cs2PivotResourceMap = new HashMap<Resource, Resource>(); |
| cs2PivotResourceMap.put(xtextResource, pivotResource); |
| Pivot2CS pivot2cs = new OCLinEcorePivot2CS(cs2PivotResourceMap, metaModelManager); |
| pivot2cs.update(); |
| xtextResource.save(null); |
| assertNoResourceErrors("Conversion failed", xtextResource); |
| assertNoDiagnosticErrors("Concrete Syntax validation failed", xtextResource); |
| return (BaseCSResource) xtextResource; |
| } |
| public BaseCSResource createXtextFromURI(MetaModelManager metaModelManager, URI xtextURI) throws IOException { |
| ResourceSet resourceSet2 = metaModelManager.getExternalResourceSet(); |
| ProjectMap.initializeURIResourceMap(resourceSet2); |
| ProjectMap.initializeURIResourceMap(null); |
| UMLUtils.initializeContents(resourceSet2); |
| BaseCSResource xtextResource = (BaseCSResource) resourceSet2.getResource(xtextURI, true); |
| assertNoResourceErrors("Load failed", xtextResource); |
| return xtextResource; |
| } |
| |
| public BaseCSResource createCompleteOCLXtextFromPivot(MetaModelManager metaModelManager, Resource pivotResource, URI xtextURI) throws IOException { |
| XtextResource xtextResource = (XtextResource) resourceSet.createResource(xtextURI, OCLinEcoreCSTPackage.eCONTENT_TYPE); |
| Map<Resource, Resource> cs2PivotResourceMap = new HashMap<Resource, Resource>(); |
| cs2PivotResourceMap.put(xtextResource, pivotResource); |
| Pivot2CS pivot2cs = new CompleteOCLPivot2CS(cs2PivotResourceMap, metaModelManager); |
| pivot2cs.update(); |
| xtextResource.save(null); |
| assertNoResourceErrors("Conversion failed", xtextResource); |
| assertNoDiagnosticErrors("Concrete Syntax validation failed", xtextResource); |
| return (BaseCSResource) xtextResource; |
| } |
| |
| public void doRoundTripFromCompleteOCL(URI inputURI) throws IOException, InterruptedException { |
| MessageBinder savedMessageBinder = CS2Pivot.setMessageBinder(CS2Pivot.MessageBinderWithLineContext.INSTANCE); |
| ProjectMap projectMap = ProjectMap.getAdapter(resourceSet); |
| try { |
| projectMap.initializeResourceSet(null); |
| UMLUtils.initializeContentHandlers(resourceSet); |
| // String inputName = stem + ".ocl"; |
| // String outputName = stem + ".regenerated.ocl"; |
| URI outputURI = inputURI.trimFileExtension().appendFileExtension("regenerated.ocl"); |
| MetaModelManager metaModelManager1 = new MetaModelManager(projectMap); |
| MetaModelManagerResourceSetAdapter.getAdapter(resourceSet, metaModelManager1); |
| BaseCSResource xtextResource1 = createXtextFromURI(metaModelManager1, inputURI); |
| PivotResource pivotResource1 = createPivotFromXtext(metaModelManager1, xtextResource1, 2); |
| Resource pivotResource2 = CompleteOCLSplitter.separate(metaModelManager1, pivotResource1); |
| @SuppressWarnings("unused") |
| BaseCSResource xtextResource2 = createCompleteOCLXtextFromPivot(metaModelManager1, pivotResource2, outputURI); |
| metaModelManager1.dispose(); |
| metaModelManager1 = null; |
| // |
| MetaModelManager metaModelManager3 = new MetaModelManager(projectMap); |
| BaseCSResource xtextResource3 = createXtextFromURI(metaModelManager3, outputURI); |
| @SuppressWarnings("unused") |
| PivotResource pivotResource3 = createPivotFromXtext(metaModelManager3, xtextResource3, 2); |
| // Map<String,Object> options = new HashMap<String,Object>(); |
| // options.put(MatchOptions.OPTION_IGNORE_ID, Boolean.TRUE); |
| // options.put(MatchOptions.OPTION_IGNORE_XMI_ID, Boolean.TRUE); |
| // ((NamedElement)pivotResource3.getContents().get(0)).setName(((NamedElement)pivotResource1.getContents().get(0)).getName()); |
| // assertSameModel(pivotResource1, pivotResource3, options); |
| metaModelManager3.dispose(); |
| } |
| finally { |
| projectMap.dispose(); |
| CS2Pivot.setMessageBinder(savedMessageBinder); |
| } |
| } |
| |
| public void doRoundTripFromEcore(String stem) throws IOException, InterruptedException { |
| doRoundTripFromEcore(stem, stem); |
| } |
| public void doRoundTripFromEcore(String stem, String reference) throws IOException, InterruptedException { |
| String inputName = stem + ".ecore"; |
| String pivotName = stem + ".ecore.pivot"; |
| String outputName = stem + ".regenerated.ecore"; |
| String referenceName = reference + ".ecore"; |
| URI inputURI = getProjectFileURI(inputName); |
| URI pivotURI = getProjectFileURI(pivotName); |
| URI outputURI = getProjectFileURI(outputName); |
| URI referenceURI = getProjectFileURI(referenceName); |
| Resource inputResource = resourceSet.getResource(inputURI, true); |
| assertNoResourceErrors("Ecore load", inputResource); |
| assertNoValidationErrors("Ecore load", inputResource); |
| |
| MetaModelManager metaModelManager = new MetaModelManager(); |
| try { |
| Ecore2Pivot ecore2Pivot = Ecore2Pivot.getAdapter(inputResource, metaModelManager); |
| org.eclipse.ocl.examples.pivot.Package pivotRoot = ecore2Pivot.getPivotRoot(); |
| Resource pivotResource = pivotRoot.eResource(); |
| pivotResource.setURI(pivotURI); |
| assertNoResourceErrors("Ecore2Pivot failed", pivotResource); |
| pivotResource.save(null); |
| assertNoValidationErrors("Ecore2Pivot invalid", pivotResource); |
| |
| Resource outputResource = Pivot2Ecore.createResource(metaModelManager, pivotResource, outputURI, null); |
| assertNoResourceErrors("Ecore2Pivot failed", outputResource); |
| outputResource.save(null); |
| assertNoValidationErrors("Ecore2Pivot invalid", outputResource); |
| |
| // RootPackageCS csDocument = null; // FIXME Ecore2OCLinEcore.importFromEcore(resourceSet, null, leftResource); |
| // assertNoResourceErrors("From Ecore errors", csDocument.eResource()); |
| // List<PackageCS> csObjects = new ArrayList<PackageCS>(); |
| // csObjects.addAll(csDocument.getPackages()); |
| // Resource middleResource = resourceSet.createResource(middleURI); |
| // middleResource.getContents().addAll(csObjects); |
| // middleResource.getContents().add(csDocument); |
| // middleResource.save(null); |
| // OCLinEcore2Ecore cs2e = new OCLinEcore2Ecore(resourceSet, middleResource, outputURI); |
| // Resource rightResource = cs2e.exportToEcore(); |
| // assertNoResourceErrors("To Ecore errors", rightResource); |
| // rightResource.save(null); |
| // resourceSet.getResources().add(rightResource); |
| Resource referenceResource = new ResourceSetImpl().getResource(referenceURI, true); |
| assertSameModel(referenceResource, outputResource); |
| } finally { |
| metaModelManager.dispose(); |
| } |
| } |
| |
| public void doRoundTripFromOCLinEcore(MetaModelManager metaModelManager1, String stem) throws IOException, InterruptedException { |
| String inputName = stem + ".oclinecore"; |
| String ecoreName = stem + ".ecore"; |
| String outputName = stem + ".regenerated.oclinecore"; |
| URI inputURI = getProjectFileURI(inputName); |
| URI ecoreURI = getProjectFileURI(ecoreName); |
| URI outputURI = getProjectFileURI(outputName); |
| |
| MetaModelManagerResourceSetAdapter.getAdapter(resourceSet, metaModelManager1); |
| BaseCSResource xtextResource1 = createXtextFromURI(metaModelManager1, inputURI); |
| PivotResource pivotResource1 = createPivotFromXtext(metaModelManager1, xtextResource1, 1); |
| Resource ecoreResource = createEcoreFromPivot(metaModelManager1, pivotResource1, ecoreURI); |
| MetaModelManager metaModelManager2 = new MetaModelManager(); |
| PivotResource pivotResource2 = createPivotFromEcore(metaModelManager2, ecoreResource); |
| @SuppressWarnings("unused") |
| BaseCSResource xtextResource2 = createXtextFromPivot(metaModelManager2, pivotResource2, outputURI); |
| metaModelManager2.dispose(); |
| metaModelManager2 = null; |
| // |
| MetaModelManager metaModelManager3 = new MetaModelManager(); |
| BaseCSResource xtextResource3 = createXtextFromURI(metaModelManager3, outputURI); |
| PivotResource pivotResource3 = createPivotFromXtext(metaModelManager3, xtextResource3, 1); |
| Map<String,Object> options = new HashMap<String,Object>(); |
| options.put(MatchOptions.OPTION_IGNORE_ID, Boolean.TRUE); |
| options.put(MatchOptions.OPTION_IGNORE_XMI_ID, Boolean.TRUE); |
| ((NamedElement)pivotResource3.getContents().get(0)).setName(((NamedElement)pivotResource1.getContents().get(0)).getName()); |
| assertSameModel(pivotResource1, pivotResource3, options); |
| metaModelManager3.dispose(); |
| } |
| |
| public void doRoundTripFromUml(String stem) throws IOException, InterruptedException { |
| // Environment.Registry.INSTANCE.registerEnvironment( |
| // new UMLEnvironmentFactory().createEnvironment()); |
| ResourceSet resourceSet = new ResourceSetImpl(); |
| assertNull(UML2Pivot.initialize(resourceSet)); |
| resourceSet.getPackageRegistry().put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE); |
| // assertNull(org.eclipse.ocl.uml.OCL.initialize(null)); |
| // org.eclipse.uml2.uml.Package umlMetamodel = (org.eclipse.uml2.uml.Package) resourceSet.getResource( |
| // URI.createURI(UMLResource.UML_METAMODEL_URI), |
| // true).getContents().get(0); |
| // org.eclipse.uml2.uml.Package umlPrimitiveTypes = (org.eclipse.uml2.uml.Package) resourceSet.getResource( |
| // URI.createURI(UMLResource.UML_PRIMITIVE_TYPES_LIBRARY_URI), |
| // true).getContents().get(0); |
| // org.eclipse.uml2.uml.Package ecorePrimitiveTypes = (org.eclipse.uml2.uml.Package) resourceSet.getResource( |
| // URI.createURI(UMLResource.ECORE_PRIMITIVE_TYPES_LIBRARY_URI), |
| // true).getContents().get(0); |
| String inputName = stem + ".uml"; |
| String pivotName = stem + ".pivot"; |
| String outputName = stem + ".regenerated.uml"; |
| URI inputURI = getProjectFileURI(inputName); |
| URI pivotURI = getProjectFileURI(pivotName); |
| URI outputURI = getProjectFileURI(outputName); |
| Resource inputResource = resourceSet.getResource(inputURI, true); |
| assertNoResourceErrors("UML load", inputResource); |
| assertNoValidationErrors("UML load", inputResource); |
| |
| MetaModelManager pivotManager = new MetaModelManager(); |
| UML2Pivot uml2Pivot = UML2Pivot.getAdapter(inputResource, pivotManager); |
| org.eclipse.ocl.examples.pivot.Package pivotRoot = uml2Pivot.getPivotRoot(); |
| Resource pivotResource = pivotRoot.eResource(); |
| pivotResource.setURI(pivotURI); |
| assertNoResourceErrors("UML2Pivot failed", pivotResource); |
| pivotResource.save(null); |
| assertNoValidationErrors("UML2Pivot invalid", pivotResource); |
| |
| List<? extends EObject> outputObjects = new ArrayList<EObject>(Pivot2UML.createResource(pivotManager, pivotResource)); |
| @SuppressWarnings("unchecked") |
| List<? extends org.eclipse.uml2.uml.NamedElement> castOutputObjects = (List<? extends org.eclipse.uml2.uml.NamedElement>)outputObjects; |
| outputObjects.remove(getNamedElement(castOutputObjects, "orphanage")); |
| if (outputObjects.size() == 1) { |
| outputObjects = ((org.eclipse.uml2.uml.Package)outputObjects.get(0)).getNestedPackages(); |
| } |
| Resource outputResource = resourceSet.createResource(outputURI); |
| outputResource.getContents().addAll(outputObjects); |
| assertNoResourceErrors("UML2Pivot failed", outputResource); |
| outputResource.save(null); |
| assertNoValidationErrors("UML2Pivot invalid", outputResource); |
| assertSameModel(inputResource, outputResource); |
| } |
| |
| public static <T extends org.eclipse.uml2.uml.NamedElement> T getNamedElement(Collection<T> elements, String name) { |
| if (elements == null) |
| return null; |
| for (T element : elements) |
| if (ClassUtils.equals(name, element.getName())) |
| return element; |
| return null; |
| } |
| |
| public void testBug350894RoundTrip() throws IOException, InterruptedException { |
| String testFileA = |
| "package a : aa = 'aaa'\n" + |
| "{\n" + |
| "class A;\n" + |
| "}\n"; |
| MetaModelManager metaModelManager1 = new MetaModelManager(); |
| createEcoreFile(metaModelManager1, "Bug350894A.ecore", testFileA); |
| metaModelManager1.dispose(); |
| String testFileB = |
| "import aa : 'Bug350894A.ecore#/';\n" + |
| "package b : bb = 'bbb'\n" + |
| "{\n" + |
| "class B\n" + |
| "{\n" + |
| "invariant : not oclIsKindOf(aa::A);\n" + |
| "}\n" + |
| "}\n"; |
| createOCLinEcoreFile("Bug350894B.oclinecore", testFileB); |
| MetaModelManager metaModelManager2 = new MetaModelManager(); |
| doRoundTripFromOCLinEcore(metaModelManager2, "Bug350894B"); |
| metaModelManager2.dispose(); |
| } |
| |
| public void testCompanyRoundTrip() throws IOException, InterruptedException { |
| doRoundTripFromEcore("Company", "Company.reference"); |
| } |
| |
| public void testEcoreRoundTrip() throws IOException, InterruptedException { |
| doRoundTripFromEcore("Ecore"); |
| } |
| |
| public void testEmptyRoundTrip() throws IOException, InterruptedException { |
| doRoundTripFromEcore("Empty"); |
| } |
| |
| public void testImportsRoundTrip() throws IOException, InterruptedException { |
| doRoundTripFromEcore("Imports"); |
| } |
| |
| public void testKeysRoundTrip() throws IOException, InterruptedException { |
| doRoundTripFromEcore("Keys"); |
| } |
| |
| public void testCompleteOCLRoundTrip_Fruit() throws IOException, InterruptedException { |
| doRoundTripFromCompleteOCL(getProjectFileURI("Fruit.ocl")); |
| } |
| |
| // public void testCompleteOCLRoundTrip_Infrastructure() throws IOException, InterruptedException { |
| // doRoundTripFromCompleteOCL("Infrastructure"); |
| // } |
| |
| public void testCompleteOCLRoundTrip_Names() throws IOException, InterruptedException { |
| doRoundTripFromCompleteOCL(getProjectFileURI("Names.ocl")); |
| } |
| |
| public void testCompleteOCLRoundTrip_UML() throws IOException, InterruptedException { |
| URI uml_2_5 = URI.createPlatformResourceURI("/UML-2.5/XMI-23-Nov-2001/Semanticed UML.ocl", true); |
| if (uml_2_5.isFile()) { |
| doRoundTripFromCompleteOCL(uml_2_5); |
| } |
| // doRoundTripFromCompleteOCL(URI.createPlatformResourceURI("/UML-2.5/XMI-23-Nov-2001/UML.xmi", true)); |
| } |
| |
| public void testOCLinEcoreCSTRoundTrip() throws IOException, InterruptedException { |
| doRoundTripFromEcore("OCLinEcoreCST"); |
| } |
| |
| public void testOCLstdlibRoundTrip() throws IOException, InterruptedException { |
| doRoundTripFromEcore("OCLstdlib"); |
| } |
| |
| public void testOCLRoundTrip() throws IOException, InterruptedException { |
| doRoundTripFromEcore("OCL", "OCL.reference"); |
| } |
| |
| public void testOCLCSTRoundTrip() throws IOException, InterruptedException { |
| doRoundTripFromEcore("OCLCST"); |
| } |
| |
| /* FIXME Bug 363224 disabled by EMF Compare Bug 362997 |
| public void testOCLEcoreRoundTrip() throws IOException, InterruptedException { |
| doRoundTripFromEcore("OCLEcore"); |
| } */ |
| |
| public void testQVTRoundTrip() throws IOException, InterruptedException { |
| doRoundTripFromEcore("QVT"); |
| } |
| |
| public void testTypes_ecore() throws IOException, InterruptedException { |
| doRoundTripFromEcore("Types"); |
| } |
| |
| // public void testTypes_oclinecore() throws IOException, InterruptedException { |
| // BaseScopeProvider.LOOKUP.setState(true); // FIXME CCE if this line commented out |
| // doRoundTripFromOclInEcore("Types"); |
| // } |
| |
| public void testXMLNamespaceRoundTrip() throws IOException, InterruptedException { |
| doRoundTripFromEcore("XMLNamespace"); |
| } |
| |
| public void testXMLTypeRoundTrip() throws IOException, InterruptedException { |
| doRoundTripFromEcore("XMLType"); |
| } |
| |
| // public void testMy_uml() throws IOException, InterruptedException { |
| // doRoundTripFromUml("My"); |
| // } |
| |
| // public void testTriangle_uml() throws IOException, InterruptedException { |
| // doRoundTripFromUml("Triangle"); |
| // } |
| |
| // public void testProfile_less_Ecore_metamodel_uml() throws IOException, InterruptedException { |
| // doRoundTripFromUml("Profile-less-Ecore.metamodel"); |
| // } |
| } |