blob: 6040d2c3e0bb1789de591cf99aefa28129ee8e70 [file] [log] [blame]
/**
* Copyright (c) 2012 Eclipse contributors 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
*/
package org.eclipse.emf.ecore.xcore.ui;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Collection;
import java.util.Enumeration;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.common.util.UniqueEList;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xcore.interpreter.IClassLoaderProvider;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.xtext.common.types.xtext.ui.XtextResourceSetBasedProjectProvider;
import org.osgi.framework.Bundle;
public class XcoreJavaProjectProvider extends XtextResourceSetBasedProjectProvider implements IClassLoaderProvider
{
public List<IJavaProject> getJavaProjects(Resource resource)
{
List<IJavaProject> result = new UniqueEList<IJavaProject>();
GenModel genModel = (GenModel)EcoreUtil.getObjectByType(resource.getContents(), GenModelPackage.Literals.GEN_MODEL);
if (genModel != null)
{
result.add(getJavaProject(genModel.getModelDirectory()));
result.add(getJavaProject(genModel.getEditDirectory()));
result.add(getJavaProject(genModel.getEditorDirectory()));
result.add(getJavaProject(genModel.getTestsDirectory()));
}
else
{
result.add(getJavaProject(resource.getResourceSet()));
}
result.remove(null);
return result;
}
protected IJavaProject getJavaProject(String directory)
{
if (directory != null)
{
URI directoryURI = URI.createURI(directory);
if (directoryURI.segmentCount() > 0)
{
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(directoryURI.segment(0));
if (project.exists())
{
try
{
if (project.hasNature(JavaCore.NATURE_ID))
{
return JavaCore.create(project);
}
}
catch (CoreException exception)
{
// Ignore.
}
}
}
}
return null;
}
@Override
public IJavaProject getJavaProject(ResourceSet resourceSet)
{
IJavaProject result = super.getJavaProject(resourceSet);
if (result == null)
{
for (Resource resource : resourceSet.getResources())
{
URI uri = resource.getURI();
if (uri.isPlatformResource())
{
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(uri.segment(1));
if (project.exists())
{
try
{
if (project.hasNature(JavaCore.NATURE_ID))
{
result = JavaCore.create(project);
break;
}
}
catch (CoreException exception)
{
// Ignore.
}
}
}
}
}
return result;
}
public ClassLoader getClassLoader(ResourceSet resourceSet)
{
IJavaProject project = getJavaProject(resourceSet);
if (project != null)
{
IWorkspaceRoot workspaceRoot = project.getProject().getWorkspace().getRoot();
List<URL> libraryURLs = new UniqueEList<URL>();
try
{
getAllReferencedProjects(libraryURLs, new IProject[] { project.getProject() });
IClasspathEntry [] classpath = project.getResolvedClasspath(true);
if (classpath != null)
{
for (int i = 0; i < classpath.length; ++i)
{
IClasspathEntry classpathEntry = classpath[i];
switch (classpathEntry.getEntryKind())
{
case IClasspathEntry.CPE_LIBRARY:
case IClasspathEntry.CPE_CONTAINER:
{
libraryURLs.add(new URL(URI.createFileURI(classpathEntry.getPath().toString()).toString()));
break;
}
case IClasspathEntry.CPE_PROJECT:
{
IProject referencedProject = workspaceRoot.getProject(classpathEntry.getPath().segment(0));
IJavaProject referencedJavaProject = JavaCore.create(referencedProject);
IContainer container = workspaceRoot.getFolder(referencedJavaProject.getOutputLocation());
libraryURLs.add(new URL(URI.createFileURI(container.getLocation().toString() + "/").toString()));
IProjectDescription description = referencedProject.getDescription();
getAllReferencedProjects(libraryURLs, description.getReferencedProjects());
getAllReferencedProjects(libraryURLs, description.getDynamicReferences());
break;
}
case IClasspathEntry.CPE_SOURCE:
case IClasspathEntry.CPE_VARIABLE:
default:
{
break;
}
}
}
}
return new URLClassLoader(libraryURLs.toArray(new URL [libraryURLs.size()]), getClass().getClassLoader());
}
catch (MalformedURLException exception)
{
exception.printStackTrace();
}
catch (JavaModelException exception)
{
exception.printStackTrace();
}
catch (CoreException exception)
{
exception.printStackTrace();
}
}
for (Resource resource : resourceSet.getResources())
{
URI uri = resource.getURI();
if (uri.isPlatformPlugin())
{
final Bundle bundle = Platform.getBundle(uri.segments()[1]);
return
new ClassLoader()
{
@Override
public Enumeration<URL> findResources(String name) throws IOException
{
return bundle.getResources(name);
}
@Override
public URL findResource(String name)
{
return bundle.getResource(name);
}
@Override
public URL getResource(String name)
{
return findResource(name);
}
@Override
public Class<?> findClass(String name) throws ClassNotFoundException
{
return bundle.loadClass(name);
}
@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{
Class<?> clazz = findClass(name);
if (resolve)
{
resolveClass(clazz);
}
return clazz;
}
};
}
}
return null;
}
protected void getAllReferencedProjects(Collection<URL> libraryURLs, IProject [] projects) throws CoreException, MalformedURLException
{
for (int i = 0; i < projects.length; ++i)
{
IProject project = projects[i];
if (project.exists() && project.isOpen())
{
IJavaProject referencedJavaProject = JavaCore.create(project);
IContainer container = project.getWorkspace().getRoot().getFolder(referencedJavaProject.getOutputLocation());
if (libraryURLs.add(new URL(URI.createFileURI(container.getLocation().toString() + "/").toString())))
{
IProjectDescription description = project.getDescription();
getAllReferencedProjects(libraryURLs, description.getReferencedProjects());
getAllReferencedProjects(libraryURLs, description.getDynamicReferences());
}
}
}
}
}