diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo/src/org')
7 files changed, 85 insertions, 18 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java index 3ee117aa10..8b0dfefb45 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java @@ -600,11 +600,17 @@ public class CDOPushTransaction extends Notifier implements CDOTransaction return delegate.getSession(); } + /** + * @since 4.4 + */ public CDOViewProvider getProvider() { return delegate.getProvider(); } + /** + * @since 4.4 + */ public URI createResourceURI(String path) { return delegate.createResourceURI(path); diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/AbstractCDOViewProvider.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/AbstractCDOViewProvider.java index 1e2b04e7d4..eede842478 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/AbstractCDOViewProvider.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/AbstractCDOViewProvider.java @@ -108,22 +108,22 @@ public abstract class AbstractCDOViewProvider implements CDOViewProvider2 } /** - * Must be overwritten for non-canonical URI formats! + * Should be overwritten for non-canonical URI formats! * * @since 4.4 */ public URI getViewURI(URI uri) { - return null; + return URI.createHierarchicalURI(uri.scheme(), uri.authority(), uri.device(), null, null); } /** - * Must be overwritten for non-canonical URI formats! + * Should be overwritten for non-canonical URI formats! * * @since 4.4 */ public String getPath(URI uri) { - return null; + return uri.path(); } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOView.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOView.java index 6a10b461be..6edeec568e 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOView.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOView.java @@ -109,6 +109,8 @@ public interface CDOView extends CDOCommonView, CDOUpdatable, CDOCommitHistory.P /** * Returns the {@link CDOViewProvider provider} that has opened this view. + * + * @since 4.4 */ public CDOViewProvider getProvider(); diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOURIHandler.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOURIHandler.java index 533e0550bc..2a71c70b04 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOURIHandler.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOURIHandler.java @@ -57,13 +57,6 @@ public class CDOURIHandler implements URIHandler public boolean canHandle(URI uri) { - int xxx; - // if (CDO_URI_SCHEME.equals(uri.scheme())) - // { - // String uuid = view.getSession().getRepositoryInfo().getUUID(); - // return uuid.equals(CDOURIUtil.extractRepositoryUUID(uri)); - // } - CDOViewProvider[] viewProviders = CDOViewProviderRegistry.INSTANCE.getViewProviders(uri); return viewProviders.length != 0; } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewProviderRegistryImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewProviderRegistryImpl.java index 9f84622be8..92e7d3759d 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewProviderRegistryImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewProviderRegistryImpl.java @@ -30,6 +30,7 @@ import org.eclipse.net4j.util.om.OMPlatform; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.spi.cdo.InternalCDOView; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; @@ -90,24 +91,69 @@ public class CDOViewProviderRegistryImpl extends Container<CDOViewProvider>imple for (CDOViewProvider viewProvider : getViewProviders(uri)) { - if (viewSet != null && viewProvider instanceof CDOViewProvider2) + InternalCDOView view = provideView(uri, resourceSet, viewSet, viewProvider); + if (view != null) { - URI viewURI = ((CDOViewProvider2)viewProvider).getViewURI(uri); + CDOViewProvider provider = view.getProvider(); + if (provider != null) + { + if (provider != viewProvider) + { + throw new IllegalStateException("View providers don't match"); + } + } + else + { + view.setProvider(viewProvider); + } + + return view; + } + } - CDOView view = viewSet.resolveView(viewURI); + return null; + } + + private InternalCDOView provideView(URI uri, ResourceSet resourceSet, CDOViewSet viewSet, + CDOViewProvider viewProvider) + { + if (viewSet != null && viewProvider instanceof CDOViewProvider2) + { + URI viewURI; + + try + { + viewURI = ((CDOViewProvider2)viewProvider).getViewURI(uri); + } + catch (IllegalArgumentException ex) + { + throw new IllegalArgumentException(ex.getMessage() + ": " + uri, ex); + } + catch (Error ex) + { + throw ex; + } + + try + { + InternalCDOView view = (InternalCDOView)viewSet.resolveView(viewURI); if (view != null) { return view; } } - - CDOView view = viewProvider.getView(uri, resourceSet); - if (view != null) + catch (Exception ex) { - return view; + //$FALL-THROUGH$ } } + InternalCDOView view = (InternalCDOView)viewProvider.getView(uri, resourceSet); + if (view != null) + { + return view; + } + return null; } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/PluginContainerViewProvider.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/PluginContainerViewProvider.java index 4e2103e3d0..7cb8465da7 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/PluginContainerViewProvider.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/PluginContainerViewProvider.java @@ -12,6 +12,7 @@ package org.eclipse.emf.internal.cdo.view; import org.eclipse.emf.cdo.session.CDOSession; +import org.eclipse.emf.cdo.util.CDOURIUtil; import org.eclipse.emf.cdo.util.InvalidURIException; import org.eclipse.emf.cdo.view.CDOView; import org.eclipse.emf.cdo.view.CDOViewProvider; @@ -25,6 +26,8 @@ import org.eclipse.net4j.util.container.IPluginContainer; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.core.runtime.Path; + /** * Provides <code>CDOView</code> from <code>CDOSession</code> registered in IPluginContainer * @@ -70,6 +73,20 @@ public class PluginContainerViewProvider extends ManagedContainerViewProvider } @Override + public URI getResourceURI(CDOView view, String path) + { + if (path == null) + { + path = ""; + } + + String authority = view.getSession().getRepositoryInfo().getUUID(); + String[] segments = new Path(path).segments(); + + return URI.createHierarchicalURI(CDOURIUtil.PROTOCOL_NAME, authority, null, segments, null, null); + } + + @Override protected IManagedContainer getContainer() { return IPluginContainer.INSTANCE; diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOViewSet.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOViewSet.java index 43a7b7942a..d52069af77 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOViewSet.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOViewSet.java @@ -31,6 +31,9 @@ public interface InternalCDOViewSet extends CDOViewSet, Adapter public void remove(InternalCDOView view); + /** + * @since 4.4 + */ public InternalCDOView resolveView(URI viewURI); @Deprecated |