In progress: [ Issue 40 ] Add support for import resolution across multiple folders
https://code.google.com/p/protobuf-dt/issues/detail?id=40
Code cleanup.
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver_resolveUri_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver_resolveUri_Test.java
index 7cba64e..9a41d2e 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver_resolveUri_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver_resolveUri_Test.java
@@ -8,7 +8,7 @@
*/
package com.google.eclipse.protobuf.ui.scoping;
-import static com.google.eclipse.protobuf.ui.preferences.paths.FileResolutionType.SINGLE_FOLDER;
+import static com.google.eclipse.protobuf.ui.preferences.paths.PathResolutionType.SINGLE_DIRECTORY;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.any;
@@ -35,8 +35,8 @@
@Rule public XtextRule xtext = new XtextRule();
private Resource resource;
- private PreferenceReader preferenceReader;
- private Preferences preferences;
+ private PathsPreferenceReader preferenceReader;
+ private PathsPreferences preferences;
private IProject project;
private Resources resources;
@@ -44,13 +44,13 @@
@Before public void setUp() {
resource = new ResourceStub("platform:/resource/src/proto/person.proto");
- preferenceReader = mock(PreferenceReader.class);
- preferences = mock(Preferences.class);
+ preferenceReader = mock(PathsPreferenceReader.class);
+ preferences = mock(PathsPreferences.class);
project = mock(IProject.class);
resources = mock(Resources.class);
Module module = new Module() {
public void configure(Binder binder) {
- binder.bind(PreferenceReader.class).toInstance(preferenceReader);
+ binder.bind(PathsPreferenceReader.class).toInstance(preferenceReader);
binder.bind(Resources.class).toInstance(resources);
binder.bind(IFileUriResolver.class).to(FileUriResolver.class);
}
@@ -60,34 +60,34 @@
}
@Test public void should_resolve_import_URI_if_missing_scheme() {
- callStubs(SINGLE_FOLDER, true);
+ callStubs(SINGLE_DIRECTORY, true);
String resolved = resolver.resolveUri("folder1/address.proto", resource);
assertThat(resolved, equalTo("platform:/resource/src/proto/folder1/address.proto"));
}
@Test public void should_not_resolve_import_URI_if_not_missing_scheme() {
- callStubs(SINGLE_FOLDER, true);
+ callStubs(SINGLE_DIRECTORY, true);
String original = "platform:/resource/src/proto/folder1/address.proto";
String resolved = resolver.resolveUri(original, resource);
assertThat(resolved, equalTo(original));
}
@Test public void should_resolve_import_URI_even_if_overlapping_folders_with_resource_URI() {
- callStubs(SINGLE_FOLDER, true);
+ callStubs(SINGLE_DIRECTORY, true);
String resolved = resolver.resolveUri("src/proto/folder1/address.proto", resource);
assertThat(resolved, equalTo("platform:/resource/src/proto/folder1/address.proto"));
}
@Test public void should_resolve_import_URI_even_if_overlapping_one_folder_only_with_resource_URI() {
- callStubs(SINGLE_FOLDER, true);
+ callStubs(SINGLE_DIRECTORY, true);
String resolved = resolver.resolveUri("src/proto/read-only/address.proto", resource);
assertThat(resolved, equalTo("platform:/resource/src/proto/read-only/address.proto"));
}
- private void callStubs(FileResolutionType type, boolean resolvedUriExists) {
+ private void callStubs(PathResolutionType type, boolean resolvedUriExists) {
when(resources.project(resource.getURI())).thenReturn(project);
when(preferenceReader.readFromPrefereceStore(project)).thenReturn(preferences);
- when(preferences.fileResolutionType()).thenReturn(type);
+ when(preferences.pathResolutionType()).thenReturn(type);
when(resources.fileExists(any(URI.class))).thenReturn(resolvedUriExists);
}
}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerPreferences.java
index 77142c2..98e5be5 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerPreferences.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerPreferences.java
@@ -39,9 +39,9 @@
compileProtoFiles = store.getBoolean(COMPILE_PROTO_FILES);
boolean useProtocInSystemPath = store.getBoolean(USE_PROTOC_IN_SYSTEM_PATH);
protocPath = (useProtocInSystemPath) ? "protoc" : store.getString(PROTOC_FILE_PATH);
- language = CompilerTargetLanguage.find(store);
+ language = CompilerTargetLanguage.readFrom(store);
outputFolderName = store.getString(OUTPUT_FOLDER_NAME);
refreshResources = store.getBoolean(REFRESH_RESOURCES);
- refreshTarget = PostCompilationRefreshTarget.find(store);
+ refreshTarget = PostCompilationRefreshTarget.readFrom(store);
}
}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerTargetLanguage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerTargetLanguage.java
index 9bf1185..820596b 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerTargetLanguage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerTargetLanguage.java
@@ -22,7 +22,7 @@
JAVA, CPP, PYTHON;
// TODO check if protoc can generate more than one language sources at the same time.
- static CompilerTargetLanguage find(IPreferenceStore store) {
+ static CompilerTargetLanguage readFrom(IPreferenceStore store) {
if (store.getBoolean(GENERATE_JAVA_CODE)) return JAVA;
if (store.getBoolean(GENERATE_CPP_CODE)) return CPP;
if (store.getBoolean(GENERATE_PYTHON_CODE)) return PYTHON;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/PostCompilationRefreshTarget.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/PostCompilationRefreshTarget.java
index cfba624..1a73ce0 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/PostCompilationRefreshTarget.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/PostCompilationRefreshTarget.java
@@ -21,7 +21,7 @@
PROJECT, OUTPUT_FOLDER;
- static PostCompilationRefreshTarget find(IPreferenceStore store) {
+ static PostCompilationRefreshTarget readFrom(IPreferenceStore store) {
if (store.getBoolean(REFRESH_PROJECT)) return PROJECT;
return OUTPUT_FOLDER;
}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsResolutionType.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathResolutionType.java
similarity index 88%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsResolutionType.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathResolutionType.java
index c24670a..c54904c 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsResolutionType.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathResolutionType.java
@@ -16,11 +16,11 @@
*
* @author alruiz@google.com (Alex Ruiz)
*/
-public enum PathsResolutionType {
+public enum PathResolutionType {
SINGLE_DIRECTORY, MULTIPLE_DIRECTORIES;
- static PathsResolutionType find(IPreferenceStore store) {
+ static PathResolutionType readFrom(IPreferenceStore store) {
if (store.getBoolean(FILES_IN_ONE_DIRECTORY_ONLY)) return SINGLE_DIRECTORY;
return MULTIPLE_DIRECTORIES;
}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferences.java
index 5f6fa68..97f7ccd 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferences.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferences.java
@@ -8,8 +8,8 @@
*/
package com.google.eclipse.protobuf.ui.preferences.paths;
-import static com.google.eclipse.protobuf.ui.preferences.paths.PathsResolutionType.SINGLE_DIRECTORY;
import static com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferenceNames.DIRECTORY_NAMES;
+import static com.google.eclipse.protobuf.ui.preferences.paths.PathResolutionType.SINGLE_DIRECTORY;
import static com.google.eclipse.protobuf.ui.util.Strings.CSV_PATTERN;
import static java.util.Arrays.asList;
import static java.util.Collections.*;
@@ -20,30 +20,30 @@
/**
* Paths preferences, retrieved from an <code>{@link IPreferenceStore}</code>.
- *
+ *
* @author alruiz@google.com (Alex Ruiz)
*/
public class PathsPreferences {
- private final PathsResolutionType fileResolutionType;
- private final List<String> folderNames;
-
+ private final PathResolutionType pathResolutionType;
+ private final List<String> directoryNames;
+
PathsPreferences(IPreferenceStore store) {
- fileResolutionType = PathsResolutionType.find(store);
- folderNames = folderNames(fileResolutionType, store);
+ pathResolutionType = PathResolutionType.readFrom(store);
+ directoryNames = directoryNames(pathResolutionType, store);
}
-
- private static List<String> folderNames(PathsResolutionType types, IPreferenceStore store) {
+
+ private static List<String> directoryNames(PathResolutionType types, IPreferenceStore store) {
if (types.equals(SINGLE_DIRECTORY)) return emptyList();
- String[] folderNames = store.getString(DIRECTORY_NAMES).split(CSV_PATTERN);
- return unmodifiableList(asList(folderNames));
+ String[] directoryNames = store.getString(DIRECTORY_NAMES).split(CSV_PATTERN);
+ return unmodifiableList(asList(directoryNames));
}
- public PathsResolutionType fileResolutionType() {
- return fileResolutionType;
+ public PathResolutionType pathResolutionType() {
+ return pathResolutionType;
}
- public List<String> folderNames() {
- return folderNames;
+ public List<String> directoryNames() {
+ return directoryNames;
}
}
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
new file mode 100644
index 0000000..ee257a2
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategies.java
@@ -0,0 +1,35 @@
+/*
+ * 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 static com.google.eclipse.protobuf.ui.preferences.paths.PathResolutionType.*;
+import static com.google.inject.internal.Maps.newHashMap;
+
+import java.util.Map;
+
+import com.google.eclipse.protobuf.ui.preferences.paths.PathResolutionType;
+import com.google.inject.*;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+@Singleton
+class FileResolverStrategies {
+
+ private final Map<PathResolutionType, FileResolverStrategy> strategies = newHashMap();
+
+ @Inject FileResolverStrategies(Resources resources) {
+ strategies.put(SINGLE_DIRECTORY, new SingleDirectoryFileResolver(resources));
+ strategies.put(MULTIPLE_DIRECTORIES, new MultipleDirectoriesFileResolver());
+ }
+
+ FileResolverStrategy strategyFor(PathResolutionType type) {
+ return strategies.get(type);
+ }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategy.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategy.java
new file mode 100644
index 0000000..328fadb
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategy.java
@@ -0,0 +1,25 @@
+/*
+ * 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.IProject;
+import org.eclipse.emf.common.util.URI;
+
+import com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferences;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+interface FileResolverStrategy {
+
+ String PREFIX = "platform:/resource";
+ String SEPARATOR = "/";
+
+ String resolveUri(String importUri, URI declaringResourceUri, PathsPreferences preferences, IProject project);
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver.java
index 68d26a1..913e46f 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver.java
@@ -8,35 +8,27 @@
*/
package com.google.eclipse.protobuf.ui.scoping;
-import static com.google.eclipse.protobuf.ui.preferences.paths.PathsResolutionType.SINGLE_DIRECTORY;
-import static org.eclipse.emf.common.util.URI.createURI;
-import static org.eclipse.xtext.util.Tuples.pair;
-
-import java.util.ArrayList;
-import java.util.List;
+import static com.google.eclipse.protobuf.ui.scoping.FileResolverStrategy.PREFIX;
import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.xtext.util.Pair;
import com.google.eclipse.protobuf.scoping.IFileUriResolver;
-import com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferenceReader;
-import com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferences;
+import com.google.eclipse.protobuf.ui.preferences.paths.*;
import com.google.inject.Inject;
/**
+ * Resolves "import" URIs.
+ *
* @author alruiz@google.com (Alex Ruiz)
*/
public class FileUriResolver implements IFileUriResolver {
-
- private static final String PREFIX = "platform:/resource";
- private static final String SEPARATOR = "/";
@Inject private PathsPreferenceReader preferenceReader;
+ @Inject private FileResolverStrategies resolvers;
@Inject private Resources resources;
-
+
/*
* The import URI is relative to the file where the import is. Protoc works fine, but the editor doesn't.
* In order for the editor to see the import, we need to add to the import URI "platform:resource" and the parent
@@ -54,50 +46,19 @@
*/
public String resolveUri(String importUri, Resource declaringResource) {
if (importUri.startsWith(PREFIX)) return importUri;
- Pair<String, List<String>> importUriPair = pair(importUri, createURI(importUri).segmentsList());
- String resolved = resolveUri(importUriPair, declaringResource.getURI());
+ String resolved = resolveUri(importUri, declaringResource.getURI());
// System.out.println(declaringResource.getURI() + " : " + importUri + " : " + resolved);
if (resolved == null) return importUri;
return resolved;
}
-
- private String resolveUri(Pair<String, List<String>> importUri, URI resourceUri) {
+
+ private String resolveUri(String importUri, URI resourceUri) {
IProject project = resources.project(resourceUri);
PathsPreferences preferences = preferenceReader.readFromPrefereceStore(project);
- List<String> segments = removeFirstAndLast(resourceUri.segmentsList());
- if (preferences.fileResolutionType().equals(SINGLE_DIRECTORY)) {
- return resolveUri(importUri, segments);
- }
- for (String folderName : preferences.folderNames()) {
- String resolved = resolveUri(importUri, folderName, project);
- if (resolved != null) return resolved;
- }
- return null;
+ return resolver(preferences).resolveUri(importUri, resourceUri, preferences, project);
}
-
- private List<String> removeFirstAndLast(List<String> list) {
- if (list.isEmpty()) return list;
- List<String> newList = new ArrayList<String>(list);
- newList.remove(0);
- newList.remove(newList.size() - 1);
- return newList;
- }
-
- private String resolveUri(Pair<String, List<String>> importUri, List<String> resourceUri) {
- StringBuilder pathBuilder = new StringBuilder();
- String firstSegment = importUri.getSecond().get(0);
- for (String segment : resourceUri) {
- if (segment.equals(firstSegment)) break;
- pathBuilder.append(segment).append(SEPARATOR);
- }
- String resolved = PREFIX + SEPARATOR + pathBuilder.toString() + importUri.getFirst();
- return (resources.fileExists(createURI(resolved))) ? resolved : null;
- }
-
- private String resolveUri(Pair<String, List<String>> importUri, String folderName, IProject project) {
- String path = folderName + SEPARATOR + importUri.getFirst();
- IResource findMember = project.findMember(path);
- boolean exists = (findMember != null) ? findMember.exists() : false;
- return (exists) ? PREFIX + project.getFullPath() + SEPARATOR + path : null;
+
+ private FileResolverStrategy resolver(PathsPreferences preferences) {
+ return resolvers.strategyFor(preferences.pathResolutionType());
}
}
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
new file mode 100644
index 0000000..a96766c
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java
@@ -0,0 +1,36 @@
+/*
+ * 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.emf.common.util.URI;
+
+import com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferences;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+class MultipleDirectoriesFileResolver implements FileResolverStrategy {
+
+ /** {@inheritDoc} */
+ public String resolveUri(String importUri, URI declaringResourceUri, PathsPreferences preferences, IProject project) {
+ for (String directoryName : preferences.directoryNames()) {
+ String resolved = resolveUri(importUri, directoryName, project);
+ if (resolved != null) return resolved;
+ }
+ return null;
+ }
+
+ private String resolveUri(String importUri, String directoryName, IProject project) {
+ String path = directoryName + SEPARATOR + importUri;
+ IResource findMember = project.findMember(path);
+ boolean exists = (findMember != null) ? findMember.exists() : false;
+ return (exists) ? PREFIX + project.getFullPath() + SEPARATOR + path : null;
+ }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/Resources.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/Resources.java
index 2839af5..dbda15e 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/Resources.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/Resources.java
@@ -9,15 +9,17 @@
package com.google.eclipse.protobuf.ui.scoping;
import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.*;
import org.eclipse.emf.common.util.URI;
+import com.google.inject.Singleton;
+
/**
* Utility methods related to resources (e.g. files, directories.)
- *
+ *
* @author alruiz@google.com (Alex Ruiz)
*/
+@Singleton
public class Resources {
/**
@@ -28,7 +30,7 @@
public IProject project(URI resourceUri) {
return file(resourceUri).getProject();
}
-
+
/**
* Indicates whether the given URI belongs to an existing file.
* @param fileUri the URI to check, as a {@code String}.
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryFileResolver.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryFileResolver.java
new file mode 100644
index 0000000..bcee62c
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryFileResolver.java
@@ -0,0 +1,59 @@
+/*
+ * 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 static org.eclipse.emf.common.util.URI.createURI;
+import static org.eclipse.xtext.util.Tuples.pair;
+
+import java.util.*;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.xtext.util.Pair;
+
+import com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferences;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+class SingleDirectoryFileResolver implements FileResolverStrategy {
+
+ private final Resources resources;
+
+ SingleDirectoryFileResolver(Resources resources) {
+ this.resources = resources;
+ }
+
+ public String resolveUri(String importUri, URI declaringResourceUri, PathsPreferences preferences, IProject project) {
+ List<String> resourceUriSegments = removeFirstAndLast(declaringResourceUri.segmentsList());
+ Pair<String, List<String>> importUriPair = pair(importUri, createURI(importUri).segmentsList());
+ return resolveUri(importUriPair, resourceUriSegments);
+ }
+
+ // first is always "platform" and last is the file name (both unnecessary)
+ private static List<String> removeFirstAndLast(List<String> list) {
+ if (list.isEmpty()) return list;
+ List<String> newList = new ArrayList<String>(list);
+ newList.remove(0);
+ newList.remove(newList.size() - 1);
+ return newList;
+ }
+
+ private String resolveUri(Pair<String, List<String>> importUri, List<String> resourceUri) {
+ StringBuilder pathBuilder = new StringBuilder();
+ String firstSegment = importUri.getSecond().get(0);
+ for (String segment : resourceUri) {
+ if (segment.equals(firstSegment)) break;
+ pathBuilder.append(segment).append(SEPARATOR);
+ }
+ String resolved = PREFIX + SEPARATOR + pathBuilder.toString() + importUri.getFirst();
+ return (resources.fileExists(createURI(resolved))) ? resolved : null;
+ }
+
+}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IFileUriResolver.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IFileUriResolver.java
index 58257de..ecc39cd 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IFileUriResolver.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IFileUriResolver.java
@@ -14,21 +14,21 @@
import com.google.inject.ImplementedBy;
/**
- * Resolves partial URIs converting them to full ones belonging to existing files.
- *
+ * Resolves "import" URIs.
+ *
* @author alruiz@google.com (Alex Ruiz)
*/
@ImplementedBy(NullFileUriResolver.class)
public interface IFileUriResolver {
/**
- * Resolves the given partial URI.
- * @param importUri the partial URI (comes from a {@code Import}.)
+ * Resolves the given 'import' URI.
+ * @param importUri the 'import' URI.
* @param declaringResource the resource declaring the import.
- * @return the resolved URI.
+ * @return the resolved URI, or {@code importUri} if resolution was not successful.
*/
String resolveUri(String importUri, Resource declaringResource);
-
+
class NullFileUriResolver implements IFileUriResolver {
public String resolveUri(String importUri, Resource declaringResource) {
throw new UnsupportedOperationException();