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; } }