In progress: [ Issue 40 ] Add support for import resolution across multiple folders
https://code.google.com/p/protobuf-dt/issues/detail?id=40

Fixed tests.
diff --git a/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/FileStub.java b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/FileStub.java
index e6dcec0..d3b036d 100644
--- a/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/FileStub.java
+++ b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/FileStub.java
@@ -28,38 +28,38 @@
   private final Map<String, List<MarkerStub>> markersByType = new HashMap<String, List<MarkerStub>>();
 
   /** {@inheritDoc} */
-  public void accept(IResourceProxyVisitor visitor, int memberFlags) throws CoreException {
+  public void accept(IResourceProxyVisitor visitor, int memberFlags) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void accept(IResourceVisitor visitor) throws CoreException {
+  public void accept(IResourceVisitor visitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void accept(IResourceVisitor visitor, int depth, boolean includePhantoms) throws CoreException {
+  public void accept(IResourceVisitor visitor, int depth, boolean includePhantoms) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void accept(IResourceVisitor visitor, int depth, int memberFlags) throws CoreException {
+  public void accept(IResourceVisitor visitor, int depth, int memberFlags) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
   public void appendContents(InputStream source, boolean force, boolean keepHistory, IProgressMonitor monitor)
-      throws CoreException {
+      {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void appendContents(InputStream source, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void appendContents(InputStream source, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void clearHistory(IProgressMonitor monitor) throws CoreException {
+  public void clearHistory(IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
@@ -69,47 +69,47 @@
   }
 
   /** {@inheritDoc} */
-  public void copy(IPath destination, boolean force, IProgressMonitor monitor) throws CoreException {
+  public void copy(IPath destination, boolean force, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void copy(IPath destination, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void copy(IPath destination, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void copy(IProjectDescription description, boolean force, IProgressMonitor monitor) throws CoreException {
+  public void copy(IProjectDescription description, boolean force, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void copy(IProjectDescription description, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void copy(IProjectDescription description, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void create(InputStream source, boolean force, IProgressMonitor monitor) throws CoreException {
+  public void create(InputStream source, boolean force, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void create(InputStream source, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void create(InputStream source, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void createLink(IPath localLocation, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void createLink(IPath localLocation, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void createLink(URI location, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void createLink(URI location, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IMarker createMarker(String type) throws CoreException {
+  public IMarker createMarker(String type) {
     MarkerStub marker = new MarkerStub(type);
     addMarker(marker);
     return marker;
@@ -121,22 +121,22 @@
   }
 
   /** {@inheritDoc} */
-  public void delete(boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException {
+  public void delete(boolean force, boolean keepHistory, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void delete(boolean force, IProgressMonitor monitor) throws CoreException {
+  public void delete(boolean force, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void delete(int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void delete(int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void deleteMarkers(String type, boolean includeSubtypes, int depth) throws CoreException {
+  public void deleteMarkers(String type, boolean includeSubtypes, int depth) {
     List<MarkerStub> markers = markersByType.get(type);
     if (markers != null) markers.clear();
   }
@@ -147,19 +147,19 @@
   }
 
   /** {@inheritDoc} */
-  public IMarker findMarker(long id) throws CoreException {
+  public IMarker findMarker(long id) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IMarker[] findMarkers(String type, boolean includeSubtypes, int depth) throws CoreException {
+  public IMarker[] findMarkers(String type, boolean includeSubtypes, int depth) {
     List<MarkerStub> markers = markersByType.get(type);
     if (markers == null) return new IMarker[0];
     return markers.toArray(new IMarker[markers.size()]);
   }
 
   /** {@inheritDoc} */
-  public int findMaxProblemSeverity(String type, boolean includeSubtypes, int depth) throws CoreException {
+  public int findMaxProblemSeverity(String type, boolean includeSubtypes, int depth) {
     throw new UnsupportedOperationException();
   }
 
@@ -169,37 +169,37 @@
   }
 
   /** {@inheritDoc} */
-  public String getCharset() throws CoreException {
+  public String getCharset() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public String getCharset(boolean checkImplicit) throws CoreException {
+  public String getCharset(boolean checkImplicit) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public String getCharsetFor(Reader reader) throws CoreException {
+  public String getCharsetFor(Reader reader) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IContentDescription getContentDescription() throws CoreException {
+  public IContentDescription getContentDescription() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public InputStream getContents() throws CoreException {
+  public InputStream getContents() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public InputStream getContents(boolean force) throws CoreException {
+  public InputStream getContents(boolean force) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public int getEncoding() throws CoreException {
+  @Deprecated public int getEncoding() {
     throw new UnsupportedOperationException();
   }
 
@@ -214,7 +214,7 @@
   }
 
   /** {@inheritDoc} */
-  public IFileState[] getHistory(IProgressMonitor monitor) throws CoreException {
+  public IFileState[] getHistory(IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
@@ -259,12 +259,12 @@
   }
 
   /** {@inheritDoc} */
-  public Map<QualifiedName, String> getPersistentProperties() throws CoreException {
+  public Map<QualifiedName, String> getPersistentProperties() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public String getPersistentProperty(QualifiedName key) throws CoreException {
+  public String getPersistentProperty(QualifiedName key) {
     throw new UnsupportedOperationException();
   }
 
@@ -294,12 +294,12 @@
   }
 
   /** {@inheritDoc} */
-  public Map<QualifiedName, Object> getSessionProperties() throws CoreException {
+  public Map<QualifiedName, Object> getSessionProperties() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public Object getSessionProperty(QualifiedName key) throws CoreException {
+  public Object getSessionProperty(QualifiedName key) {
     throw new UnsupportedOperationException();
   }
 
@@ -354,7 +354,7 @@
   }
 
   /** {@inheritDoc} */
-  public boolean isLocal(int depth) {
+  @Deprecated public boolean isLocal(int depth) {
     throw new UnsupportedOperationException();
   }
 
@@ -390,125 +390,125 @@
 
   /** {@inheritDoc} */
   public void move(IPath destination, boolean force, boolean keepHistory, IProgressMonitor monitor)
-      throws CoreException {
+      {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void move(IPath destination, boolean force, IProgressMonitor monitor) throws CoreException {
+  public void move(IPath destination, boolean force, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void move(IPath destination, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void move(IPath destination, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
   public void move(IProjectDescription description, boolean force, boolean keepHistory, IProgressMonitor monitor)
-      throws CoreException {
+      {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void move(IProjectDescription description, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void move(IProjectDescription description, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void refreshLocal(int depth, IProgressMonitor monitor) throws CoreException {
+  public void refreshLocal(int depth, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void revertModificationStamp(long value) throws CoreException {
+  public void revertModificationStamp(long value) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setCharset(String newCharset) throws CoreException {
+  @Deprecated public void setCharset(String newCharset) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setCharset(String newCharset, IProgressMonitor monitor) throws CoreException {
+  public void setCharset(String newCharset, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
   public void setContents(IFileState source, boolean force, boolean keepHistory, IProgressMonitor monitor)
-      throws CoreException {
+      {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setContents(IFileState source, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void setContents(IFileState source, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
   public void setContents(InputStream source, boolean force, boolean keepHistory, IProgressMonitor monitor)
-      throws CoreException {
+      {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setContents(InputStream source, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void setContents(InputStream source, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setDerived(boolean isDerived) throws CoreException {
+  @Deprecated public void setDerived(boolean isDerived) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setDerived(boolean isDerived, IProgressMonitor monitor) throws CoreException {
+  public void setDerived(boolean isDerived, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setHidden(boolean isHidden) throws CoreException {
+  public void setHidden(boolean isHidden) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setLocal(boolean flag, int depth, IProgressMonitor monitor) throws CoreException {
+  @Deprecated public void setLocal(boolean flag, int depth, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public long setLocalTimeStamp(long value) throws CoreException {
+  public long setLocalTimeStamp(long value) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setPersistentProperty(QualifiedName key, String value) throws CoreException {
+  public void setPersistentProperty(QualifiedName key, String value) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setReadOnly(boolean readOnly) {
+  @Deprecated public void setReadOnly(boolean readOnly) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setResourceAttributes(ResourceAttributes attributes) throws CoreException {
+  public void setResourceAttributes(ResourceAttributes attributes) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setSessionProperty(QualifiedName key, Object value) throws CoreException {
+  public void setSessionProperty(QualifiedName key, Object value) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setTeamPrivateMember(boolean isTeamPrivate) throws CoreException {
+  public void setTeamPrivateMember(boolean isTeamPrivate) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void touch(IProgressMonitor monitor) throws CoreException {
+  public void touch(IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
@@ -523,7 +523,7 @@
     return unmodifiableList(markers);
   }
 
-  public void addMarker(MarkerStub marker) throws CoreException {
+  public void addMarker(MarkerStub marker) {
     String type = marker.getType();
     List<MarkerStub> markers = markersByType.get(type);
     if (markers == null) {
diff --git a/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/MarkerStub.java b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/MarkerStub.java
index ee384e6..8386a8a 100644
--- a/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/MarkerStub.java
+++ b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/MarkerStub.java
@@ -1,6 +1,9 @@
 /*
- * 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
+ * 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.junit.stubs;
@@ -11,7 +14,6 @@
 
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
@@ -22,7 +24,7 @@
   private final String type;
   private final long creationTime;
 
-  public static MarkerStub error(String type, String description, int lineNumber) throws CoreException {
+  public static MarkerStub error(String type, String description, int lineNumber) {
     MarkerStub marker = new MarkerStub(type);
     marker.setAttribute(SEVERITY, SEVERITY_ERROR);
     marker.setAttribute(MESSAGE, description);
@@ -41,7 +43,7 @@
   }
 
   /** {@inheritDoc} */
-  public void delete() throws CoreException {
+  public void delete() {
     throw new UnsupportedOperationException();
   }
 
@@ -51,7 +53,7 @@
   }
 
   /** {@inheritDoc} */
-  public Object getAttribute(String attributeName) throws CoreException {
+  public Object getAttribute(String attributeName) {
     return attributes.get(attributeName);
   }
 
@@ -77,12 +79,12 @@
   }
 
   /** {@inheritDoc} */
-  public Map<String, Object> getAttributes() throws CoreException {
+  public Map<String, Object> getAttributes() {
     return unmodifiableMap(attributes);
   }
 
   /** {@inheritDoc} */
-  public Object[] getAttributes(String[] attributeNames) throws CoreException {
+  public Object[] getAttributes(String[] attributeNames) {
     List<Object> values = new ArrayList<Object>();
     for (String name : attributeNames)
       values.add(attributes.get(name));
@@ -90,7 +92,7 @@
   }
 
   /** {@inheritDoc} */
-  public long getCreationTime() throws CoreException {
+  public long getCreationTime() {
     return creationTime;
   }
 
@@ -105,49 +107,49 @@
   }
 
   /** {@inheritDoc} */
-  public String getType() throws CoreException {
+  public String getType() {
     return type;
   }
 
   /** {@inheritDoc} */
-  public boolean isSubtypeOf(String superType) throws CoreException {
+  public boolean isSubtypeOf(String superType) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setAttribute(String attributeName, int value) throws CoreException {
+  public void setAttribute(String attributeName, int value) {
     attributes.put(attributeName, value);
   }
 
   /** {@inheritDoc} */
-  public void setAttribute(String attributeName, Object value) throws CoreException {
+  public void setAttribute(String attributeName, Object value) {
     attributes.put(attributeName, value);
   }
 
   /** {@inheritDoc} */
-  public void setAttribute(String attributeName, boolean value) throws CoreException {
+  public void setAttribute(String attributeName, boolean value) {
     attributes.put(attributeName, value);
   }
 
   /** {@inheritDoc} */
-  public void setAttributes(String[] attributeNames, Object[] values) throws CoreException {
+  public void setAttributes(String[] attributeNames, Object[] values) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setAttributes(Map<String, ? extends Object> attributes) throws CoreException {
+  public void setAttributes(Map<String, ? extends Object> attributes) {
     this.attributes.putAll(attributes);
   }
 
-  public int severity() throws CoreException {
+  public int severity() {
     return getAttribute(SEVERITY, -1);
   }
   
-  public String message() throws CoreException {
+  public String message() {
     return (String) getAttribute(MESSAGE);
   }
 
-  public int lineNumber() throws CoreException {
+  public int lineNumber() {
     return getAttribute(LINE_NUMBER, -1);
   }
 
diff --git a/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/ResourceStub.java b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/ResourceStub.java
new file mode 100644
index 0000000..3da6b23
--- /dev/null
+++ b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/ResourceStub.java
@@ -0,0 +1,167 @@
+/*
+ * 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.junit.stubs;
+
+import static org.eclipse.emf.common.util.URI.createURI;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Map;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ResourceStub implements Resource {
+
+  private URI uri;
+
+  public ResourceStub() {}
+  
+  public ResourceStub(String uri) {
+    setURI(createURI(uri));
+  }
+  
+  /** {@inheritDoc} */
+  public EList<Adapter> eAdapters() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public boolean eDeliver() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void eSetDeliver(boolean deliver) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void eNotify(Notification notification) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public ResourceSet getResourceSet() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public URI getURI() {
+    return uri;
+  }
+
+  /** {@inheritDoc} */
+  public void setURI(URI uri) {
+    this.uri = uri;
+  }
+
+  /** {@inheritDoc} */
+  public long getTimeStamp() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void setTimeStamp(long timeStamp) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public EList<EObject> getContents() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public TreeIterator<EObject> getAllContents() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public String getURIFragment(EObject eObject) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public EObject getEObject(String uriFragment) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void save(Map<?, ?> options) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void load(Map<?, ?> options) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void save(OutputStream outputStream, Map<?, ?> options) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void load(InputStream inputStream, Map<?, ?> options) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public boolean isTrackingModification() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void setTrackingModification(boolean isTrackingModification) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public boolean isModified() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void setModified(boolean isModified) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public boolean isLoaded() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void unload() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void delete(Map<?, ?> options) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public EList<Diagnostic> getErrors() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public EList<Diagnostic> getWarnings() {
+    throw new UnsupportedOperationException();
+  }
+
+}
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 73a3305..bd05dac 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,14 +8,21 @@
  */
 package com.google.eclipse.protobuf.ui.scoping;
 
-import static org.eclipse.emf.common.util.URI.createURI;
+import static com.google.eclipse.protobuf.ui.preferences.paths.FileResolutionType.SINGLE_FOLDER;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.*;
 
+import org.eclipse.core.resources.IProject;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.junit.*;
 
 import com.google.eclipse.protobuf.junit.core.XtextRule;
+import com.google.eclipse.protobuf.junit.stubs.ResourceStub;
 import com.google.eclipse.protobuf.scoping.IFileUriResolver;
+import com.google.eclipse.protobuf.ui.preferences.paths.*;
 import com.google.inject.*;
 
 /**
@@ -27,51 +34,60 @@
 
   @Rule public XtextRule xtext = new XtextRule();
   
-  private URI resourceUri;
-  private ResourcesStub resources;
+  private Resource resource;
+  private PreferenceReader preferenceReader;
+  private Preferences preferences;
+  private IProject project;
+  private Resources resources;
+
   private FileUriResolver resolver;
 
   @Before public void setUp() {
-    resources = new ResourcesStub();
-    resources.resourceShouldAlwaysExist = true;
+    resource = new ResourceStub("platform:/resource/src/proto/person.proto");
+    preferenceReader = mock(PreferenceReader.class);
+    preferences = mock(Preferences.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(Resources.class).toInstance(resources);
         binder.bind(IFileUriResolver.class).to(FileUriResolver.class);
       }
     };
     Injector injector = xtext.injector().createChildInjector(module);
-    resourceUri = createURI("platform:/resource/src/proto/person.proto");
     resolver = (FileUriResolver) injector.getInstance(IFileUriResolver.class);
   }
 
   @Test public void should_resolve_import_URI_if_missing_scheme() {
-    resolver.resolveUri("folder1/address.proto", null);
-//    String uri = resolver.resolveUri("folder1/address.proto", resourceUri);
-//    assertThat(uri, equalTo("platform:/resource/src/proto/folder1/address.proto"));  
+    callStubs(SINGLE_FOLDER, 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() {
-//    String originalUri = "platform:/resource/src/proto/folder1/address.proto";
-//    String uri = resolver.resolveUri(originalUri, resourceUri, resources);
-//    assertThat(uri, equalTo(originalUri));
-//  }
-//  
-//  @Test public void should_resolve_import_URI_even_if_overlapping_folders_with_resource_URI() {
-//    String uri = resolver.resolveUri("src/proto/folder1/address.proto", resourceUri);
-//    assertThat(uri, equalTo("platform:/resource/src/proto/folder1/address.proto"));  
-//  }
-//
-//  @Test public void should_resolve_import_URI_even_if_overlapping_one_folder_only_with_resource_URI() {
-//    String uri = resolver.resolveUri("src/proto/read-only/address.proto", resourceUri);
-//    assertThat(uri, equalTo("platform:/resource/src/proto/read-only/address.proto"));  
-//  }
-//  
-  private static class ResourcesStub extends Resources {
-    boolean resourceShouldAlwaysExist;
-    
-    @Override public boolean fileExists(URI uri) {
-      return resourceShouldAlwaysExist;
-    }
+  
+  @Test public void should_not_resolve_import_URI_if_not_missing_scheme() {
+    callStubs(SINGLE_FOLDER, 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);
+    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);
+    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) {
+    when(resources.project(resource)).thenReturn(project);
+    when(preferenceReader.readFromPrefereceStore(project)).thenReturn(preferences);
+    when(preferences.fileResolutionType()).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/paths/PreferenceReader.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PreferenceReader.java
new file mode 100644
index 0000000..3f7cb03
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PreferenceReader.java
@@ -0,0 +1,34 @@
+/*
+ * 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.preferences.paths;
+
+import static com.google.eclipse.protobuf.ui.preferences.paths.PreferenceNames.ENABLE_PROJECT_SETTINGS;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
+
+import com.google.inject.Inject;
+
+/**
+ * Reads "paths" preferences.
+ * 
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class PreferenceReader {
+
+  @Inject private IPreferenceStoreAccess storeAccess;
+  
+  public Preferences readFromPrefereceStore(IProject project) {
+    IPreferenceStore store = storeAccess.getWritablePreferenceStore(project);
+    boolean useProject = store.getBoolean(ENABLE_PROJECT_SETTINGS);
+    if (!useProject) store = storeAccess.getWritablePreferenceStore();
+    return new Preferences(store);
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/Preferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/Preferences.java
index a478679..8613469 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/Preferences.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/Preferences.java
@@ -9,16 +9,14 @@
 package com.google.eclipse.protobuf.ui.preferences.paths;
 
 import static com.google.eclipse.protobuf.ui.preferences.paths.FileResolutionType.SINGLE_FOLDER;
-import static com.google.eclipse.protobuf.ui.preferences.paths.PreferenceNames.*;
+import static com.google.eclipse.protobuf.ui.preferences.paths.PreferenceNames.FOLDER_NAMES;
 import static com.google.eclipse.protobuf.ui.util.Strings.CSV_PATTERN;
 import static java.util.Arrays.asList;
 import static java.util.Collections.*;
 
 import java.util.List;
 
-import org.eclipse.core.resources.IProject;
 import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
 
 /**
  * Paths preferences, retrieved from an <code>{@link IPreferenceStore}</code>.
@@ -27,17 +25,10 @@
  */
 public class Preferences {
 
-  public final FileResolutionType fileResolutionType;
-  public final List<String> folderNames; 
+  private final FileResolutionType fileResolutionType;
+  private final List<String> folderNames; 
   
-  public static Preferences loadPreferences(IPreferenceStoreAccess access, IProject project) {
-    IPreferenceStore store = access.getWritablePreferenceStore(project);
-    boolean useProjectPreferences = store.getBoolean(ENABLE_PROJECT_SETTINGS);
-    if (!useProjectPreferences) store = access.getWritablePreferenceStore();
-    return new Preferences(store);
-  }
-  
-  private Preferences(IPreferenceStore store) {
+  Preferences(IPreferenceStore store) {
     fileResolutionType = FileResolutionType.find(store);
     folderNames = folderNames(fileResolutionType, store);
   }
@@ -47,4 +38,12 @@
     String[] folderNames = store.getString(FOLDER_NAMES).split(CSV_PATTERN);
     return unmodifiableList(asList(folderNames));
   }
+
+  public FileResolutionType fileResolutionType() {
+    return fileResolutionType;
+  }
+
+  public List<String> folderNames() {
+    return folderNames;
+  }
 }
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 5249e26..e5e6491 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
@@ -17,10 +17,10 @@
 
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
 import org.eclipse.xtext.util.Pair;
 
 import com.google.eclipse.protobuf.scoping.IFileUriResolver;
+import com.google.eclipse.protobuf.ui.preferences.paths.PreferenceReader;
 import com.google.eclipse.protobuf.ui.preferences.paths.Preferences;
 import com.google.inject.Inject;
 
@@ -31,7 +31,7 @@
   
   private static final String SEPARATOR = "/";
 
-  @Inject private IPreferenceStoreAccess access;
+  @Inject private PreferenceReader preferenceReader;
   @Inject private Resources resources;
   
   /*
@@ -52,23 +52,22 @@
   public String resolveUri(String importUri, Resource declaringResource) {
     if (importUri.startsWith(PREFIX)) return importUri;
     Pair<String, List<String>> importUriPair = pair(importUri, createURI(importUri).segmentsList());
+    Preferences preferences = preferenceReader.readFromPrefereceStore(resources.project(declaringResource));
     URI resourceUri = declaringResource.getURI();
-    Preferences preferences = Preferences.loadPreferences(access, resources.project(resourceUri));
-    String fixed = fixUri(importUriPair, resourceUri, preferences);
+    String fixed = resolveUri(importUriPair, resourceUri, preferences);
     System.out.println(resourceUri + " : " + importUri + " : " + fixed);
     if (fixed == null) return importUri;
     return fixed;
   }
   
-  private String fixUri(Pair<String, List<String>> importUri, URI resourceUri, Preferences preferences) {
+  private String resolveUri(Pair<String, List<String>> importUri, URI resourceUri, Preferences preferences) {
     List<String> segments = removeFirstAndLast(resourceUri.segmentsList());
-    if (preferences.fileResolutionType.equals(SINGLE_FOLDER)) {
-      return fixUri(importUri, segments);
+    if (preferences.fileResolutionType().equals(SINGLE_FOLDER)) {
+      return resolveUri(importUri, segments);
     }
-    List<String> folderNames = preferences.folderNames;
-    for (String folderName : folderNames) {
+    for (String folderName : preferences.folderNames()) {
       segments.set(1, folderName);
-      String fixed = fixUri(importUri, segments);
+      String fixed = resolveUri(importUri, segments);
       if (fixed != null) return fixed;
     }
     return null;
@@ -82,7 +81,7 @@
     return newList;
   }
   
-  private String fixUri(Pair<String, List<String>> importUri, List<String> resourceUri) {
+  private String resolveUri(Pair<String, List<String>> importUri, List<String> resourceUri) {
     StringBuilder prefix = new StringBuilder();
     // prefix.append(PREFIX);
     String firstSegment = importUri.getSecond().get(0);
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 b252395..876f0d4 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
@@ -12,6 +12,7 @@
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
 
 /**
  * Utility methods related to resources (e.g. files, directories.)
@@ -21,12 +22,12 @@
 public class Resources {
 
   /**
-   * Returns the project that contains the resource at the given URI.
-   * @param fileUri the URI of a resource.
-   * @return the project that contains the resource at the given URI.
+   * Returns the project that contains the given resource.
+   * @param resource the given resource.
+   * @return the project that contains the given resource.
    */
-  public IProject project(URI fileUri) {
-    return file(fileUri).getProject();
+  public IProject project(Resource resource) {
+    return file(resource.getURI()).getProject();
   }
   
   /**
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 044a1a2..1c0a857 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
@@ -32,8 +32,7 @@
    */
   String resolveUri(String importUri, Resource declaringResource);
   
-  public static class NullFileUriResolver implements IFileUriResolver {
-    
+  class NullFileUriResolver implements IFileUriResolver {
     public String resolveUri(String importUri, Resource declaringResource) {
       throw new UnsupportedOperationException();
     }