Importing the XDebugProxy code in the HEAD. The repo was tagged with T_BEFORE_XDEBUGP...
[phpeclipse.git] / net.sourceforge.phpeclipse.xdebug.core / src / net / sourceforge / phpeclipse / xdebug / php / launching / PHPSourceLookupParticipant.java
1 package net.sourceforge.phpeclipse.xdebug.php.launching;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import net.sourceforge.phpeclipse.xdebug.core.PathMapItem;
7 import net.sourceforge.phpeclipse.xdebug.php.model.XDebugStackFrame;
8
9 import org.eclipse.core.resources.IFile;
10 import org.eclipse.core.runtime.CoreException;
11 import org.eclipse.core.runtime.IPath;
12 import org.eclipse.core.runtime.IStatus;
13 import org.eclipse.core.runtime.MultiStatus;
14 import org.eclipse.core.runtime.Path;
15 import org.eclipse.debug.core.DebugPlugin;
16 import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupParticipant;
17 import org.eclipse.debug.core.sourcelookup.ISourceContainer;
18 import org.eclipse.debug.internal.core.sourcelookup.SourceLookupMessages;
19
20 public class PHPSourceLookupParticipant extends AbstractSourceLookupParticipant {
21
22         /* (non-Javadoc)
23          * @see org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant#getSourceName(Object)
24          */
25         public String getSourceName(Object object) throws CoreException {
26                 if (object instanceof XDebugStackFrame) {
27                         return ((XDebugStackFrame) object).getSourceName();
28                 }
29                 return null;
30         }
31
32         /* (non-Javadoc)
33          * @see org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant#findSourceElements(java.lang.Object)
34          */
35         public Object[] findSourceElements(Object object) throws CoreException {
36                 if (object == null) {
37                         return new Object[] {};
38                 }
39                 XDebugStackFrame stackFrame = null;
40                 if (object instanceof XDebugStackFrame) {
41                         stackFrame = (XDebugStackFrame) object;
42                 } else {
43                         return new Object[] {};
44                 }
45
46                 List results = null;
47                 CoreException single = null;
48                 MultiStatus multiStatus = null;
49
50                 if (isFindDuplicates()) {
51                         results = new ArrayList();
52                 }
53
54                 String name = getSourceName(object);
55                 if (name == null || name.length() == 0) {
56                         return new Object[] {};
57                 }
58
59                 // here our stackframe is guaranteed not to be null
60                 IPath sLocalPath = null;
61
62                 if (((XDebugStackFrame) object).getThread() == null) {
63                         IPath sPath = new Path(stackFrame.getFullName().getPath());
64                         List pathMap = getDirector().getLaunchConfiguration()
65                                         .getAttribute(IXDebugConstants.ATTR_PHP_PATHMAP, (List) null);
66         
67                         PathMapItem pmi = null;
68                         for (int k = 0; k < pathMap.size(); k++) {
69                                 pmi = new PathMapItem((String) pathMap.get(k));
70         
71                                 IPath local = new Path(pmi.getLocalPath().toString())/* .removeFirstSegments(1) */;
72                                 IPath remote = new Path(pmi.getRemotePath().toString())/* .removeFirstSegments(1) */;
73         
74                                 if (remote.matchingFirstSegments(sPath) == remote.segmentCount()) {
75                                         sLocalPath = local;
76                                 }
77                         }
78                 } else {
79                         
80                 }
81
82                 String Type = stackFrame.getType();
83
84                 if (Type.equals("eval")) {
85                         results.add("pippo");
86                         return results.toArray();
87                 }
88
89                 ISourceContainer[] containers = getSourceContainers();
90                 for (int i = 0; i < containers.length; i++) {
91                         ISourceContainer container = getDelegateContainer(containers[i]);
92                         if (container == null) {
93                                 continue;
94                         }
95
96                         try {
97                                 Object[] objects = container.findSourceElements(name);
98                                 if (objects.length > 0) {
99                                         if (isFindDuplicates()) {
100                                                 if (((XDebugStackFrame) object).getThread() == null) {
101                                                         addMatching(results, sLocalPath, objects);
102                                                 } else {
103                                                         return objects;
104                                                 }
105                                         } else {
106                                                 if (objects.length == 1) {
107                                                         return objects;
108                                                 }
109                                                 return new Object[] { objects[0] };
110                                         }
111                                 }
112                         } catch (CoreException e) {
113                                 if (single == null) {
114                                         single = e;
115                                 } else if (multiStatus == null) {
116                                         multiStatus = new MultiStatus(DebugPlugin
117                                                         .getUniqueIdentifier(), DebugPlugin.INTERNAL_ERROR,
118                                                         new IStatus[] { single.getStatus() },
119                                                         SourceLookupMessages.CompositeSourceContainer_0,
120                                                         null);
121                                         multiStatus.add(e.getStatus());
122                                 } else {
123                                         multiStatus.add(e.getStatus());
124                                 }
125                         }
126                 }
127                 if (results == null) {
128                         if (multiStatus != null) {
129                                 throw new CoreException(multiStatus);
130                         } else if (single != null) {
131                                 throw single;
132                         }
133                         return EMPTY;
134                 }
135                 return results.toArray();
136         }
137
138         static void addMatching(List results, IPath localPath, Object[] objects) {
139                 if (results == null || localPath == null || objects == null) {
140                         return;
141                 }
142                 for (int j = 0; j < objects.length; j++) {
143                         if (objects[j] == null || !(objects[j] instanceof IFile)) {
144                                 continue;
145                         }
146                         IFile file = (IFile) objects[j];
147
148                         IPath path = new Path(file.getLocation().toString());
149                         if (localPath.matchingFirstSegments(path) == localPath
150                                         .segmentCount()) {
151                                 results.add(objects[j]);
152                         }
153                 }
154         }
155 }