Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(761)

Side by Side Diff: editor/tools/plugins/com.google.dart.tools.debug.core/src/com/google/dart/tools/debug/core/source/UriToFileResolver.java

Issue 753183003: Fix an issue resolving paths when remote debugging. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2014, the Dart project authors. 2 * Copyright (c) 2014, the Dart project authors.
3 * 3 *
4 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not u se this file except 4 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not u se this file except
5 * in compliance with the License. You may obtain a copy of the License at 5 * in compliance with the License. You may obtain a copy of the License at
6 * 6 *
7 * http://www.eclipse.org/legal/epl-v10.html 7 * http://www.eclipse.org/legal/epl-v10.html
8 * 8 *
9 * Unless required by applicable law or agreed to in writing, software distribut ed under the License 9 * Unless required by applicable law or agreed to in writing, software distribut ed under the License
10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY K IND, either express 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY K IND, either express
11 * or implied. See the License for the specific language governing permissions a nd limitations under 11 * or implied. See the License for the specific language governing permissions a nd limitations under
12 * the License. 12 * the License.
13 */ 13 */
14 14
15 package com.google.dart.tools.debug.core.source; 15 package com.google.dart.tools.debug.core.source;
16 16
17 import com.google.common.collect.Maps; 17 import com.google.common.collect.Maps;
18 import com.google.common.util.concurrent.Uninterruptibles; 18 import com.google.common.util.concurrent.Uninterruptibles;
19 import com.google.dart.server.CreateContextConsumer; 19 import com.google.dart.server.CreateContextConsumer;
20 import com.google.dart.server.MapUriConsumer; 20 import com.google.dart.server.MapUriConsumer;
21 import com.google.dart.tools.core.DartCore; 21 import com.google.dart.tools.core.DartCore;
22 import com.google.dart.tools.core.DartCoreDebug; 22 import com.google.dart.tools.core.DartCoreDebug;
23 import com.google.dart.tools.core.analysis.model.IFileInfo; 23 import com.google.dart.tools.core.analysis.model.IFileInfo;
24 import com.google.dart.tools.core.analysis.model.ProjectManager; 24 import com.google.dart.tools.core.analysis.model.ProjectManager;
25 import com.google.dart.tools.core.internal.util.ResourceUtil; 25 import com.google.dart.tools.core.internal.util.ResourceUtil;
26 import com.google.dart.tools.debug.core.DartLaunchConfigWrapper; 26 import com.google.dart.tools.debug.core.DartLaunchConfigWrapper;
27 27
28 import org.eclipse.core.resources.IContainer;
28 import org.eclipse.core.resources.IFile; 29 import org.eclipse.core.resources.IFile;
29 import org.eclipse.core.resources.IResource; 30 import org.eclipse.core.resources.IResource;
30 import org.eclipse.debug.core.ILaunch; 31 import org.eclipse.debug.core.ILaunch;
31 import org.eclipse.debug.core.ILaunchConfiguration; 32 import org.eclipse.debug.core.ILaunchConfiguration;
32 33
33 import java.io.File; 34 import java.io.File;
34 import java.net.URI; 35 import java.net.URI;
35 import java.net.URISyntaxException; 36 import java.net.URISyntaxException;
36 import java.util.Map; 37 import java.util.Map;
37 import java.util.concurrent.CountDownLatch; 38 import java.util.concurrent.CountDownLatch;
38 import java.util.concurrent.TimeUnit; 39 import java.util.concurrent.TimeUnit;
39 40
40 /** 41 /**
41 * A helper for converting URIs to files paths and vice versa. 42 * A helper for converting URIs to files paths and vice versa.
42 */ 43 */
43 public class UriToFileResolver { 44 public class UriToFileResolver {
44 private final IResource resource; 45 private IContainer container;
45 private final String resourcePath;
46 private final Map<String, String> urlToFileCache = Maps.newHashMap(); 46 private final Map<String, String> urlToFileCache = Maps.newHashMap();
47 private final Map<String, String> fileToUriCache = Maps.newHashMap(); 47 private final Map<String, String> fileToUriCache = Maps.newHashMap();
48 48
49 private String executionContextId; 49 private String executionContextId;
50 50
51 public UriToFileResolver(ILaunch launch) { 51 public UriToFileResolver(ILaunch launch) {
52 ILaunchConfiguration launchConfiguration = launch.getLaunchConfiguration(); 52 ILaunchConfiguration launchConfiguration = launch.getLaunchConfiguration();
53 DartLaunchConfigWrapper wrapper = new DartLaunchConfigWrapper(launchConfigur ation); 53 DartLaunchConfigWrapper wrapper = new DartLaunchConfigWrapper(launchConfigur ation);
54 resource = wrapper.getApplicationResource(); 54
55 resourcePath = resource != null ? resource.getLocation().toOSString() : null ; 55 container = wrapper.getSourceDirectory();
56 if (container == null) {
57 IResource resource = wrapper.getApplicationResource();
58
59 if (resource instanceof IContainer) {
60 container = resource.getParent();
61 } else if (resource != null) {
62 container = resource.getParent();
63 }
64 }
65
66 String resourcePath = container != null ? container.getLocation().toOSString () : null;
67
56 // create an execution context 68 // create an execution context
57 if (DartCoreDebug.ENABLE_ANALYSIS_SERVER && resourcePath != null) { 69 if (DartCoreDebug.ENABLE_ANALYSIS_SERVER && resourcePath != null) {
58 DartCore.getAnalysisServer().execution_createContext( 70 DartCore.getAnalysisServer().execution_createContext(
59 resourcePath, 71 resourcePath,
60 new CreateContextConsumer() { 72 new CreateContextConsumer() {
61 @Override 73 @Override
62 public void computedExecutionContext(String contextId) { 74 public void computedExecutionContext(String contextId) {
63 executionContextId = contextId; 75 executionContextId = contextId;
64 } 76 }
65 }); 77 });
66 } 78 }
67 } 79 }
68 80
69 public void dispose() { 81 public void dispose() {
70 // delete the execution context 82 // delete the execution context
71 if (DartCoreDebug.ENABLE_ANALYSIS_SERVER && executionContextId != null) { 83 if (DartCoreDebug.ENABLE_ANALYSIS_SERVER && executionContextId != null) {
72 DartCore.getAnalysisServer().execution_deleteContext(executionContextId); 84 DartCore.getAnalysisServer().execution_deleteContext(executionContextId);
73 executionContextId = null; 85 executionContextId = null;
74 } 86 }
75 } 87 }
76 88
77 public String getFileForUri(String url) { 89 public String getFileForUri(String url) {
78 if (resource == null) { 90 if (container == null) {
79 return null; 91 return null;
80 } 92 }
81 String file = urlToFileCache.get(url); 93 String file = urlToFileCache.get(url);
82 if (file == null) { 94 if (file == null) {
83 file = getFileForUri0(url); 95 file = getFileForUri0(url);
84 urlToFileCache.put(url, file); 96 urlToFileCache.put(url, file);
85 } 97 }
86 return file; 98 return file;
87 } 99 }
88 100
89 public String getUriForPath(String file) { 101 public String getUriForPath(String file) {
90 if (resource == null) { 102 if (container == null) {
91 return null; 103 return null;
92 } 104 }
93 String uri = fileToUriCache.get(file); 105 String uri = fileToUriCache.get(file);
94 if (uri == null) { 106 if (uri == null) {
95 uri = getUriForPath0(file); 107 uri = getUriForPath0(file);
96 fileToUriCache.put(file, uri); 108 fileToUriCache.put(file, uri);
97 } 109 }
98 return uri; 110 return uri;
99 } 111 }
100 112
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 // Handle both fully absolute path names and http: urls. 152 // Handle both fully absolute path names and http: urls.
141 if (url.startsWith("/")) { 153 if (url.startsWith("/")) {
142 return url; 154 return url;
143 } else if (uriScheme == null) { 155 } else if (uriScheme == null) {
144 // handle relative file path 156 // handle relative file path
145 filePath = resolveRelativePath(url); 157 filePath = resolveRelativePath(url);
146 } else { 158 } else {
147 filePath = uri.getPath(); 159 filePath = uri.getPath();
148 } 160 }
149 161
150 // dart:
151 if (filePath == null) { 162 if (filePath == null) {
152 return null; 163 return null;
153 } else { 164 } else {
154 return filePath; 165 return returnAbsoluteOrRelative(filePath);
155 } 166 }
156 } catch (URISyntaxException e) { 167 } catch (URISyntaxException e) {
157 return null; 168 return null;
158 } 169 }
159 } 170 }
160 171
161 /** 172 /**
162 * It seems that {@link ProjectManager#resolvePathToPackage} works only in lim ited cases. So, here 173 * It seems that {@link ProjectManager#resolvePathToPackage} works only in lim ited cases. So, here
163 * is a copy of another implementation. 174 * is a copy of another implementation.
164 */ 175 */
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 Uninterruptibles.awaitUninterruptibly(latch, 1, TimeUnit.SECONDS); 231 Uninterruptibles.awaitUninterruptibly(latch, 1, TimeUnit.SECONDS);
221 return uriPtr[0]; 232 return uriPtr[0];
222 } 233 }
223 } else { 234 } else {
224 { 235 {
225 String uri = getUriForPath_fromServerBreakpointManager(file); 236 String uri = getUriForPath_fromServerBreakpointManager(file);
226 if (uri != null) { 237 if (uri != null) {
227 return uri; 238 return uri;
228 } 239 }
229 } 240 }
230 return DartCore.getProjectManager().resolvePathToPackage(resource, file); 241 return DartCore.getProjectManager().resolvePathToPackage(container, file);
231 } 242 }
232 return null; 243 return null;
233 } 244 }
234 245
235 private String resolvePackageUri(String url) { 246 private String resolvePackageUri(String url) {
236 if (DartCoreDebug.ENABLE_ANALYSIS_SERVER) { 247 if (DartCoreDebug.ENABLE_ANALYSIS_SERVER) {
237 if (executionContextId != null) { 248 if (executionContextId != null) {
238 final String[] filePtr = {null}; 249 final String[] filePtr = {null};
239 final CountDownLatch latch = new CountDownLatch(1); 250 final CountDownLatch latch = new CountDownLatch(1);
240 DartCore.getAnalysisServer().execution_mapUri( 251 DartCore.getAnalysisServer().execution_mapUri(
241 executionContextId, 252 executionContextId,
242 null, 253 null,
243 url, 254 url,
244 new MapUriConsumer() { 255 new MapUriConsumer() {
245 @Override 256 @Override
246 public void computedFileOrUri(String file, String uri) { 257 public void computedFileOrUri(String file, String uri) {
247 filePtr[0] = file; 258 filePtr[0] = file;
248 latch.countDown(); 259 latch.countDown();
249 } 260 }
250 }); 261 });
251 Uninterruptibles.awaitUninterruptibly(latch, 1, TimeUnit.SECONDS); 262 Uninterruptibles.awaitUninterruptibly(latch, 1, TimeUnit.SECONDS);
252 return filePtr[0]; 263 return filePtr[0];
253 } 264 }
254 } else { 265 } else {
255 ProjectManager projectManager = DartCore.getProjectManager(); 266 ProjectManager projectManager = DartCore.getProjectManager();
256 IFileInfo fileInfo = projectManager.resolveUriToFileInfo(resource, url); 267 IFileInfo fileInfo = projectManager.resolveUriToFileInfo(container, url);
257 if (fileInfo != null) { 268 if (fileInfo != null) {
258 File file = fileInfo.getFile(); 269 File file = fileInfo.getFile();
259 File absoluteFile = file.getAbsoluteFile(); 270 File absoluteFile = file.getAbsoluteFile();
260 return absoluteFile.toURI().toString(); 271 return absoluteFile.toURI().toString();
261 } 272 }
262 } 273 }
263 return null; 274 return null;
264 } 275 }
265 276
266 private String resolveRelativePath(String url) { 277 private String resolveRelativePath(String url) {
267 if (resource != null) { 278 if (container != null) {
268 IResource file = resource.getParent().findMember(url); 279 IResource file = container.getParent().findMember(url);
269 if (file != null) { 280 if (file != null) {
270 return file.getLocation().toOSString(); 281 return file.getLocation().toOSString();
271 } 282 }
272 } 283 }
273 return null; 284 return null;
274 } 285 }
286
287 private String returnAbsoluteOrRelative(String path) {
288 // If path exists, return that.
289 File file = new File(path);
290 if (file.exists()) {
291 return path;
292 }
293
294 // Try and return a path relative to the resource.
295 if (container != null) {
296 int index = path.indexOf('/');
297
298 while (index != -1) {
299 String subPath = path.substring(index + 1);
300 IResource resource = container.findMember(subPath);
301 if (resource != null) {
302 return resource.getLocation().toFile().getAbsolutePath();
303 }
304 index = path.indexOf('/', index + 1);
305 }
306 }
307
308 // Else, return the original path.
309 return path;
310 }
275 } 311 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698