blob: 6811290430bb71a4ac76683408096416885ab26d [file] [log] [blame]
package org.eclipse.dltk.internal.launching;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
import org.eclipse.debug.core.sourcelookup.containers.DirectorySourceContainer;
import org.eclipse.debug.core.sourcelookup.containers.FolderSourceContainer;
import org.eclipse.debug.core.sourcelookup.containers.ProjectSourceContainer;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.launching.IRuntimeBuildpathEntry;
import org.eclipse.dltk.launching.sourcelookup.containers.BuildpathContainerSourceContainer;
import org.eclipse.dltk.launching.sourcelookup.containers.ScriptProjectSourceContainer;
/**
* Script source lookup utilities.
*/
public class ScriptSourceLookupUtil {
/**
* Translate the runtime buildpath entries into a set of source containers.
*
* @param entries
* build path entries
*
* @return source container representation of the build path entries
*/
public static ISourceContainer[] translate(
IRuntimeBuildpathEntry[] entries) {
List<ISourceContainer> containers = new ArrayList<>(entries.length);
for (int i = 0; i < entries.length; i++) {
IRuntimeBuildpathEntry entry = entries[i];
ISourceContainer container = null;
switch (entry.getType()) {
case IRuntimeBuildpathEntry.PROJECT:
container = createProjectContainer(entry);
break;
case IRuntimeBuildpathEntry.ARCHIVE:
container = createArchivePathContainer(entry);
break;
case IRuntimeBuildpathEntry.SOURCE:
container = createBuildPathContainer(entry);
break;
default:
// TODO: support other entry types?
break;
}
// only add if a container was created
if (container != null) {
containers.add(container);
}
}
return containers.toArray(new ISourceContainer[containers.size()]);
}
private static ISourceContainer createArchivePathContainer(
IRuntimeBuildpathEntry entry) {
// getPath works, use that?
return new BuildpathContainerSourceContainer(entry.getLocation());
}
private static ISourceContainer createBuildPathContainer(
IRuntimeBuildpathEntry entry) {
ISourceContainer container = null;
String path = entry.getLocation();
File file = new File(path);
if (file.isDirectory()) {
IResource resource = entry.getResource();
if (resource instanceof IContainer) {
container = new FolderSourceContainer((IContainer) resource,
false);
} else {
container = new DirectorySourceContainer(file, false);
}
} else {
container = new BuildpathContainerSourceContainer(path);
}
return container;
}
private static ISourceContainer createProjectContainer(
IRuntimeBuildpathEntry entry) {
IResource resource = entry.getResource();
ISourceContainer container = null;
if (resource != null && resource.getType() == IResource.PROJECT) {
IScriptProject project = DLTKCore.create((IProject) resource);
if (project.exists()) {
container = new ScriptProjectSourceContainer(project);
} else if (resource.exists()) {
container = new ProjectSourceContainer((IProject) resource,
false);
}
}
return container;
}
}