package org.bndtools.utils.javaproject;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
public class JavaProjectUtils {
/**
* Access the project's (Eclipse) classpath to determine the source directories and their output directories
*
* @param project
* the project
* @return a map of source directories and their output directories, all relative to the project directory. empty
* map when project is null or when an error occurred.
*/
static public Map<String,String> getSourceOutputLocations(IJavaProject project) {
if (project == null) {
return Collections.emptyMap();
}
IClasspathEntry[] classPathEntries = null;
IPath defaultOutputLocation = null;
try {
classPathEntries = project.getRawClasspath();
defaultOutputLocation = project.getOutputLocation();
} catch (Throwable e) {
return Collections.emptyMap();
}
if (classPathEntries == null || defaultOutputLocation == null) {
return Collections.emptyMap();
}
IPath projectPath = project.getPath();
Map<String,String> sourceOutputLocations = new LinkedHashMap<String,String>();
for (IClasspathEntry classPathEntry : classPathEntries) {
if (classPathEntry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
IPath src = classPathEntry.getPath();
IPath bin = classPathEntry.getOutputLocation();
if (bin == null) {
bin = defaultOutputLocation;
}
assert (src != null);
assert (bin != null);
sourceOutputLocations.put(src.makeRelativeTo(projectPath).toString(), bin.makeRelativeTo(projectPath).toString());
}
}
return sourceOutputLocations;
}
public static final String PATH_JRE_CONTAINER = "org.eclipse.jdt.launching.JRE_CONTAINER";
public static final String PATH_JRE_STANDARD_VM = "org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType";
private static enum JavaLevel {
J2SE_1_2("J2SE-1.2", "1.2"), J2SE_1_3("J2SE-1.3", "1.3"), J2SE_1_4("J2SE-1.4", "1.4"), J2SE_1_5("J2SE-1.5", "1.5"), JAVASE_1_6("JavaSE-1.6", "1.6"), JAVASE_1_7("JavaSE-1.7", "1.7"), JAVASE_1_8("JavaSE-1.8",
"1.8"), JAVASE_1_9("JavaSE-1.9", "1.9");
private final String label;
private final String level;
JavaLevel(String label, String level) {
this.label = label;
this.level = level;
}
String getLevel() {
return level;
}
static JavaLevel fromLabel(String label) {
for (JavaLevel level : JavaLevel.values()) {
if (level.label.equals(label))
return level;
}
throw new IllegalArgumentException("Unrecognized Java compliance level: " + label);
}
}
public static String getJavaLevel(IJavaProject project) throws Exception {
IClasspathEntry[] classpathEntries = project.getRawClasspath();
for (IClasspathEntry classpathEntry : classpathEntries) {
if (classpathEntry.getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
IPath path = classpathEntry.getPath();
if (path == null || path.segmentCount() < 3)
continue;
if (PATH_JRE_CONTAINER.equals(path.segment(0)) && PATH_JRE_STANDARD_VM.equals(path.segment(1))) {
String jreName = path.segment(2);
return JavaLevel.fromLabel(jreName).getLevel();
}
}
}
throw new IllegalArgumentException("No standard JRE container found on project classpath");
}
}