package runjettyrun.utils;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IFolder;
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.core.runtime.Path;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaModel;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.core.JavaProject;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
import org.eclipse.jdt.launching.IRuntimeClasspathEntry2;
import org.eclipse.jdt.launching.JavaRuntime;
import runjettyrun.Plugin;
public class RunJettyRunClasspathUtil {
public static List<IRuntimeClasspathEntry> getProjectClasspathsForUserlibs(IJavaProject project,boolean isMaven) throws CoreException{
if(!isMaven){
IClasspathEntry[] entries = project.getRawClasspath();
List<IRuntimeClasspathEntry> classpathEntries = new ArrayList<IRuntimeClasspathEntry>();
Set<IPath> sourceTargets = new HashSet<IPath>();
for (int i = 0; i < entries.length; i++) {
IClasspathEntry entry = entries[i];
switch (entry.getEntryKind()) {
case IClasspathEntry.CPE_CONTAINER:
IClasspathContainer container = JavaCore.getClasspathContainer(entry.getPath(), project);
if (container != null) {
switch (container.getKind()) {
case IClasspathContainer.K_DEFAULT_SYSTEM:
// classpathEntries.add(JavaRuntime.newRuntimeContainerClasspathEntry(container.getPath(), IRuntimeClasspathEntry.STANDARD_CLASSES, project));
break;
default:
classpathEntries.add(JavaRuntime.newRuntimeContainerClasspathEntry(container.getPath(), IRuntimeClasspathEntry.USER_CLASSES, project));
break;
}
}
break;
case IClasspathEntry.CPE_LIBRARY:
classpathEntries.add(JavaRuntime.newArchiveRuntimeClasspathEntry(entry.getPath()));
break;
case IClasspathEntry.CPE_PROJECT:
IResource ir = ResourcesPlugin.getWorkspace().getRoot().findMember(entry.getPath());
if( ir != null){
IJavaProject proj = JavaCore.create(ir.getProject());
if ( proj != project){ //I am not sure if proj will be project or not actually.
classpathEntries.add(JavaRuntime.newProjectRuntimeClasspathEntry(proj));
}
}
break;
case IClasspathEntry.CPE_SOURCE:
IPath path = entry.getOutputLocation();
if (path != null && !sourceTargets.contains(path)) {
sourceTargets.add(path);
classpathEntries.add(JavaRuntime.newArchiveRuntimeClasspathEntry(path));
}
default:
break;
}
}
if(!sourceTargets.contains(project.getOutputLocation())){ //add project default output
classpathEntries.add(JavaRuntime.newArchiveRuntimeClasspathEntry(project.getOutputLocation()));
}
// Resolve the entries to actual file/folder locations.
return classpathEntries;
}else{
IRuntimeClasspathEntry[] entries = resolveOutputLocations(project);
List<IRuntimeClasspathEntry> entryList = new ArrayList<IRuntimeClasspathEntry>(entries.length);
for (int j = 0; j < entries.length; j++) {
IRuntimeClasspathEntry e = entries[j];
if (!(entryList.contains(e))){
entryList.add(e);
}
}
return entryList;
}
}
public static IRuntimeClasspathEntry[] getDefaultWebAppClasspaths(
ILaunchConfiguration configuration) throws CoreException {
IJavaProject proj = JavaRuntime.getJavaProject(configuration);
if (proj == null) {
Plugin.logError("No project!");
throw new IllegalArgumentException("project is null");
}
IRuntimeClasspathEntry[] entries = RunJettyRunClasspathUtil
.filterWebInfLibs(
JavaRuntime.computeUnresolvedRuntimeClasspath(proj),
configuration);
// Remove JRE entry/entries.
IRuntimeClasspathEntry stdJreEntry = JavaRuntime
.computeJREEntry(configuration);
IRuntimeClasspathEntry projJreEntry = JavaRuntime.computeJREEntry(proj);
List<IRuntimeClasspathEntry> entryList = new ArrayList<IRuntimeClasspathEntry>(
entries.length);
for (int i = 0; i < entries.length; i++) {
IRuntimeClasspathEntry entry = entries[i];
if (entry.equals(stdJreEntry))
continue;
if (entry.equals(projJreEntry))
continue;
entryList.add(entry);
}
// Resolve the entries to actual file/folder locations.
entries = entryList.toArray(new IRuntimeClasspathEntry[0]);
return entries;
}
public static List<IRuntimeClasspathEntry> getWebInfLibRuntimeClasspathEntrys(ILaunchConfiguration configuration){
List<IRuntimeClasspathEntry> result = new ArrayList<IRuntimeClasspathEntry>();
IFolder lib = getWebInfLib(configuration);
if (lib == null || !lib.exists()) {
return result;
}
try{
IResource[] resources = lib.members();
for(IResource res:resources){
if("jar".equalsIgnoreCase(res.getFileExtension())){
result.add(JavaRuntime.newArchiveRuntimeClasspathEntry(res));
}
}
}catch(CoreException e){
e.printStackTrace();
}
return result;
}
public static Set<String> getWebInfLibLocations(ILaunchConfiguration configuration){
HashSet<String> result = new HashSet<String>();
IFolder lib = getWebInfLib(configuration);
if (lib == null || !lib.exists()) {
return result;
}
try{
IResource[] resources = lib.members();
for(IResource res:resources){
if("jar".equalsIgnoreCase(res.getFileExtension())){
result.add(res.getLocation().toOSString());
}
}
}catch(CoreException e){
e.printStackTrace();
}
return result;
}
public static boolean isDefaultProjectClasspathEntry(IRuntimeClasspathEntry entry){
if(entry instanceof IRuntimeClasspathEntry2){
IRuntimeClasspathEntry2 item = (IRuntimeClasspathEntry2)entry;
if("org.eclipse.jdt.launching.classpathentry.defaultClasspath".equals(item.getTypeId())){
return true;
}
}
return false;
}
public static IFolder getWebInf(ILaunchConfiguration configuration){
IJavaModel javaModel = JavaCore.create(ResourcesPlugin.getWorkspace()
.getRoot());
String projectName = null;
String webAppDirName = null;
try {
projectName = configuration.getAttribute(
IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, "");
webAppDirName = configuration.getAttribute(Plugin.ATTR_WEBAPPDIR,
"");
} catch (CoreException e) {
Plugin.logError(e);
}
if (projectName == null || projectName.trim().equals("")
|| webAppDirName == null || webAppDirName.trim().equals("")) {
return null;
}
IJavaProject project = javaModel.getJavaProject(projectName);
if (project == null) {
return null;
}
// this should be fine since the plugin checks whether WEB-INF exists
IFolder webInfDir = ProjectUtil.getWebappFolder(project.getProject(), webAppDirName).getFolder(
new Path("WEB-INF"));
if (webInfDir == null || !webInfDir.exists()) {
return null;
}
return webInfDir;
}
public static IFolder getWebInfLib(ILaunchConfiguration configuration){
// this should be fine since the plugin checks whether WEB-INF exists
IFolder webInfDir = getWebInf(configuration);
if (webInfDir == null || !webInfDir.exists()) {
return null;
}
IFolder lib = webInfDir.getFolder("lib");
if (lib == null || !lib.exists()) {
return null;
}
return lib;
}
public static IRuntimeClasspathEntry[] filterWebInfLibs(
IRuntimeClasspathEntry[] defaults,
ILaunchConfiguration configuration) {
IFolder lib = getWebInfLib(configuration);
if (lib == null || !lib.exists()) {
return defaults;
}
// ok, so we have a WEB-INF/lib dir, which means that we should filter
// out the entries in there since if the user wants those entries, they
// should be part of the project definition already
List<IRuntimeClasspathEntry> keep = new ArrayList<IRuntimeClasspathEntry>();
for (int i = 0; i < defaults.length; i++) {
if (defaults[i].getType() != IRuntimeClasspathEntry.ARCHIVE) {
keep.add(defaults[i]);
continue;
}
IResource resource = defaults[i].getResource();
if (resource != null && !resource.getParent().equals(lib)) {
keep.add(defaults[i]);
continue;
}
}
return keep.toArray(new IRuntimeClasspathEntry[keep.size()]);
}
private static IRuntimeClasspathEntry[] resolveOutputLocations(IJavaProject project) throws CoreException {
if(project == null){
throw new IllegalArgumentException("project shouldn't be null");
}
List<IPath> nonDefault = new ArrayList<IPath>();
if (project.exists() && project.getProject().isOpen()) {
IClasspathEntry entries[] = project.getRawClasspath();
for (int i = 0; i < entries.length; i++) {
IClasspathEntry classpathEntry = entries[i];
if (classpathEntry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
IPath path = classpathEntry.getOutputLocation();
if (path != null) {
nonDefault.add(path);
}
}
}
}
// add the default location if not already included
IPath def = project.getOutputLocation();
if (!nonDefault.contains(def)) {
nonDefault.add(def);
}
IRuntimeClasspathEntry[] locations = new IRuntimeClasspathEntry[nonDefault.size()];
for (int i = 0; i < locations.length; i++) {
locations[i] = JavaRuntime.newArchiveRuntimeClasspathEntry((IPath)nonDefault.get(i));
}
return locations;
}
}