| package org.eclipse.dltk.launching.sourcelookup; |
| |
| import java.net.URI; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IWorkspaceRoot; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.debug.core.ILaunchConfiguration; |
| import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupParticipant; |
| import org.eclipse.dltk.debug.core.DLTKDebugConstants; |
| import org.eclipse.dltk.internal.core.DefaultWorkingCopyOwner; |
| import org.eclipse.dltk.internal.core.ScriptProject; |
| import org.eclipse.dltk.internal.debug.core.model.ScriptStackFrame; |
| import org.eclipse.dltk.internal.launching.LaunchConfigurationUtils; |
| |
| public class ScriptSourceLookupParticipant |
| extends AbstractSourceLookupParticipant { |
| |
| @Override |
| public String getSourceName(Object object) throws CoreException { |
| if (object instanceof ScriptStackFrame) { |
| final ScriptStackFrame frame = (ScriptStackFrame) object; |
| final URI uri = frame.getSourceURI(); |
| if (DLTKDebugConstants.UNKNOWN_SCHEME |
| .equalsIgnoreCase(uri.getScheme())) { |
| return null; |
| } |
| |
| String path = uri.getPath(); |
| if (path.length() == 0) { |
| return null; |
| } |
| // if (Platform.getOS().equals(Platform.OS_WIN32)) { |
| // path = path.substring(1); |
| // } |
| |
| String root = getProjectRoot(); |
| |
| // strip off the project root |
| if (path.startsWith(root) && path.charAt(root.length()) == '/') { |
| return path.substring(root.length() + 1); |
| } |
| |
| IFile[] files = getWorkspaceRoot().findFilesForLocationURI(uri); |
| |
| IProject project = LaunchConfigurationUtils |
| .getProject(getDirector().getLaunchConfiguration()); |
| for (int i = 0; i < files.length; i++) { |
| IFile file = files[i]; |
| if (file.exists()) { |
| if (file.getProject().equals(project)) { |
| return file.getProjectRelativePath().toString(); |
| } |
| } |
| } |
| return path; |
| } |
| return null; |
| } |
| |
| protected String getProjectRoot() throws CoreException { |
| IProject project = LaunchConfigurationUtils |
| .getProject(getDirector().getLaunchConfiguration()); |
| return project.getLocationURI().getPath(); |
| } |
| |
| @Override |
| public Object[] findSourceElements(Object object) throws CoreException { |
| final Object[] elements = super.findSourceElements(object); |
| if (elements != null && elements.length > 0) { |
| return elements; |
| } |
| if (object instanceof ScriptStackFrame) { |
| ScriptStackFrame frame = (ScriptStackFrame) object; |
| final URI uri = frame.getSourceURI(); |
| if (DLTKDebugConstants.UNKNOWN_SCHEME |
| .equalsIgnoreCase(uri.getScheme())) { |
| return null; |
| } |
| final String path = uri.getPath(); |
| if (path == null || path.length() == 0) { |
| return null; |
| } |
| final Path pathObj = new Path(path); |
| if (pathObj.isEmpty()) { |
| return null; |
| } |
| ILaunchConfiguration launchConfiguration = this.getDirector() |
| .getLaunchConfiguration(); |
| |
| IProject project = LaunchConfigurationUtils |
| .getProject(launchConfiguration); |
| final ProjectSourceLookup lookup = new ProjectSourceLookup(project); |
| final IProjectLookupResult result = lookup.find(pathObj); |
| if (result != null) { |
| return result.toArray(); |
| } |
| return new Object[] { new DBGPSourceModule( |
| (ScriptProject) lookup.getScriptProject(), path, |
| DefaultWorkingCopyOwner.PRIMARY, frame) }; |
| } |
| return null; |
| } |
| |
| private static IWorkspaceRoot getWorkspaceRoot() { |
| return ResourcesPlugin.getWorkspace().getRoot(); |
| } |
| } |