/*******************************************************************************
* Copyright (c) 2010-2012, Zoltan Ujhelyi, Istvan Rath and Daniel Varro
* 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:
* Zoltan Ujhelyi - initial API and implementation
*******************************************************************************/
package org.eclipse.incquery.patternlanguage.emf.scoping;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
import org.eclipse.emf.common.util.URI;
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.incquery.patternlanguage.emf.EcoreGenmodelRegistry;
import org.eclipse.xtext.naming.IQualifiedNameConverter;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.resource.EObjectDescription;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.scoping.IScope;
import org.eclipse.xtext.scoping.impl.SimpleScope;
import com.google.common.base.Function;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.inject.Inject;
public class MetamodelProviderService implements IMetamodelProvider {
@Inject
private Logger logger;
@Inject
private IQualifiedNameConverter qualifiedNameConverter;
private EcoreGenmodelRegistry genmodelRegistry;
protected EcoreGenmodelRegistry getGenmodelRegistry() {
if (genmodelRegistry == null)
genmodelRegistry = new EcoreGenmodelRegistry(logger);
return genmodelRegistry;
}
@Override
public IScope getAllMetamodelObjects(EObject context) {
final Map<String, EPackage> metamodelMap = getMetamodelMap();
Set<String> packageURIs = new HashSet<String>(metamodelMap.keySet());
Iterable<IEObjectDescription> metamodels = Iterables.transform(packageURIs,
new Function<String, IEObjectDescription>() {
@Override
public IEObjectDescription apply(String from) {
EPackage ePackage = metamodelMap.get(from);
// InternalEObject proxyPackage = (InternalEObject)
// EcoreFactory.eINSTANCE.createEPackage();
// proxyPackage.eSetProxyURI(URI.createURI(from));
QualifiedName qualifiedName = qualifiedNameConverter.toQualifiedName(from);
// return EObjectDescription.create(qualifiedName,
// proxyPackage,
// Collections.singletonMap("nsURI", "true"));
return EObjectDescription.create(qualifiedName, ePackage,
Collections.singletonMap("nsURI", "true"));
}
});
return new SimpleScope(IScope.NULLSCOPE, metamodels);
}
protected Map<String, EPackage> getMetamodelMap() {
Map<String, EPackage> packageMap = Maps.newHashMap();
Set<String> nsURISet = Sets.newHashSet(EPackage.Registry.INSTANCE.keySet());
for (String key : nsURISet) {
packageMap.put(key, EPackage.Registry.INSTANCE.getEPackage(key));
}
return packageMap;
}
@Override
public EPackage loadEPackage(String packageUri, ResourceSet resourceSet) {
if (EPackage.Registry.INSTANCE.containsKey(packageUri)) {
return EPackage.Registry.INSTANCE.getEPackage(packageUri);
}
URI uri = null;
try {
uri = URI.createURI(packageUri);
if (uri.fragment() == null) {
Resource resource = resourceSet.getResource(uri, true);
return (EPackage) resource.getContents().get(0);
}
return (EPackage) resourceSet.getEObject(uri, true);
} catch (RuntimeException ex) {
if (uri != null && uri.isPlatformResource()) {
String platformString = uri.toPlatformString(true);
URI platformPluginURI = URI.createPlatformPluginURI(platformString, true);
return loadEPackage(platformPluginURI.toString(), resourceSet);
}
logger.trace("Cannot load package with URI '" + packageUri + "'", ex);
return null;
}
}
@Override
public boolean isGeneratedCodeAvailable(EPackage ePackage, ResourceSet set) {
return getGenmodelRegistry().findGenPackage(ePackage.getNsURI(), set) != null;
}
}