[464613] Check if URIs exist in the model dependency provider

Change-Id: Ia631a584d407e50221284f5dc30300577459c66e
Signed-off-by: Axel Richard <axel.richard@obeo.fr>
diff --git a/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/dependency/PapyrusDependencyProvider.java b/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/dependency/PapyrusDependencyProvider.java
index bc5cbdb..ba5463b 100644
--- a/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/dependency/PapyrusDependencyProvider.java
+++ b/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/dependency/PapyrusDependencyProvider.java
@@ -51,11 +51,11 @@
 	 * {@inheritDoc} Checks the Papyrus model extension point and tries to determine all dependencies from the
 	 * registered information.
 	 */
-	public Set<URI> getDependencies(URI uri) {
+	public Set<URI> getDependencies(URI uri, URIConverter uriConverter) {
 		final Set<URI> dependencies = new LinkedHashSet<URI>();
 		for (String fileExtension : fileExtensions) {
 			URI dependencyURI = uri.trimFileExtension().appendFileExtension(fileExtension);
-			if (URIConverter.INSTANCE.exists(dependencyURI, null)) {
+			if (uriConverter.exists(dependencyURI, null)) {
 				dependencies.add(dependencyURI);
 			}
 		}
diff --git a/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/logical/resolver/ThreadedModelResolverWithCustomDependencyProviderTest.java b/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/logical/resolver/ThreadedModelResolverWithCustomDependencyProviderTest.java
index 97aabcd..b77cfe3 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/logical/resolver/ThreadedModelResolverWithCustomDependencyProviderTest.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/logical/resolver/ThreadedModelResolverWithCustomDependencyProviderTest.java
@@ -40,6 +40,7 @@
 import org.eclipse.emf.compare.ide.ui.tests.CompareTestCase;
 import org.eclipse.emf.compare.ide.ui.tests.workspace.TestProject;
 import org.eclipse.emf.compare.ide.utils.StorageTraversal;
+import org.eclipse.emf.ecore.resource.URIConverter;
 import org.junit.Test;
 import org.osgi.framework.Bundle;
 
@@ -244,7 +245,7 @@
 	private ModelDependencyProviderRegistry createRegistryWithCustomResolver() {
 		final ModelDependencyProviderRegistry registry = new ModelDependencyProviderRegistry() {
 			@Override
-			public Set<URI> getDependencies(URI uri) {
+			public Set<URI> getDependencies(URI uri, URIConverter uriConverter) {
 				final String uriString = uri.toPlatformString(false);
 				final String baseUriString = uriString.substring(0, uriString.lastIndexOf("/"));
 				final String file1UriString = baseUriString + "/" + MODEL_FILE1;
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/dependency/IDependencyProvider.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/dependency/IDependencyProvider.java
index f1e71b0..a9663cd 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/dependency/IDependencyProvider.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/dependency/IDependencyProvider.java
@@ -15,6 +15,7 @@
 import java.util.Set;
 
 import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.URIConverter;
 
 /**
  * Contract for clients of the org.eclipse.emf.ecompare.ide.ui.modelDependencies extension point.
@@ -40,8 +41,10 @@
 	 * 
 	 * @param uri
 	 *            The {@link URI} for which additional dependencies may be determined.
+	 * @param uriConverter
+	 *            The {@link URIConverter} to produce an input stream for the {@link URI}.
 	 * @return The set of dependencies of the given {@code uri}. If no dependency is determined an empty set
 	 *         is returned.
 	 */
-	Set<URI> getDependencies(URI uri);
+	Set<URI> getDependencies(URI uri, URIConverter uriConverter);
 }
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/dependency/ModelDependencyProviderRegistry.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/dependency/ModelDependencyProviderRegistry.java
index c553649..d9c79b9 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/dependency/ModelDependencyProviderRegistry.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/dependency/ModelDependencyProviderRegistry.java
@@ -22,6 +22,7 @@
 import java.util.Set;
 
 import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.URIConverter;
 
 /**
  * The registry managing the registered dependency extension point information.
@@ -50,12 +51,12 @@
 	 * @return The set of dependencies of {@code uri}. If {@code uri} has no dependency, the returned set is
 	 *         empty.
 	 */
-	public Set<URI> getDependencies(URI uri) {
+	public Set<URI> getDependencies(URI uri, URIConverter uriConverter) {
 		final Set<URI> uris = new LinkedHashSet<URI>();
 		for (DependencyProviderDescriptor descriptor : registeredDescriptors.values()) {
 			IDependencyProvider provider = descriptor.getDependencyProvider();
 			if (provider != null && provider.apply(uri)) {
-				Collection<URI> dependencies = provider.getDependencies(uri);
+				Collection<URI> dependencies = provider.getDependencies(uri, uriConverter);
 				if (dependencies != null) {
 					addAll(uris, Iterables.filter(dependencies, notNull()));
 				}
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/resolver/RevisionedURIConverter.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/resolver/RevisionedURIConverter.java
index dfb1df3..6f673ef 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/resolver/RevisionedURIConverter.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/resolver/RevisionedURIConverter.java
@@ -121,19 +121,7 @@
 			stream = super.createInputStream(normalizedUri, options);
 		} else {
 			// Otherwise, load it from the repository (resource might not yet (or no longer) exist locally)
-			final IResource targetFile;
-			if (normalizedUri.isPlatform()) {
-				IPath platformString = new Path(normalizedUri.trimFragment().toPlatformString(true));
-				targetFile = ResourcesPlugin.getWorkspace().getRoot().getFile(platformString);
-			} else {
-				/*
-				 * FIXME Deresolve the URI against the workspace root, if it cannot be done, delegate to
-				 * super.createInputStream()
-				 */
-				targetFile = ResourcesPlugin.getWorkspace().getRoot().getFile(
-						new Path(normalizedUri.trimFragment().toString()));
-			}
-
+			final IResource targetFile = getResourceFromURI(normalizedUri);
 			if (targetFile != null) {
 				stream = openRevisionStream(targetFile);
 			} else {
@@ -145,6 +133,53 @@
 	}
 
 	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.compare.ide.utils.StorageURIConverter#exists(org.eclipse.emf.common.util.URI,
+	 *      java.util.Map)
+	 */
+	@Override
+	public boolean exists(URI uri, Map<?, ?> options) {
+		boolean exists = false;
+		try {
+			final URI normalizedUri = normalize(uri);
+			IStorageProvider storageProvider = storageAccessor.getStorageProvider(
+					getResourceFromURI(normalizedUri), side);
+			if (storageProvider != null) {
+				exists = storageProvider.getStorage(new NullProgressMonitor()) != null;
+			} else {
+				exists = super.exists(normalizedUri, options);
+			}
+		} catch (CoreException e) {
+			EMFCompareIDEUIPlugin.getDefault().log(IStatus.ERROR, e.getMessage());
+		}
+		return exists;
+	}
+
+	/**
+	 * Retrieve the {@link IResource} associated with the given {@link URI}.
+	 * 
+	 * @param uri
+	 *            the URI for which we want the {@link IResource}.
+	 * @return the {@link IResource} if found, null otherwise.
+	 */
+	private IResource getResourceFromURI(final URI uri) {
+		final IResource targetFile;
+		if (uri.isPlatform()) {
+			IPath platformString = new Path(uri.trimFragment().toPlatformString(true));
+			targetFile = ResourcesPlugin.getWorkspace().getRoot().getFile(platformString);
+		} else {
+			/*
+			 * FIXME Deresolve the URI against the workspace root, if it cannot be done, delegate to
+			 * super.createInputStream()
+			 */
+			targetFile = ResourcesPlugin.getWorkspace().getRoot().getFile(
+					new Path(uri.trimFragment().toString()));
+		}
+		return targetFile;
+	}
+
+	/**
 	 * Opens an input stream on the contents of the given file as provided by the registered
 	 * {@link #subscriber}.
 	 * <p>
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/resolver/ThreadedModelResolver.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/resolver/ThreadedModelResolver.java
index 91803bd..372e76f 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/resolver/ThreadedModelResolver.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/resolver/ThreadedModelResolver.java
@@ -84,6 +84,7 @@
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.URIConverter;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.jface.preference.IPreferenceStore;
 
@@ -1108,7 +1109,7 @@
 	private Set<IStorage> resolveTraversal(IFile file, Set<URI> bounds) {
 		final URI baseUri = createURIFor(file);
 		final Set<IStorage> traversalSet = new LinkedHashSet<IStorage>();
-		for (URI uri : getUriAndDependentUrisFromDependencyProvider(baseUri)) {
+		for (URI uri : getUriAndDependentUrisFromDependencyProvider(baseUri, URIConverter.INSTANCE)) {
 			final IFile toResolve = getFileAt(uri);
 			final Iterable<URI> dependencies = getDependenciesOf(toResolve, bounds);
 			for (URI dep : dependencies) {
@@ -1118,8 +1119,8 @@
 		return traversalSet;
 	}
 
-	private Set<URI> getUriAndDependentUrisFromDependencyProvider(URI uri) {
-		final Set<URI> dependencies = dependencyProviderRegistry.getDependencies(uri);
+	private Set<URI> getUriAndDependentUrisFromDependencyProvider(URI uri, URIConverter uriConverter) {
+		final Set<URI> dependencies = dependencyProviderRegistry.getDependencies(uri, uriConverter);
 		return Sets.union(Collections.singleton(uri), dependencies);
 	}
 
@@ -1293,7 +1294,8 @@
 		lock.lock();
 		try {
 			monitor.setWorkRemaining(1000);
-			for (URI currentUri : getUriAndDependentUrisFromDependencyProvider(uri)) {
+			for (URI currentUri : getUriAndDependentUrisFromDependencyProvider(uri, resourceSet
+					.getURIConverter())) {
 				if (resolvedResources.add(currentUri) && currentlyResolving.add(currentUri)) {
 					ListenableFuture<?> future = resolvingPool.submit(new ResourceResolver(resourceSet,
 							currentUri, monitor));
@@ -1330,7 +1332,8 @@
 		lock.lock();
 		try {
 			monitor.setWorkRemaining(1000);
-			for (URI currentUri : getUriAndDependentUrisFromDependencyProvider(uri)) {
+			for (URI currentUri : getUriAndDependentUrisFromDependencyProvider(uri, resourceSet
+					.getURIConverter())) {
 				if (resolvedResources.add(currentUri) && currentlyResolving.add(currentUri)) {
 					ListenableFuture<?> future = resolvingPool.submit(new RemoteResourceResolver(resourceSet,
 							currentUri, monitor));