package org.rascalmpl.eclipse.library.lang.java.jdt.internal; import java.net.URISyntaxException; import java.util.Map; import java.util.Map.Entry; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.rascalmpl.interpreter.utils.RuntimeExceptionFactory; import io.usethesource.vallang.IMap; import io.usethesource.vallang.IMapWriter; import io.usethesource.vallang.ISet; import io.usethesource.vallang.ISetWriter; import io.usethesource.vallang.ISourceLocation; import io.usethesource.vallang.IValueFactory; /** * This class provides access to the Eclipse Java Compiler and knows about the structure * and configuration of Eclipse Java projects */ public class EclipseProject { private final IValueFactory VF; public EclipseProject(IValueFactory vf) { this.VF = vf; } public ISet sourceRootsForProject(ISourceLocation loc) { try { IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(loc.getAuthority()); if (project == null || !project.isOpen()) { throw RuntimeExceptionFactory.io(VF.string("project " + loc.getAuthority() + " could not be opened."), null, null); } IJavaProject jProject = JavaCore.create(project); ISetWriter result = VF.setWriter(); for (IPackageFragmentRoot root : jProject.getAllPackageFragmentRoots()) { if (root.getKind() == IPackageFragmentRoot.K_SOURCE) { IResource resource = root.getResource(); IProject thisProject = resource.getProject(); if (thisProject == project) { result.insert(VF.sourceLocation("file", "", resource.getLocation().toString())); } } } return result.done(); } catch (JavaModelException | URISyntaxException e) { throw RuntimeExceptionFactory.io(VF.string(e.getMessage()), null, null); } } public ISet classPathForProject(ISourceLocation loc) { try { IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(loc.getAuthority()); if (project == null || !project.isOpen()) { throw RuntimeExceptionFactory.io(VF.string("project " + loc.getAuthority() + " could not be opened."), null, null); } IJavaProject jProject = JavaCore.create(project); ISetWriter result = VF.setWriter(); for (IPackageFragmentRoot root : jProject.getAllPackageFragmentRoots()) { if (root.getKind() == IPackageFragmentRoot.K_BINARY) { IPath path = root.getPath(); if (!root.isExternal()) { // Need to make the path for all non-external package fragment roots into absolute paths path = root.getResource().getLocation(); } result.insert(VF.sourceLocation("file", "", path.toString())); } if (root.getKind() == IPackageFragmentRoot.K_SOURCE) { IResource resource = root.getResource(); IProject thisProject = resource.getProject(); if (thisProject != project) { result.insert(VF.sourceLocation("file", "", resource.getLocation().toString())); } } } return result.done(); } catch (JavaModelException | URISyntaxException e) { throw RuntimeExceptionFactory.io(VF.string(e.getMessage()), null, null); } } public IMap getProjectOptions(ISourceLocation loc) { IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(loc.getAuthority()); if (project == null || !project.isOpen()) { throw RuntimeExceptionFactory.io(VF.string("project " + loc.getAuthority() + " could not be opened."), null, null); } IJavaProject jProject = JavaCore.create(project); IMapWriter result = VF.mapWriter(); @SuppressWarnings("unchecked") Map<String,String> options = jProject.getOptions(true); for (Entry<String,String> entry : options.entrySet()) { result.put(VF.string(entry.getKey()), VF.string(entry.getValue())); } return result.done(); } }