/******************************************************************************* * Copyright (c) 2008, 2014 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 v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Borland Software Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.m2m.internal.qvt.oml.ast.parser; import java.util.ArrayList; import java.util.Collections; 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.EmfUtil; import org.eclipse.m2m.internal.qvt.oml.emf.util.mmregistry.MetamodelRegistry; /** * FIXME - this class extracts the logic of resolving workspace located metamodels, * formerly injected into QVT Environments implementation. * A temporary workaround, to be revisited. */ class MetamodelResolutionHelper { /** * Registers metamodel for use with this environment. * * @return the metamodel package denoted by the given <code>URI</code> or * <code>null</code> if no package was resolved */ static List<EPackage> registerMetamodel(QvtOperationalEnv qvtEnv, String metamodelUri, List<String> path) { EPackage.Registry registry = qvtEnv.getFactory().getEPackageRegistry(); List<EPackage> metamodels = new ArrayList<EPackage>(1); List<EPackage> 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); } } } 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; } }