Fixed: [ Issue 46 ] Use the location of workspace folders for import resolution
https://code.google.com/p/protobuf-dt/issues/detail?id=46
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategies.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategies.java
index 7a84aef..8b9c2b6 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategies.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategies.java
@@ -9,8 +9,8 @@
package com.google.eclipse.protobuf.ui.scoping;
import static com.google.eclipse.protobuf.ui.preferences.paths.PathResolutionType.*;
-import static com.google.inject.internal.Maps.newHashMap;
+import java.util.HashMap;
import java.util.Map;
import com.google.eclipse.protobuf.ui.preferences.paths.PathResolutionType;
@@ -24,11 +24,12 @@
@Singleton
class FileResolverStrategies {
- private final Map<PathResolutionType, FileResolverStrategy> strategies = newHashMap();
+ private final Map<PathResolutionType, FileResolverStrategy> strategies =
+ new HashMap<PathResolutionType, FileResolverStrategy>();
- @Inject FileResolverStrategies(Resources resources) {
+ @Inject FileResolverStrategies(PathMapping mapping, Resources resources) {
strategies.put(SINGLE_DIRECTORY, new SingleDirectoryFileResolver(resources));
- strategies.put(MULTIPLE_DIRECTORIES, new MultipleDirectoriesFileResolver(resources));
+ strategies.put(MULTIPLE_DIRECTORIES, new MultipleDirectoriesFileResolver(mapping, resources));
}
FileResolverStrategy strategyFor(PathResolutionType type) {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java
index f07108f..0e5c309 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java
@@ -8,6 +8,8 @@
*/
package com.google.eclipse.protobuf.ui.scoping;
+import java.util.List;
+
import org.eclipse.core.filesystem.*;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
@@ -22,35 +24,44 @@
*/
class MultipleDirectoriesFileResolver implements FileResolverStrategy {
+ private final PathMapping mapping;
private final Resources resources;
- MultipleDirectoriesFileResolver(Resources resources) {
+ MultipleDirectoriesFileResolver(PathMapping mapping, Resources resources) {
+ this.mapping = mapping;
this.resources = resources;
}
/** {@inheritDoc} */
public String resolveUri(String importUri, URI declaringResourceUri, PathsPreferences preferences) {
- for (DirectoryPath directoryPath : preferences.directoryPaths()) {
+ List<DirectoryPath> directoryPaths = preferences.directoryPaths();
+ for (DirectoryPath directoryPath : directoryPaths) {
String resolved = resolveUri(importUri, directoryPath);
if (resolved != null) return resolved;
}
+ for (DirectoryPath directoryPath : directoryPaths) {
+ if (!directoryPath.isWorkspacePath()) continue;
+ String resolved = resolveUriFileSystem(importUri, mapping.folderLocation(directoryPath.value()));
+ if (resolved != null) return resolved;
+ }
return null;
}
- private String resolveUri(String importUri, DirectoryPath directoryPath) {
- if (directoryPath.isWorkspacePath()) return resolveUriInWorkspace(importUri, directoryPath.value());
- return resolveUriFileSystem(importUri, directoryPath.value());
+ private String resolveUri(String importUri, DirectoryPath importRoot) {
+ String root = importRoot.value();
+ if (importRoot.isWorkspacePath()) return resolveUriInWorkspace(importUri, root);
+ return resolveUriFileSystem(importUri, root);
}
- private String resolveUriInWorkspace(String importUri, String directoryPath) {
- String path = PREFIX + directoryPath + SEPARATOR + importUri;
+ private String resolveUriInWorkspace(String importUri, String importRoot) {
+ String path = PREFIX + importRoot + SEPARATOR + importUri;
boolean exists = resources.fileExists(URI.createURI(path));
return (exists) ? path : null;
}
- private String resolveUriFileSystem(String importUri, String directoryPath) {
+ private String resolveUriFileSystem(String importUri, String importRoot) {
IFileSystem fileSystem = EFS.getLocalFileSystem();
- IPath path = new Path(directoryPath + SEPARATOR + importUri);
+ IPath path = new Path(importRoot + SEPARATOR + importUri);
IFileInfo fileInfo = fileSystem.getStore(path).fetchInfo();
if (!fileInfo.exists()) return null;
return URIUtil.toURI(path).toString();
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/PathMapping.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/PathMapping.java
new file mode 100644
index 0000000..4bcab10
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/PathMapping.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 which accompanies this distribution, and is available at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package com.google.eclipse.protobuf.ui.scoping;
+
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.xtext.util.SimpleCache;
+
+import com.google.common.base.Function;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+class PathMapping {
+
+ private final SimpleCache<String, String> folderPathMapping = new SimpleCache<String, String>(new FolderPathMapper());
+
+ String folderLocation(String workspacePath) {
+ return folderPathMapping.get(workspacePath);
+ }
+
+ private static class FolderPathMapper implements Function<String, String> {
+ public String apply(String workspacePath) {
+ return folder(workspacePath).getLocation().toOSString();
+ }
+
+ private static IFolder folder(String workspacePath) {
+ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ return root.getFolder(new Path(workspacePath));
+ }
+ }
+}