/******************************************************************************* * Copyright (c) 2015 Pivotal, Inc. * 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 * * Contributors: * Pivotal, Inc. - initial API and implementation *******************************************************************************/ package org.springframework.ide.eclipse.boot.util; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Set; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.launching.JavaRuntime; import org.springframework.ide.eclipse.boot.core.BootActivator; public class JavaProjectUtil { public static List<File> getNonSystemJarDependencies(IJavaProject jp, boolean reverse) { try { String[] paths = JavaRuntime.computeDefaultRuntimeClassPath(jp); if (paths!=null && paths.length>0) { LinkedList<File> jars = new LinkedList<File>(); for (String path : paths) { if (path!=null) { File jar = new File(path); if (FileUtil.isJarFile(jar)) { if (reverse) { jars.addFirst(jar); } else { jars.add(jar); } } } } return jars; } } catch (Exception e) { BootActivator.log(e); } return Collections.emptyList(); } /** * Get IFile handle relative to project's default output folder. */ public static IFile getOutputFile(IJavaProject jp, String relativePath) { return getOutputFile(jp, new Path(relativePath)); } public static IFile getOutputFile(IJavaProject jp, IPath relativePath) { try { IPath loc = jp.getOutputLocation().append(relativePath); String pname = loc.segment(0); return ResourcesPlugin.getWorkspace().getRoot().getProject(pname).getFile(loc.removeFirstSegments(1)); } catch (Exception e) { BootActivator.log(e); } return null; } /** * Retrieve the source folders in a given IProject. When IProject is * not an accessible {@link IJavaProject} this returns an empty array. */ public static IContainer[] getSourceFolders(IProject p) { try { if (p!=null && p.isAccessible() && p.hasNature(JavaCore.NATURE_ID)) { return getSourceFolders(JavaCore.create(p), true); } } catch (Exception e) { BootActivator.log(e); } return new IContainer[0]; } /** * Retrieve the source folders in a given IJavaProject. Note that the source folders * might not all be IFolder instances because it is possible for an IJavaProject's root to * be a source folder. In this case the 'folder' will be an IProject instance instead of * a IFolder. */ public static IContainer[] getSourceFolders(IJavaProject jp, boolean includeDerived) { try { ArrayList<IContainer> sourceFolders = new ArrayList<IContainer>(); IClasspathEntry[] cp = jp.getResolvedClasspath(true); for (IClasspathEntry cpe : cp) { try { if (cpe.getEntryKind()==IClasspathEntry.CPE_SOURCE) { IContainer sf = getProjectOrFolder(cpe.getPath()); if (sf!=null && sf.exists()) { if (includeDerived || !sf.isDerived()) { sourceFolders.add(sf); } } } } catch (Exception e) { BootActivator.log(e); } } return sourceFolders.toArray(new IContainer[sourceFolders.size()]); } catch (Exception e) { BootActivator.log(e); return new IContainer[0]; } } public static IContainer getProjectOrFolder(IPath path) { if (path.segmentCount()>1) { return ResourcesPlugin.getWorkspace().getRoot().getFolder(path); } else if (path.segmentCount()==1) { return ResourcesPlugin.getWorkspace().getRoot().getProject(path.segment(0)); } return null; } public static Set<IContainer> getOutputFolders(IJavaProject jp) { IContainer defaultOutput = getDefaultOutputFolder(jp); if (defaultOutput!=null) { return Collections.singleton(getDefaultOutputFolder(jp)); } else { return Collections.emptySet(); } //TODO: other output folders (i.e indivudla source folders can specifiy separate output folders) } public static IContainer getDefaultOutputFolder(IJavaProject jp) { try { IPath loc = jp.getOutputLocation(); String pname = loc.segment(0); if (loc.segmentCount()==1) { //project is its own output folder. Discouraged... but possible return ResourcesPlugin.getWorkspace().getRoot().getProject(pname); } else { return ResourcesPlugin.getWorkspace().getRoot().getProject(pname).getFolder(loc.removeFirstSegments(1)); } } catch (Exception e) { BootActivator.log(e); } return null; } }