/******************************************************************************* * Copyright (c) 2009 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.ICommand; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.internal.core.JavaModelManager; /** * @author Alexey Kazakov, Viacheslav Kabanovich */ public class EclipseUtil { public static IJavaProject getJavaProject(IProject project) { try { if(project == null || !project.isOpen()) return null; if(!project.hasNature(JavaCore.NATURE_ID)) return null; return JavaCore.create(project); } catch (CoreException e) { CommonPlugin.getPluginLog().logError(e); return null; } } public static String getJavaProjectOutputLocation(IProject project) { IJavaProject javaProject = getJavaProject(project); if(javaProject == null) return null; try { IPath p = javaProject.getOutputLocation(); IResource r = project.getWorkspace().getRoot().findMember(p); return (r == null || r.getLocation() == null) ? null : r.getLocation().toString(); } catch (CoreException e) { CommonPlugin.getPluginLog().logError(e); return null; } } public static IResource[] getJavaSourceRoots(IProject project) { IJavaProject javaProject = getJavaProject(project); if(javaProject == null) return null; List<IResource> resources = new ArrayList<IResource>(); try { IClasspathEntry[] es = javaProject.getResolvedClasspath(true); for (int i = 0; i < es.length; i++) { if(es[i].getEntryKind() == IClasspathEntry.CPE_SOURCE) { IResource findMember = ResourcesPlugin.getWorkspace().getRoot().findMember(es[i].getPath()); if(findMember != null && findMember.exists()) { resources.add(findMember); } } } } catch(CoreException ce) { CommonPlugin.getPluginLog().logError("Error while locating java source roots for " + project, ce); //$NON-NLS-1$ } return resources.toArray(new IResource[resources.size()]); } /** * Returns compilation unit for file, if it exists in Java model, otherwise returns null. * * @param f * @return compilation unit for file, if it exists in Java model, otherwise null * @throws CoreException */ public static ICompilationUnit getCompilationUnit(IFile f) { IJavaProject jp = getJavaProject(f.getProject()); if(jp != null) { IPackageFragment pkg = (IPackageFragment)JavaModelManager.determineIfOnClasspath(f, jp); if(pkg != null) { ICompilationUnit result = pkg.getCompilationUnit(f.getName()); return (result.exists()) ? result : null; } } return null; } public static void addNatureToProject(IProject project, String natureId) throws CoreException { IProject proj = project.getProject(); IProjectDescription description = proj.getDescription(); String[] prevNatures = description.getNatureIds(); if (findIndex(prevNatures, natureId) != -1) return; description.setNatureIds(append(prevNatures, natureId)); proj.setDescription(description, null); } public static void addBuilderToProject(IProject project, String builderId) throws CoreException { IProjectDescription desc = project.getDescription(); ICommand[] existing = desc.getBuildSpec(); for (ICommand command : existing) { if(builderId.equals(command.getBuilderName())) { return; } } ICommand[] cmds = new ICommand[existing.length + 1]; ICommand newcmd = project.getDescription().newCommand(); newcmd.setBuilderName(builderId); cmds[0] = newcmd; System.arraycopy(existing, 0, cmds, 1, existing.length ); desc.setBuildSpec(cmds); project.setDescription(desc, null); } public static void removeNatureFromProject(IProject project, String natureId) throws CoreException { IProject proj = project.getProject(); IProjectDescription description = proj.getDescription(); String[] prevNatures = description.getNatureIds(); int natureIndex = findIndex(prevNatures, natureId); if(natureIndex == -1) return; description.setNatureIds(remove(prevNatures, natureIndex)); proj.setDescription(description, null); } protected static String[] remove(String[] os, int index) { String[] ns = new String[os.length - 1]; System.arraycopy(os, 0, ns, 0, index); System.arraycopy(os, index + 1, ns, index, os.length - (index + 1)); return ns; } protected static int findIndex(String[] os, String s) { for (int i = 0; i < os.length; i++) if(os[i].equals(s)) return i; return -1; } protected static String[] append(String[] os, String s) { String[] ns = new String[os.length + 1]; System.arraycopy(os, 0, ns, 0, os.length); ns[os.length] = s; return ns; } }