package org.xrepl.ui; import static com.google.common.collect.Sets.newHashSet; import static org.eclipse.emf.common.util.URI.createPlatformResourceURI; import java.net.URL; import java.net.URLClassLoader; import java.util.Set; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.runtime.IPath; import org.eclipse.emf.common.util.URI; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.xtext.Constants; import org.eclipse.xtext.resource.XtextResourceSet; import org.eclipse.xtext.xbase.interpreter.IExpressionInterpreter; import org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter; import org.xrepl.DefaultEvaluator; import org.xrepl.XreplResourceSetProvider; import com.google.inject.Inject; import com.google.inject.name.Named; @SuppressWarnings("restriction") public class WorkspaceAwareEvaluator extends DefaultEvaluator { @Inject public WorkspaceAwareEvaluator(IExpressionInterpreter interpreter, XreplResourceSetProvider resourceSetProvider, @Named(Constants.FILE_EXTENSIONS) String fileExtension) { super(interpreter, resourceSetProvider, fileExtension); configure(interpreter); } @Override protected URI newResourceUri() { return createPlatformResourceURI("." + getFileExtension() + "/src/" + newResourceName(), true); } protected void configure(IExpressionInterpreter interpreter) { if (!(interpreter instanceof XbaseInterpreter)) { return; } if (!(getResourceSet() instanceof XtextResourceSet)) { return; } ClassLoader cl = getClass().getClassLoader(); Object context = ((XtextResourceSet) getResourceSet()) .getClasspathURIContext(); if (!(context instanceof IJavaProject)) { return; } try { final IJavaProject jp = (IJavaProject) context; IClasspathEntry[] classpath = jp.getResolvedClasspath(true); final IWorkspaceRoot root = jp.getProject().getWorkspace() .getRoot(); Set<URL> urls = newHashSet(); for (int i = 0; i < classpath.length; i++) { final IClasspathEntry entry = classpath[i]; if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE) { IPath outputLocation = entry.getOutputLocation(); if (outputLocation == null) { outputLocation = jp.getOutputLocation(); } IFolder folder = root.getFolder(outputLocation); if (folder.exists()) { urls.add(new URL(folder.getRawLocationURI() .toASCIIString() + "/")); } } else if (entry.getEntryKind() == IClasspathEntry.CPE_PROJECT) { IPath outputLocation = entry.getOutputLocation(); if (outputLocation == null) { IProject project = (IProject) jp.getProject() .getWorkspace().getRoot() .getContainerForLocation(entry.getPath()); IJavaProject javaProject = JavaCore.create(project); outputLocation = javaProject.getOutputLocation(); } IFolder folder = root.getFolder(outputLocation); if (folder.exists()) { urls.add(new URL(folder.getRawLocationURI() .toASCIIString() + "/")); } } else { urls.add(entry.getPath().toFile().toURI().toURL()); } } cl = new URLClassLoader(urls.toArray(new URL[urls.size()])); } catch (Exception e) { e.printStackTrace(); } ((XbaseInterpreter) interpreter).setClassLoader(cl); } }