diff options
author | Victor Roldan Betancort | 2008-12-30 19:58:57 +0000 |
---|---|---|
committer | Victor Roldan Betancort | 2008-12-30 19:58:57 +0000 |
commit | e28e0f3492b5a8895bb683d31255b4305ed2ad12 (patch) | |
tree | 766eeb7a09d99434ef24704809fb688b77e0d2ce /plugins | |
parent | f3f2c372b54a1f0c4a2fc723841a3909ac8c3953 (diff) | |
download | cdo-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')
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(); + } +} |