[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));