package org.reuseware.air.language.abstractsyntax.resource.as.analysis;
import java.util.Map;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EPackage.Registry;
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.core.resources.ResourcesPlugin;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.emf.common.util.URI;
import org.reuseware.air.language.abstractsyntax.Import;
import org.reuseware.air.language.abstractsyntax.resource.as.IAsReferenceResolver;
import org.reuseware.air.language.abstractsyntax.resource.as.IAsReferenceResolveResult;
public class ImportEPackageReferenceResolver implements IAsReferenceResolver<Import,EPackage> {
public String deResolve(EPackage element, Import container, EReference reference) {
EPackage pck = (EPackage)element;
return pck.getNsURI();
}
public void resolve(String identifier, Import container, EReference reference, int position, boolean resolveFuzzy, IAsReferenceResolveResult<EPackage> result) {
Registry registry = EPackage.Registry.INSTANCE;
//EcorePlugin.getDefaultRegistryImplementation();
EPackage pck = registry.getEPackage(identifier);
if(pck!=null){
result.addMapping(identifier,pck);
}
else{
Resource resource = container.eResource();
if(resource!=null){
IPath path = new Path(resource.getURI().toPlatformString(false));
IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
IContainer asContainer = file.getParent();
EPackageVisitor visitor = new EPackageVisitor(identifier);
try{
asContainer.accept(visitor,1,true);
}
catch(CoreException e){
e.printStackTrace();
}
if(visitor.getFoundPackage()!=null){
result.addMapping(identifier,visitor.getFoundPackage());
}
}
else
result.setErrorMessage("Could not resolve imported packages neither in global registry nor in adjacent file.");
}
}
private static class EPackageVisitor implements IResourceVisitor{
private String nsuri;
private EPackage foundPackage;
public EPackageVisitor(String nsuri){
this.nsuri = nsuri;
}
public boolean visit(IResource resource) throws CoreException {
if(nsuri==null)
return false;
else if(resource instanceof IFile){
IFile file = (IFile)resource;
if("ecore".equals(file.getFileExtension())){
ResourceSet set = new ResourceSetImpl();
Resource importedResource = set.getResource(URI.createPlatformResourceURI(file.getFullPath().toString(),true),true);
for(EObject object:importedResource.getContents()){
if(object instanceof EPackage){
EPackage pckToCheck = (EPackage)object;
if(nsuri.equals(pckToCheck.getNsURI())){
foundPackage = pckToCheck;
return true;
}
}
}
}
}
return false;
}
public EPackage getFoundPackage() {
return foundPackage;
}
}
public void setOptions(Map<?, ?> options) {}
}