From: Jan P. <jp...@us...> - 2007-01-06 14:37:18
|
Update of /cvsroot/e-p-i-c/org.epic.debug/src/org/epic/debug/util In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv14434/src/org/epic/debug/util Modified Files: AbstractPathMapper.java RemotePathMapper.java IPathMapper.java NullPathMapper.java Log Message: Implemented RFE [ 1629417 ] Better handling of remote breakpoints. Index: AbstractPathMapper.java =================================================================== RCS file: /cvsroot/e-p-i-c/org.epic.debug/src/org/epic/debug/util/AbstractPathMapper.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- AbstractPathMapper.java 12 Dec 2006 20:47:42 -0000 1.1 +++ AbstractPathMapper.java 6 Jan 2007 14:37:15 -0000 1.2 @@ -4,6 +4,7 @@ import java.util.List; import org.eclipse.core.runtime.IPath; +import org.epic.debug.db.DebuggerInterface; /** * Base class for IPathMapper implementations which translate @@ -26,7 +27,7 @@ dbPathPrefixes.add(dbPathPrefix); } - public IPath getDebuggerPath(IPath epicPath) + public IPath getDebuggerPath(IPath epicPath, DebuggerInterface db) { return swapPrefix(epicPath, epicPathPrefixes, dbPathPrefixes); } Index: NullPathMapper.java =================================================================== RCS file: /cvsroot/e-p-i-c/org.epic.debug/src/org/epic/debug/util/NullPathMapper.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- NullPathMapper.java 12 Dec 2006 20:47:42 -0000 1.1 +++ NullPathMapper.java 6 Jan 2007 14:37:15 -0000 1.2 @@ -3,6 +3,7 @@ import java.util.List; import org.eclipse.core.runtime.IPath; +import org.epic.debug.db.DebuggerInterface; /** * An implementation of IPathMapper which "translates" paths into @@ -11,11 +12,11 @@ */ public class NullPathMapper implements IPathMapper { - public IPath getDebuggerPath(IPath epicPath) + public IPath getDebuggerPath(IPath epicPath, DebuggerInterface db) { return epicPath; } - + public IPath getEpicPath(IPath dbPath) { return dbPath; Index: RemotePathMapper.java =================================================================== RCS file: /cvsroot/e-p-i-c/org.epic.debug/src/org/epic/debug/util/RemotePathMapper.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- RemotePathMapper.java 12 Dec 2006 20:47:42 -0000 1.1 +++ RemotePathMapper.java 6 Jan 2007 14:37:15 -0000 1.2 @@ -1,12 +1,14 @@ package org.epic.debug.util; import java.io.File; +import java.io.IOException; import java.util.*; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.*; import org.epic.core.PerlCore; +import org.epic.debug.db.DebuggerInterface; /** * Maps paths of a remote machine to local (EPIC) paths by attempting @@ -14,6 +16,12 @@ */ public class RemotePathMapper extends AbstractPathMapper { + private static final IPathChecker localPathChecker = new IPathChecker() { + public boolean fileExists(IPath path) + { + return path.toFile().exists(); + } }; + private final String remoteProjectDir; private final List epicInc; private List debuggerInc; @@ -29,22 +37,28 @@ addMapping(project.getLocation(), new Path(remoteProjectDir)); } + public IPath getDebuggerPath(IPath epicPath, DebuggerInterface db) + { + // Paths under project dir are handled by the superclass: + IPath ret = super.getDebuggerPath(epicPath, db); + if (ret != null) return ret; + + IPath convertedPath = convertPath( + epicPath, epicInc, debuggerInc, new RemotePathChecker(db)); + + // cache for later + if (convertedPath != null) addMapping(epicPath, convertedPath); + return convertedPath; + } + public IPath getEpicPath(IPath dbPath) { // Paths under remoteProjectDir are handled by the superclass: IPath ret = super.getEpicPath(dbPath); if (ret != null) return ret; - IPath relativePath = makeRelative(dbPath); - if (relativePath == null) return null; - - for (Iterator i = epicInc.iterator(); i.hasNext();) - { - IPath incDir = (IPath) i.next(); - IPath epicPath = incDir.append(relativePath); - if (epicPath.toFile().exists()) return epicPath; - } - return null; + return convertPath( + dbPath, debuggerInc, epicInc, localPathChecker); } public boolean requiresEffectiveIncPath() @@ -69,9 +83,27 @@ return paths; } - private IPath makeRelative(IPath dbPath) + private IPath convertPath( + IPath path, + List sourceIncDirs, + List targetIncDirs, + IPathChecker checker) { - for (Iterator i = debuggerInc.iterator(); i.hasNext();) + IPath relativePath = makeRelative(path, sourceIncDirs); + if (relativePath == null) return null; + + for (Iterator i = targetIncDirs.iterator(); i.hasNext();) + { + IPath incDir = (IPath) i.next(); + IPath convertedPath = incDir.append(relativePath); + if (checker.fileExists(convertedPath)) return convertedPath; + } + return null; + } + + private IPath makeRelative(IPath dbPath, List incDirs) + { + for (Iterator i = incDirs.iterator(); i.hasNext();) { IPath incDir = (IPath) i.next(); if (incDir.isPrefixOf(dbPath)) @@ -87,4 +119,25 @@ new Path(remoteProjectDir + "/" + folder.getProjectRelativePath().toString())); } + + private static interface IPathChecker + { + public boolean fileExists(IPath path); + } + + private static class RemotePathChecker implements IPathChecker + { + private final DebuggerInterface db; + + public RemotePathChecker(DebuggerInterface db) + { + this.db = db; + } + + public boolean fileExists(IPath path) + { + try { return db.fileExists(path); } + catch (IOException e) { return false; /* too bad :( */ } + } + } } Index: IPathMapper.java =================================================================== RCS file: /cvsroot/e-p-i-c/org.epic.debug/src/org/epic/debug/util/IPathMapper.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- IPathMapper.java 12 Dec 2006 20:47:42 -0000 1.1 +++ IPathMapper.java 6 Jan 2007 14:37:15 -0000 1.2 @@ -3,6 +3,7 @@ import java.util.List; import org.eclipse.core.runtime.IPath; +import org.epic.debug.db.DebuggerInterface; /** * Implementors are responsible for translating paths from the file @@ -14,10 +15,12 @@ /** * @param epicPath * an absolute path valid in the EPIC file system + * @param db + * interface through which the "perl -d" process can be queried * @return the corresponding absolute path valid in the debugger * file system or null if the path could not be translated */ - public IPath getDebuggerPath(IPath epicPath); + public IPath getDebuggerPath(IPath epicPath, DebuggerInterface db); /** * @param dbPath |