package net.sourceforge.phpeclipse.xdebug.php.launching;
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sourceforge.phpeclipse.xdebug.core.PathMapItem;
import net.sourceforge.phpeclipse.xdebug.php.model.XDebugStackFrame;
+import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupParticipant;
+import org.eclipse.debug.core.sourcelookup.ISourceContainer;
+import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
public class PHPSourceLookupParticipant extends AbstractSourceLookupParticipant {
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant#getSourceName(Object)
+ */
public String getSourceName(Object object) throws CoreException {
if (object instanceof XDebugStackFrame) {
- return ((XDebugStackFrame)object).getSourceName();
+ return ((XDebugStackFrame) object).getSourceName();
}
return null;
}
-}
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant#findSourceElements(java.lang.Object)
+ */
+ public Object[] findSourceElements(Object object) throws CoreException {
+ if (object == null) {
+ return new Object[] {};
+ }
+ XDebugStackFrame stackFrame = null;
+ if (object instanceof XDebugStackFrame) {
+ stackFrame = (XDebugStackFrame) object;
+ } else {
+ return new Object[] {};
+ }
+
+ List results = null;
+ CoreException single = null;
+ MultiStatus multiStatus = null;
+
+ if (isFindDuplicates()) {
+ results = new ArrayList();
+ }
+
+ String name = getSourceName(object);
+ if (name == null || name.length() == 0) {
+ return new Object[] {};
+ }
+
+ // here our stackframe is guaranteed not to be null
+ IPath sLocalPath = null;
+
+ if (((XDebugStackFrame) object).getThread() == null) {
+ IPath sPath = new Path(stackFrame.getFullName().getPath());
+ List pathMap = getDirector().getLaunchConfiguration()
+ .getAttribute(IXDebugConstants.ATTR_PHP_PATHMAP, (List) null);
+
+ PathMapItem pmi = null;
+ for (int k = 0; k < pathMap.size(); k++) {
+ pmi = new PathMapItem((String) pathMap.get(k));
+
+ IPath local = new Path(pmi.getLocalPath().toString())/* .removeFirstSegments(1) */;
+ IPath remote = new Path(pmi.getRemotePath().toString())/* .removeFirstSegments(1) */;
+
+ if (remote.matchingFirstSegments(sPath) == remote.segmentCount()) {
+ sLocalPath = local;
+ }
+ }
+ } else {
+
+ }
+
+ String Type = stackFrame.getType();
+
+ if (Type.equals("eval")) {
+ results.add("pippo");
+ return results.toArray();
+ }
+
+ ISourceContainer[] containers = getSourceContainers();
+ for (int i = 0; i < containers.length; i++) {
+ ISourceContainer container = getDelegateContainer(containers[i]);
+ if (container == null) {
+ continue;
+ }
+
+ try {
+ Object[] objects = container.findSourceElements(name);
+ if (objects.length > 0) {
+ if (isFindDuplicates()) {
+ if (((XDebugStackFrame) object).getThread() == null) {
+ addMatching(results, sLocalPath, objects);
+ } else {
+ return objects;
+ }
+ } else {
+ if (objects.length == 1) {
+ return objects;
+ }
+ return new Object[] { objects[0] };
+ }
+ }
+ } catch (CoreException e) {
+ if (single == null) {
+ single = e;
+ } else if (multiStatus == null) {
+ multiStatus = new MultiStatus(DebugPlugin
+ .getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR,
+ new IStatus[] { single.getStatus() },
+ SourceLookupMessages.CompositeSourceContainer_0,
+ null);
+ multiStatus.add(e.getStatus());
+ } else {
+ multiStatus.add(e.getStatus());
+ }
+ }
+ }
+ if (results == null) {
+ if (multiStatus != null) {
+ throw new CoreException(multiStatus);
+ } else if (single != null) {
+ throw single;
+ }
+ return EMPTY;
+ }
+ return results.toArray();
+ }
+
+ static void addMatching(List results, IPath localPath, Object[] objects) {
+ if (results == null || localPath == null || objects == null) {
+ return;
+ }
+ for (int j = 0; j < objects.length; j++) {
+ if (objects[j] == null || !(objects[j] instanceof IFile)) {
+ continue;
+ }
+ IFile file = (IFile) objects[j];
+
+ IPath path = new Path(file.getFullPath().toString());
+ if (localPath.matchingFirstSegments(path) == localPath
+ .segmentCount()) {
+ results.add(objects[j]);
+ }
+ }
+ }
+}
\ No newline at end of file