In progress: [ Issue 40 ] Add support for import resolution across multiple folders
https://code.google.com/p/protobuf-dt/issues/detail?id=40
Moved ProtobufImportUriFixer to the 'com.google.eclipse.protobuf.ui' project to be able to use 'import paths' preferences.
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/ImportUriFixer_fixUri_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/ProtobufImportUriFixer_fixUri_Test.java
similarity index 91%
rename from com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/ImportUriFixer_fixUri_Test.java
rename to com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/ProtobufImportUriFixer_fixUri_Test.java
index a168d75..4cf9927 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/ImportUriFixer_fixUri_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/ProtobufImportUriFixer_fixUri_Test.java
@@ -6,7 +6,7 @@
*
* http://www.eclipse.org/legal/epl-v10.html
*/
-package com.google.eclipse.protobuf.scoping;
+package com.google.eclipse.protobuf.ui.scoping;
import static org.eclipse.emf.common.util.URI.createURI;
import static org.hamcrest.core.IsEqual.equalTo;
@@ -16,12 +16,14 @@
import org.junit.Before;
import org.junit.Test;
+import com.google.eclipse.protobuf.scoping.ResourceChecker;
+
/**
* Tests for <code>{@link ProtobufImportUriFixer#fixUri(String, URI, ResourceChecker)}</code>.
*
* @author alruiz@google.com (Alex Ruiz)
*/
-public class ImportUriFixer_fixUri_Test {
+public class ProtobufImportUriFixer_fixUri_Test {
private URI resourceUri;
private ResourceCheckerStub resourceChecker;
@@ -62,7 +64,7 @@
super(null);
}
- @Override boolean resourceExists(String uri) {
+ @Override public boolean resourceExists(String uri) {
return resourceShouldAlwaysExist;
}
}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
index 8a14bb3..322cdcc 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
@@ -16,11 +16,13 @@
import org.eclipse.xtext.ui.editor.outline.actions.IOutlineContribution;
import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
+import com.google.eclipse.protobuf.scoping.ImportUriFixer;
import com.google.eclipse.protobuf.ui.builder.AutoAddNatureEditorCallback;
import com.google.eclipse.protobuf.ui.outline.LinkWithEditor;
import com.google.eclipse.protobuf.ui.outline.ProtobufOutlinePage;
import com.google.eclipse.protobuf.ui.preferences.compiler.CompilerPreferencesInitializer;
import com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferencesInitializer;
+import com.google.eclipse.protobuf.ui.scoping.ProtobufImportUriFixer;
import com.google.inject.Binder;
/**
@@ -61,4 +63,8 @@
Class<? extends IPreferenceStoreInitializer> initializerType) {
binder.bind(IPreferenceStoreInitializer.class).annotatedWith(named(name)).to(initializerType);
}
+
+ public void configureImportUriResolver(Binder binder) {
+ binder.bind(ImportUriFixer.class).to(ProtobufImportUriFixer.class);
+ }
}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriFixer.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/ProtobufImportUriFixer.java
similarity index 92%
rename from com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriFixer.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/ProtobufImportUriFixer.java
index d1b9360..970c2fd 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriFixer.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/ProtobufImportUriFixer.java
@@ -6,7 +6,7 @@
*
* http://www.eclipse.org/legal/epl-v10.html
*/
-package com.google.eclipse.protobuf.scoping;
+package com.google.eclipse.protobuf.ui.scoping;
import static org.eclipse.emf.common.util.URI.createURI;
import static org.eclipse.xtext.util.Tuples.pair;
@@ -17,13 +17,14 @@
import org.eclipse.emf.common.util.URI;
import org.eclipse.xtext.util.Pair;
+import com.google.eclipse.protobuf.scoping.ImportUriFixer;
+import com.google.eclipse.protobuf.scoping.ResourceChecker;
+
/**
* @author alruiz@google.com (Alex Ruiz)
*/
-public class ProtobufImportUriFixer {
+public class ProtobufImportUriFixer implements ImportUriFixer {
- public static final String PREFIX = "platform:/resource";
-
private static final String SEPARATOR = "/";
/*
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ImportUriFixer.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ImportUriFixer.java
new file mode 100644
index 0000000..5337acd
--- /dev/null
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ImportUriFixer.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.scoping;
+
+import org.eclipse.emf.common.util.URI;
+
+import com.google.eclipse.protobuf.protobuf.Import;
+
+/**
+ * Fixes partial URIs in <code>{@link Import}</code>s by resolving them to existing files with matching URIs.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public interface ImportUriFixer {
+
+ /**
+ * Prefix present in complete import URIs.
+ */
+ String PREFIX = "platform:/resource";
+
+ /**
+ * Returns a "fixed" full URI based on the given partial URI.
+ * @param importUri the partial URI (comes from a {@code Import}.)
+ * @param resourceUri the URI of the resource declaring the import.
+ * @param checker indicates whether the resolved URI belongs to an existing file.
+ * @return the "fixed" full URI.
+ */
+ String fixUri(String importUri, URI resourceUri, ResourceChecker checker);
+}
\ No newline at end of file
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriResolver.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriResolver.java
index e35f303..4f4f764 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriResolver.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriResolver.java
@@ -8,7 +8,7 @@
*/
package com.google.eclipse.protobuf.scoping;
-import static com.google.eclipse.protobuf.scoping.ProtobufImportUriFixer.PREFIX;
+import static com.google.eclipse.protobuf.scoping.ImportUriFixer.PREFIX;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
@@ -30,7 +30,7 @@
*/
public class ProtobufImportUriResolver extends ImportUriResolver {
- @Inject private ProtobufImportUriFixer uriFixer;
+ @Inject private ImportUriFixer uriFixer;
/**
* Prefix used by EMF for resource URIs: "platform:/resource/".
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ResourceChecker.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ResourceChecker.java
index 4742208..5231cd3 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ResourceChecker.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ResourceChecker.java
@@ -14,17 +14,24 @@
import org.eclipse.emf.ecore.resource.ResourceSet;
/**
+ * Verifies that resources exist.
+ *
* @author alruiz@google.com (Alex Ruiz)
*/
-class ResourceChecker {
+public class ResourceChecker {
private final ResourceSet resourceSet;
- ResourceChecker(ResourceSet resourceSet) {
+ public ResourceChecker(ResourceSet resourceSet) {
this.resourceSet = resourceSet;
}
- boolean resourceExists(String uri) {
+ /**
+ * Indicates whether the given URI belongs to an existing resource.
+ * @param uri the URI to check, as a {@code String}.
+ * @return {@code true} if the given URI belongs to an existing resource, {@code false} otherwise.
+ */
+ public boolean resourceExists(String uri) {
Resource resource = resourceSet.getResource(createURI(uri), true);
return resource != null && resource.getErrors().isEmpty();
}