From de499dbfbd960a63f62c4938d9dc71172e075120 Mon Sep 17 00:00:00 2001 From: sboyko Date: Thu, 20 Nov 2014 14:09:30 +0400 Subject: [376644] - URI map resolution should fall back to EPackage registry [441094] - MetamodelRegistry does not keep track of EPackageRegistryImpl delegate [326651] - Unable to update a metamodel in the MetamodelRegistry cherry-picked from cgerking/misc: I95268f0f9ef8d52c00bcc89bf244e7cfe9ecfd1c --- .../oml/ast/parser/MetamodelResolutionHelper.java | 65 ++++++++++------------ .../internal/qvt/oml/compiler/CompilerUtils.java | 24 ++------ .../internal/qvt/oml/compiler/QVTOCompiler.java | 28 ++++------ 3 files changed, 44 insertions(+), 73 deletions(-) (limited to 'plugins/org.eclipse.m2m.qvt.oml/src') diff --git a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/ast/parser/MetamodelResolutionHelper.java b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/ast/parser/MetamodelResolutionHelper.java index 8d246ed98..d830ebdcd 100644 --- a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/ast/parser/MetamodelResolutionHelper.java +++ b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/ast/parser/MetamodelResolutionHelper.java @@ -17,7 +17,7 @@ import java.util.List; import org.eclipse.emf.ecore.EPackage; import org.eclipse.m2m.internal.qvt.oml.ast.env.QvtOperationalEnv; -import org.eclipse.m2m.internal.qvt.oml.emf.util.EmfException; +import org.eclipse.m2m.internal.qvt.oml.emf.util.EmfUtil; import org.eclipse.m2m.internal.qvt.oml.emf.util.mmregistry.MetamodelRegistry; /** @@ -37,43 +37,34 @@ class MetamodelResolutionHelper { EPackage.Registry registry = qvtEnv.getFactory().getEPackageRegistry(); List metamodels = new ArrayList(1); - try { - List desc = Collections.emptyList(); - if (metamodelUri != null && path.isEmpty()) { - EPackage ePackage = registry.getEPackage(metamodelUri); - if(ePackage != null) { - desc = Collections.singletonList(ePackage); - } else { - ePackage = MetamodelRegistry.tryLookupEmptyRootPackage(metamodelUri, registry); - if(ePackage != null) { - desc = Collections.singletonList(ePackage); - } - } + + List desc = Collections.emptyList(); + if (metamodelUri != null && path.isEmpty()) { + EPackage ePackage = registry.getEPackage(metamodelUri); + if(ePackage != null) { + desc = Collections.singletonList(ePackage); } else { - desc = MetamodelRegistry.resolveMetamodels(registry, path); - } - - for(EPackage model : desc) { - // register meta-model for EClassifier lookup - if (model.getNsURI() == null) { - while (true) { - if (model.getESuperPackage() == null) { - break; - } - model = model.getESuperPackage(); - } - } - - metamodels.add(model); - if(metamodelUri != null) { - qvtEnv.getEPackageRegistry().put(metamodelUri, model); - } - - //break; - } - } catch (EmfException e) { - // It's legal situation of unresolved metamodels - } + ePackage = MetamodelRegistry.tryLookupEmptyRootPackage(metamodelUri, registry); + if(ePackage != null) { + desc = Collections.singletonList(ePackage); + } + } + } else { + desc = MetamodelRegistry.resolveMetamodels(registry, path); + } + + for(EPackage model : desc) { + // register meta-model for EClassifier lookup + if (model.getNsURI() == null) { + model = EmfUtil.getRootPackage(model); + } + + metamodels.add(model); + if(metamodelUri != null) { + qvtEnv.getEPackageRegistry().put(metamodelUri, model); + } + } + return metamodels; } } diff --git a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/compiler/CompilerUtils.java b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/compiler/CompilerUtils.java index 494c58852..7d0569b4c 100644 --- a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/compiler/CompilerUtils.java +++ b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/compiler/CompilerUtils.java @@ -31,7 +31,6 @@ import org.eclipse.m2m.internal.qvt.oml.NLS; import org.eclipse.m2m.internal.qvt.oml.QvtMessage; import org.eclipse.m2m.internal.qvt.oml.common.io.CResourceRepositoryContext; import org.eclipse.m2m.internal.qvt.oml.common.io.eclipse.WorkspaceMetamodelRegistryProvider; -import org.eclipse.m2m.internal.qvt.oml.emf.util.mmregistry.EmfStandaloneMetamodelProvider; import org.eclipse.m2m.internal.qvt.oml.emf.util.mmregistry.IMetamodelProvider; import org.eclipse.m2m.internal.qvt.oml.emf.util.mmregistry.IMetamodelRegistryProvider; import org.eclipse.m2m.internal.qvt.oml.emf.util.mmregistry.MetamodelRegistry; @@ -106,7 +105,7 @@ public class CompilerUtils { if(metamodelRegistry != null) { packageRegistry = metamodelRegistry.toEPackageRegistry(); } else { - packageRegistry = new EPackageRegistryImpl(); + packageRegistry = new EPackageRegistryImpl(EPackage.Registry.INSTANCE); } return packageRegistry; @@ -132,7 +131,7 @@ public class CompilerUtils { static class Eclipse { static QVTOCompiler createCompiler() { - return new QVTOCompiler(new WorkspaceMetamodelRegistryProvider(createResourceSet())); + return new QVTOCompiler(createMetamodelRegistryProvider(createResourceSet())); } static Monitor createMonitor(Monitor monitor, int ticks) { @@ -151,23 +150,12 @@ public class CompilerUtils { static WorkspaceMetamodelRegistryProvider createMetamodelRegistryProvider(final EPackage.Registry packageRegistry, ResourceSet metamodelResourceSet) { return new WorkspaceMetamodelRegistryProvider(metamodelResourceSet) { - IMetamodelProvider registry = new EmfStandaloneMetamodelProvider(packageRegistry); + @Override - public MetamodelRegistry getRegistry(IRepositoryContext context) { - MetamodelRegistry result = super.getRegistry(context); - if(result == MetamodelRegistry.getInstance()) { - // FIXME - get rid of this hack by providing - // a protected method WorkspaceProvider::getDelegateRegistry(); - // which by default returns MetamodelRegistry.getInstance() - result = new MetamodelRegistry(registry); - } else if(result != null) { - MetamodelRegistry customRegistry = new MetamodelRegistry(registry); - customRegistry.merge(result); - result = customRegistry; - } - return result; + protected IMetamodelProvider createDelegateMetamodelProvider() { + return MetamodelRegistry.getDefaultMetamodelProvider(packageRegistry); } }; - } + } } } diff --git a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/compiler/QVTOCompiler.java b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/compiler/QVTOCompiler.java index 99d5e5c77..8fde40c53 100644 --- a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/compiler/QVTOCompiler.java +++ b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/compiler/QVTOCompiler.java @@ -37,7 +37,6 @@ import org.eclipse.emf.common.util.UniqueEList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EPackage.Registry; -import org.eclipse.emf.ecore.impl.EPackageRegistryImpl; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.URIConverter; @@ -63,7 +62,6 @@ import org.eclipse.m2m.internal.qvt.oml.cst.ImportCS; import org.eclipse.m2m.internal.qvt.oml.cst.UnitCS; import org.eclipse.m2m.internal.qvt.oml.cst.parser.AbstractQVTParser; import org.eclipse.m2m.internal.qvt.oml.emf.util.EmfUtil; -import org.eclipse.m2m.internal.qvt.oml.emf.util.mmregistry.EmfStandaloneMetamodelProvider; 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.expressions.ModelType; @@ -121,6 +119,7 @@ public class QVTOCompiler { public static QVTOCompiler createCompiler(EPackage.Registry registry) { ResourceSetImpl rs = new ResourceSetImpl(); + if(registry != null) { rs.setPackageRegistry(registry); @@ -139,11 +138,8 @@ public class QVTOCompiler { rs.setURIResourceMap(uriResourceMap); } } - - final EPackageRegistryImpl packageRegistryImpl = new EPackageRegistryImpl(EPackage.Registry.INSTANCE); - packageRegistryImpl.putAll(registry); - - IMetamodelRegistryProvider metamodelRegistryProvider = createMetamodelRegistryProvider(packageRegistryImpl, rs); + + IMetamodelRegistryProvider metamodelRegistryProvider = createMetamodelRegistryProvider(registry, rs); return new QVTOCompiler(metamodelRegistryProvider); } @@ -569,7 +565,7 @@ public class QVTOCompiler { private CompiledUnit loadBlackboxUnit(UnitProxy unit) throws IOException { ModelContents contents = (ModelContents) unit.getContents(); - List topElements = contents.loadElements(CompilerUtils.getEPackageRegistry(unit.getURI(), fMetamodelRegistryProvider)); + List topElements = contents.loadElements(getEPackageRegistry(unit.getURI())); List modelEnvs = new ArrayList(topElements.size()); for (EObject nextElement : topElements) { @@ -746,15 +742,7 @@ public class QVTOCompiler { } private static IMetamodelRegistryProvider createMetamodelRegistryProvider(ResourceSet metamodelResourceSet) { - if(EMFPlugin.IS_ECLIPSE_RUNNING && EMFPlugin.IS_RESOURCES_BUNDLE_AVAILABLE) { - return Eclipse.createMetamodelRegistryProvider(metamodelResourceSet); - } - - return new IMetamodelRegistryProvider() { - public MetamodelRegistry getRegistry(IRepositoryContext context) { - return new MetamodelRegistry(new EmfStandaloneMetamodelProvider()); - } - }; + return createMetamodelRegistryProvider(EPackage.Registry.INSTANCE, metamodelResourceSet); } private static IMetamodelRegistryProvider createMetamodelRegistryProvider(final EPackage.Registry packageRegistry, ResourceSet metamodelResourceSet) { @@ -762,9 +750,13 @@ public class QVTOCompiler { return Eclipse.createMetamodelRegistryProvider(packageRegistry, metamodelResourceSet); } + return createStandaloneMetamodelRegistryProvider(packageRegistry); + } + + private static IMetamodelRegistryProvider createStandaloneMetamodelRegistryProvider(final EPackage.Registry packageRegistry) { return new IMetamodelRegistryProvider() { public MetamodelRegistry getRegistry(IRepositoryContext context) { - return new MetamodelRegistry(new EmfStandaloneMetamodelProvider(packageRegistry)); + return new MetamodelRegistry(packageRegistry); } }; } -- cgit v1.2.3