Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Roldan Betancort2008-12-30 19:58:57 +0000
committerVictor Roldan Betancort2008-12-30 19:58:57 +0000
commite28e0f3492b5a8895bb683d31255b4305ed2ad12 (patch)
tree766eeb7a09d99434ef24704809fb688b77e0d2ce /plugins
parentf3f2c372b54a1f0c4a2fc723841a3909ac8c3953 (diff)
downloadcdo-e28e0f3492b5a8895bb683d31255b4305ed2ad12.tar.gz
cdo-e28e0f3492b5a8895bb683d31255b4305ed2ad12.tar.xz
cdo-e28e0f3492b5a8895bb683d31255b4305ed2ad12.zip
[259518] Create a Container based CDOViewProvider
https://bugs.eclipse.org/bugs/show_bug.cgi?id=259518
Diffstat (limited to 'plugins')
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceFactoryImpl.java11
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java25
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOViewAdapter.java56
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOViewProviderRegistry.java16
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/ManagedContainerViewProvider.java47
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CDOViewProviderImpl.java48
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CDOViewProviderRegistryImpl.java96
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/PluginContainerViewProvider.java79
8 files changed, 314 insertions, 64 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceFactoryImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceFactoryImpl.java
index eee1cc60ba..85003a7906 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceFactoryImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceFactoryImpl.java
@@ -16,7 +16,7 @@ import org.eclipse.emf.cdo.CDOView;
import org.eclipse.emf.cdo.CDOViewSet;
import org.eclipse.emf.cdo.eresource.CDOResourceFactory;
import org.eclipse.emf.cdo.util.CDOURIUtil;
-import org.eclipse.emf.cdo.util.CDOViewProvider;
+import org.eclipse.emf.cdo.util.CDOViewAdapter;
import org.eclipse.emf.cdo.util.CDOViewProviderRegistry;
import org.eclipse.emf.internal.cdo.InternalCDOViewSet;
@@ -67,8 +67,7 @@ public class CDOResourceFactoryImpl implements Resource.Factory, CDOResourceFact
public Resource createResource(URI uri)
{
- CDOViewProvider viewProvider = CDOViewProviderRegistry.INSTANCE.getViewProvider(uri);
- CDOView view = viewProvider.getView(uri, viewSet);
+ CDOView view = CDOViewProviderRegistry.INSTANCE.provideView(uri, viewSet);
// Build a new URI with the view and the path
String path = CDOURIUtil.extractResourcePath(uri);
@@ -78,6 +77,12 @@ public class CDOResourceFactoryImpl implements Resource.Factory, CDOResourceFact
CDOResourceImpl resource = new CDOResourceImpl(newURI);
resource.setRoot(CDOURIUtil.SEGMENT_SEPARATOR.equals(path));
resource.setExisting(isGetResource());
+ if (view != null)
+ {
+ CDOViewAdapter adapter = new CDOViewAdapter(view);
+ resource.eAdapters().add(adapter);
+ }
+
return resource;
}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java
index d1c4632708..83e0a82109 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java
@@ -19,6 +19,8 @@ import org.eclipse.emf.cdo.common.id.CDOIDUtil;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.eresource.EresourcePackage;
import org.eclipse.emf.cdo.util.CDOURIUtil;
+import org.eclipse.emf.cdo.util.CDOUtil;
+import org.eclipse.emf.cdo.util.CDOViewAdapter;
import org.eclipse.emf.cdo.util.ObjectNotFoundException;
import org.eclipse.emf.internal.cdo.CDOStateMachine;
@@ -27,6 +29,7 @@ import org.eclipse.emf.internal.cdo.InternalCDOTransaction;
import org.eclipse.emf.internal.cdo.InternalCDOView;
import org.eclipse.emf.internal.cdo.util.FSMUtil;
+import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.common.notify.impl.NotificationChainImpl;
@@ -799,6 +802,28 @@ public class CDOResourceImpl extends CDOResourceNodeImpl implements CDOResource,
setResourceSet(resourceSet);
+ // ResourceSet isn't prepared, try to look for a CDOViewAdapter
+ if (resourceSet != null && CDOUtil.getViewSet(resourceSet) == null)
+ {
+ InternalCDOView view = cdoView();
+ if (view == null)
+ {
+ for (Iterator<Adapter> it = eAdapters().iterator(); it.hasNext();)
+ {
+ Adapter adapter = it.next();
+ if (adapter instanceof CDOViewAdapter)
+ {
+ view = (InternalCDOView)((CDOViewAdapter)adapter).getView();
+ cdoInternalSetView(view);
+ view.attachResource(this);
+
+ it.remove();
+ break;
+ }
+ }
+ }
+ }
+
if (eNotificationRequired())
{
if (notifications == null)
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOViewAdapter.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOViewAdapter.java
new file mode 100644
index 0000000000..68e9bdb2de
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOViewAdapter.java
@@ -0,0 +1,56 @@
+/***************************************************************************
+ * Copyright (c) 2004 - 2008 Eike Stepper, Germany.
+ * 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
+ *
+ * Contributors:
+ * Victor Roldan Betancort - initial API and implementation
+ **************************************************************************/
+package org.eclipse.emf.cdo.util;
+
+import org.eclipse.emf.cdo.CDOView;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+
+/**
+ * Adapter meant to carry a <code>CDOView</code> associated with (and needed by) certain <code>CDOResource</code>
+ *
+ * @author Victor Roldan Betancort
+ * @since 2.0
+ */
+public class CDOViewAdapter implements Adapter
+{
+ private CDOView view;
+
+ public CDOViewAdapter(CDOView view)
+ {
+ this.view = view;
+ }
+
+ public CDOView getView()
+ {
+ return view;
+ }
+
+ public Notifier getTarget()
+ {
+ return null;
+ }
+
+ public void setTarget(Notifier newTarget)
+ {
+ }
+
+ public boolean isAdapterForType(Object type)
+ {
+ return false;
+ }
+
+ public void notifyChanged(Notification notification)
+ {
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOViewProviderRegistry.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOViewProviderRegistry.java
index a3d10947ec..d6a8815310 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOViewProviderRegistry.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOViewProviderRegistry.java
@@ -10,12 +10,15 @@
**************************************************************************/
package org.eclipse.emf.cdo.util;
+import org.eclipse.emf.cdo.CDOView;
+import org.eclipse.emf.cdo.CDOViewSet;
+
import org.eclipse.net4j.util.container.IContainer;
import org.eclipse.emf.common.util.URI;
/**
- * A registry of CDOViewProvider implementations.
+ * A global registry of {@link CDOViewProvider view provider} implementations.
*
* @author Victor Roldan Betancort
* @since 2.0
@@ -25,9 +28,16 @@ public interface CDOViewProviderRegistry extends IContainer<CDOViewProvider>
public static final CDOViewProviderRegistry INSTANCE = org.eclipse.emf.internal.cdo.util.CDOViewProviderRegistryImpl.INSTANCE;
/**
- * Returns a <code>CDOViewProvider</code> instance, determined by certain criteria based on the argument URI.
+ * Returns a {@link CDOView view} that serves the given URI in the given {@link CDOViewSet view set}, or
+ * <code>null</code> if no {@link CDOViewProvider view provider} in this registry can provide such a view
+ */
+ public CDOView provideView(URI uri, CDOViewSet viewSet);
+
+ /**
+ * Returns an array of <code>CDOViewProvider</code> instances, determined and ordered by certain criteria based on the
+ * argument URI.
*/
- public CDOViewProvider getViewProvider(URI uri);
+ public CDOViewProvider[] getViewProviders(URI uri);
/**
* Registers a new <code>CDOViewProvider</code> instance
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/ManagedContainerViewProvider.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/ManagedContainerViewProvider.java
new file mode 100644
index 0000000000..b028d5194d
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/ManagedContainerViewProvider.java
@@ -0,0 +1,47 @@
+/***************************************************************************
+ * Copyright (c) 2004 - 2008 Eike Stepper and others.
+ * 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
+ *
+ * Contributors:
+ * Victor Roldan Betancort - initial API and implementation
+ **************************************************************************/
+package org.eclipse.emf.cdo.util;
+
+import org.eclipse.net4j.util.container.IManagedContainer;
+import org.eclipse.net4j.util.om.OMPlatform;
+
+/**
+ * Base class for <code>ManagedContainer</code> based <code>CDOViewProvider</code>
+ *
+ * @author Victor Roldan Betancort
+ * @since 2.0
+ */
+public abstract class ManagedContainerViewProvider extends AbstractCDOViewProvider
+{
+ private IManagedContainer container;
+
+ public ManagedContainerViewProvider(IManagedContainer container, String regex, int priority)
+ {
+ super(regex, priority);
+ this.container = container;
+ }
+
+ protected IManagedContainer getContainer()
+ {
+ return container;
+ }
+
+ @Override
+ public int getPriority()
+ {
+ if (!OMPlatform.INSTANCE.isOSGiRunning())
+ {
+ return Integer.MIN_VALUE;
+ }
+
+ return super.getPriority();
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CDOViewProviderImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CDOViewProviderImpl.java
deleted file mode 100644
index ece60dd4fa..0000000000
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CDOViewProviderImpl.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/***************************************************************************
- * Copyright (c) 2004 - 2008 Eike Stepper, Germany.
- * 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
- *
- * Contributors:
- * Victor Roldan Betancort - initial API and implementation
- **************************************************************************/
-package org.eclipse.emf.internal.cdo.util;
-
-import org.eclipse.emf.cdo.CDOView;
-import org.eclipse.emf.cdo.CDOViewSet;
-import org.eclipse.emf.cdo.util.AbstractCDOViewProvider;
-import org.eclipse.emf.cdo.util.CDOURIUtil;
-
-import org.eclipse.emf.common.util.URI;
-
-/**
- * Emulates the same behaviour as before the CDOViewProvider concept was introduced. Will provide a view from an already
- * populated <code>CDOViewSet</code>
- *
- * @author Victor Roldan Betancort
- * @since 2.0
- */
-public class CDOViewProviderImpl extends AbstractCDOViewProvider
-{
- public CDOViewProviderImpl()
- {
- super("cdo:.*");
- }
-
- public CDOView getView(URI uri, CDOViewSet viewSet)
- {
- if (viewSet == null)
- {
- throw new IllegalArgumentException("viewSet == null");
- }
- if (uri == null)
- {
- throw new IllegalArgumentException("uri == null");
- }
-
- String repositoryUUID = CDOURIUtil.extractRepositoryUUID(uri);
- return viewSet.resolveView(repositoryUUID);
- }
-}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CDOViewProviderRegistryImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CDOViewProviderRegistryImpl.java
index c5dd643f8e..ce5d2464cf 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CDOViewProviderRegistryImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CDOViewProviderRegistryImpl.java
@@ -13,6 +13,7 @@ package org.eclipse.emf.internal.cdo.util;
import org.eclipse.emf.cdo.CDOView;
import org.eclipse.emf.cdo.CDOViewSet;
import org.eclipse.emf.cdo.util.AbstractCDOViewProvider;
+import org.eclipse.emf.cdo.util.CDOURIUtil;
import org.eclipse.emf.cdo.util.CDOViewProvider;
import org.eclipse.emf.cdo.util.CDOViewProviderRegistry;
@@ -31,6 +32,8 @@ import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
/**
@@ -51,26 +54,95 @@ public class CDOViewProviderRegistryImpl extends Container<CDOViewProvider> impl
public CDOViewProviderRegistryImpl()
{
- addViewProvider(new CDOViewProviderImpl());
+ addViewProvider(new PluginContainerViewProvider());
}
- public CDOViewProvider getViewProvider(URI uri)
+ public CDOView provideView(URI uri, CDOViewSet viewSet)
{
- CDOViewProvider result = null;
- for (CDOViewProvider viewProvider : viewProviders)
+ if (uri == null)
{
- if (viewProvider.matchesRegex(uri))
+ return null;
+ }
+
+ if (viewSet != null)
+ {
+ try
{
- if (result == null || result.getPriority() < viewProvider.getPriority())
+ String uuid = CDOURIUtil.extractRepositoryUUID(uri);
+ CDOView view = viewSet.resolveView(uuid);
+ if (view != null)
{
- result = viewProvider;
+ return view;
}
}
+ catch (Exception ignore)
+ {
+ // Do nothing
+ }
}
- return result;
+ for (CDOViewProvider viewProvider : getViewProviders(uri))
+ {
+ CDOView view = viewProvider.getView(uri, viewSet);
+ if (view != null)
+ {
+ return view;
+ }
+ }
+
+ return null;
}
+ public CDOViewProvider[] getViewProviders(URI uri)
+ {
+ List<CDOViewProvider> result = new ArrayList<CDOViewProvider>();
+ for (CDOViewProvider viewProvider : viewProviders)
+ {
+ if (viewProvider.matchesRegex(uri))
+ {
+ result.add(viewProvider);
+ }
+ }
+
+ // Sort highest priority first
+ Collections.sort(result, new Comparator<CDOViewProvider>()
+ {
+ public int compare(CDOViewProvider o1, CDOViewProvider o2)
+ {
+ return -new Integer(o1.getPriority()).compareTo(o2.getPriority());
+ }
+ });
+
+ return result.toArray(new CDOViewProvider[result.size()]);
+ }
+
+ // public CDOViewProvider[] getViewProviders(URI uri, CDOViewSet viewSet)
+ // {
+ // List<CDOViewProvider> orderedProviders = new ArrayList<CDOViewProvider>();
+ // for (CDOViewProvider viewProvider : viewProviders)
+ // {
+ // if (viewProvider.matchesRegex(uri))
+ // {
+ // for (int i = orderedProviders.size() - 1; i >= 0; i--)
+ // {
+ // if (viewProvider.getPriority() <= orderedProviders.get(i).getPriority())
+ // {
+ // orderedProviders.add(i + 1, viewProvider);
+ // break;
+ // }
+ // }
+ //
+ // // if not inserted, it has highest priority
+ // if (!orderedProviders.contains(viewProvider))
+ // {
+ // orderedProviders.add(0, viewProvider);
+ // }
+ // }
+ // }
+ //
+ // return orderedProviders.toArray(new CDOViewProvider[orderedProviders.size()]);
+ // }
+
public void addViewProvider(CDOViewProvider viewProvider)
{
boolean added;
@@ -186,10 +258,14 @@ public class CDOViewProviderRegistryImpl extends Container<CDOViewProvider> impl
public CDOView getView(URI uri, CDOViewSet viewSet)
{
+ return getViewProvider().getView(uri, viewSet);
+ }
+
+ private CDOViewProvider getViewProvider()
+ {
try
{
- CDOViewProvider viewProvider = (CDOViewProvider)element.createExecutableExtension("class");
- return viewProvider.getView(uri, viewSet);
+ return (CDOViewProvider)element.createExecutableExtension("class");
}
catch (CoreException ex)
{
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/PluginContainerViewProvider.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/PluginContainerViewProvider.java
new file mode 100644
index 0000000000..19762a77bc
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/PluginContainerViewProvider.java
@@ -0,0 +1,79 @@
+/***************************************************************************
+ * Copyright (c) 2004 - 2008 Eike Stepper, Germany.
+ * 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
+ *
+ * Contributors:
+ * Victor Roldan Betancort - initial API and implementation
+ **************************************************************************/
+package org.eclipse.emf.internal.cdo.util;
+
+import org.eclipse.emf.cdo.CDOSession;
+import org.eclipse.emf.cdo.CDOView;
+import org.eclipse.emf.cdo.CDOViewSet;
+import org.eclipse.emf.cdo.util.CDOURIUtil;
+import org.eclipse.emf.cdo.util.CDOViewProvider;
+import org.eclipse.emf.cdo.util.ManagedContainerViewProvider;
+
+import org.eclipse.emf.internal.cdo.CDOSessionFactory;
+
+import org.eclipse.net4j.util.container.IManagedContainer;
+import org.eclipse.net4j.util.container.IPluginContainer;
+
+import org.eclipse.emf.common.util.URI;
+
+/**
+ * Provides <code>CDOView</code> from <code>CDOSession</code> registered in IPluginContainer
+ *
+ * @author Victor Roldan Betancort
+ */
+public class PluginContainerViewProvider extends ManagedContainerViewProvider implements CDOViewProvider
+{
+ private final static String REGEX = "cdo:.*";
+
+ private final static int PRIORITY = 400;
+
+ public PluginContainerViewProvider()
+ {
+ super(IPluginContainer.INSTANCE, REGEX, PRIORITY);
+ }
+
+ public CDOView getView(URI uri, CDOViewSet viewSet)
+ {
+ IManagedContainer container = getContainer();
+ if (container == null)
+ {
+ return null;
+ }
+
+ String repoUUID = CDOURIUtil.extractRepositoryUUID(uri);
+ for (Object element : container.getElements(CDOSessionFactory.PRODUCT_GROUP, CDOSessionFactory.TYPE))
+ {
+ CDOSession session = (CDOSession)element;
+ String uuid = session.repository().getUUID();
+ if (repoUUID.equals(uuid))
+ {
+ CDOView view = openView(session, uri);
+ if (view != null)
+ {
+ return view;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ protected IManagedContainer getContainer()
+ {
+ return IPluginContainer.INSTANCE;
+ }
+
+ protected CDOView openView(CDOSession session, URI uri)
+ {
+ return session.openTransaction();
+ }
+}

Back to the top