Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2015-05-17 07:08:12 +0000
committerEike Stepper2015-05-17 07:08:12 +0000
commite993693885652bc67ae69ea1a4d9202123172f35 (patch)
treec1e00ff9d72fba78a1f9db9c9d18da55d564992a
parent95d2be88f607c6b94bfaab37e988366e729b25c8 (diff)
downloadcdo-e993693885652bc67ae69ea1a4d9202123172f35.tar.gz
cdo-e993693885652bc67ae69ea1a4d9202123172f35.tar.xz
cdo-e993693885652bc67ae69ea1a4d9202123172f35.zip
[467442] Add Interactive Transaction Conflict Resolution
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=467442
-rw-r--r--plugins/org.eclipse.emf.cdo.explorer.ui/commands.txt76
-rw-r--r--plugins/org.eclipse.emf.cdo.explorer.ui/plugin.xml12
-rw-r--r--plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/bundle/OM.java13
-rw-r--r--plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutEditorOpener.java183
-rw-r--r--plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutEditorOpenerRegistry.java396
-rw-r--r--plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOModelEditorOpener.java134
-rw-r--r--plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/OpenWithActionProvider.java16
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/.project5
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/.settings/org.eclipse.core.resources.prefs3
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/build.properties6
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/plugin.xml16
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/schema/editorOpeners.exsd139
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/bundle/OM.java27
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOEditorOpener.java475
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOHandlingConflictResolver.java7
15 files changed, 818 insertions, 690 deletions
diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/commands.txt b/plugins/org.eclipse.emf.cdo.explorer.ui/commands.txt
deleted file mode 100644
index c8490dace5..0000000000
--- a/plugins/org.eclipse.emf.cdo.explorer.ui/commands.txt
+++ /dev/null
@@ -1,76 +0,0 @@
-CDORepository (connected/disconnected)
---------------------------------------------
- Connect
- ----------------------
- New --> Branch...
- Tag...
- ----------------------
- Show In --> History
- CDO Administration
- ----------------------
- Checkout
- Checkout As...
- ----------------------
- Delete...
- Disconnect
- ----------------------
- Properties...
-
-
-CDOBranch | CDOTag
---------------------------------------------
- New --> Branch...
- Tag...
- ----------------------
- Show In --> History
- ----------------------
- Checkout
- Checkout As...
- ----------------------
- Rename...
- Delete...
- ----------------------
- Properties...
-
-
-CDOCheckout (open/closed)
---------------------------------------------
- Open Checkout
- ----------------------
- New --> [allowed children...]
- ----------------------
- Open
- Open With --> [applicable editors...]
- Show In --> History
- ----------------------
- Compare With --> Each Other
- ...
- Switch To --> New Branch...
- [branch history]
- Other...
- Merge...
- ----------------------
- Delete Checkout...
- Close Checkout
- ----------------------
- Properties...
-
-
-EObject (including CDOResourceNodes)
---------------------------------------------
- New --> [allowed children...]
- ----------------------
- Open
- Open With --> [applicable editors...]
- Show In --> History
- ----------------------
- Compare With --> Each Other
- ...
- Switch To --> New Branch...
- [branch history]
- Other...
- Merge...
- ----------------------
- Delete...
- ----------------------
- Properties...
diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/plugin.xml b/plugins/org.eclipse.emf.cdo.explorer.ui/plugin.xml
index 04ed49ae7a..3b818e6f18 100644
--- a/plugins/org.eclipse.emf.cdo.explorer.ui/plugin.xml
+++ b/plugins/org.eclipse.emf.cdo.explorer.ui/plugin.xml
@@ -751,4 +751,16 @@
</objectContribution>
</extension>
+ <extension
+ point="org.eclipse.emf.cdo.ui.editorOpeners">
+ <editorOpener
+ class="org.eclipse.emf.cdo.explorer.ui.checkouts.CDOModelEditorOpener"
+ icon="icons/cdo_editor.gif"
+ id="org.eclipse.papyrus.cdo.ui.editors.PapyrusCDOEditorOpener"
+ name="CDO Editor"
+ priority="100"
+ regex="cdo\.checkout://.*">
+ </editorOpener>
+ </extension>
+
</plugin>
diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/bundle/OM.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/bundle/OM.java
index 9166c66fd0..7c31debabd 100644
--- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/bundle/OM.java
+++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/bundle/OM.java
@@ -11,7 +11,6 @@
*/
package org.eclipse.emf.cdo.explorer.ui.bundle;
-import org.eclipse.emf.cdo.explorer.ui.checkouts.CDOCheckoutEditorOpenerRegistry;
import org.eclipse.emf.cdo.ui.OverlayImage;
import org.eclipse.net4j.util.om.OMBundle;
@@ -88,17 +87,5 @@ public abstract class OM
super(BUNDLE);
INSTANCE = this;
}
-
- @Override
- protected void doStart() throws Exception
- {
- CDOCheckoutEditorOpenerRegistry.INSTANCE.activate();
- }
-
- @Override
- protected void doStop() throws Exception
- {
- CDOCheckoutEditorOpenerRegistry.INSTANCE.deactivate();
- }
}
}
diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutEditorOpener.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutEditorOpener.java
index ef1af4ece2..ce302b4a8b 100644
--- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutEditorOpener.java
+++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutEditorOpener.java
@@ -10,189 +10,12 @@
*/
package org.eclipse.emf.cdo.explorer.ui.checkouts;
-import org.eclipse.emf.cdo.explorer.ui.bundle.OM;
-
-import org.eclipse.net4j.util.ReflectUtil.ExcludeFromDump;
-
-import org.eclipse.emf.common.util.URI;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-
-import java.util.HashSet;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import org.eclipse.emf.cdo.ui.CDOEditorOpener;
/**
* @author Eike Stepper
*/
-public interface CDOCheckoutEditorOpener
+@Deprecated
+public interface CDOCheckoutEditorOpener extends CDOEditorOpener
{
- public static final int DEFAULT_PRIORITY = 500;
-
- public String getID();
-
- public String getName();
-
- public ImageDescriptor getIcon();
-
- /**
- * Returns the priority of this editor opener. Usually used to choose between several editor openers that
- * match the same repository URI.
- */
- public int getPriority();
-
- /**
- * Returns the regular expression that determines if the editor opener can open a certain URI.
- */
- public String getRegex();
-
- /**
- * Checks if the URI matches the regular expression of this editor opener.
- */
- public boolean matchesRegex(URI uri);
-
- public IEditorPart openEditor(IWorkbenchPage page, URI uri);
-
- /**
- * @author Eike Stepper
- */
- public static abstract class Default implements CDOCheckoutEditorOpener
- {
- private String id;
-
- private String name;
-
- private ImageDescriptor icon;
-
- private String regex;
-
- private int priority = DEFAULT_PRIORITY;
-
- @ExcludeFromDump
- private transient Pattern pattern;
-
- public Default()
- {
- }
-
- public Default(String id, String name, ImageDescriptor icon, String regex, int priority)
- {
- this.id = id;
- this.name = name;
- this.icon = icon;
- this.regex = regex;
- this.priority = priority;
- }
-
- public String getID()
- {
- return id;
- }
-
- public String getName()
- {
- return name;
- }
-
- public ImageDescriptor getIcon()
- {
- return icon;
- }
-
- public final int getPriority()
- {
- return priority;
- }
-
- public final String getRegex()
- {
- return regex;
- }
-
- public final boolean matchesRegex(URI uri)
- {
- synchronized (regex)
- {
- if (pattern == null)
- {
- pattern = Pattern.compile(regex);
- }
- }
-
- Matcher matcher = pattern.matcher(uri.toString());
- return matcher.matches();
- }
-
- public IEditorPart openEditor(final IWorkbenchPage page, URI uri)
- {
- final Set<IEditorPart> editors = new HashSet<IEditorPart>();
- final IEditorPart[] editor = { null };
-
- IPartListener partListener = new IPartListener()
- {
- public void partClosed(IWorkbenchPart part)
- {
- if (part == editor[0])
- {
- try
- {
- // view.close();
- }
- catch (Exception ex)
- {
- OM.LOG.error(ex);
- }
- finally
- {
- page.removePartListener(this);
- }
- }
- }
-
- public void partOpened(IWorkbenchPart part)
- {
- // Do nothing.
- }
-
- public void partDeactivated(IWorkbenchPart part)
- {
- // Do nothing.
- }
-
- public void partBroughtToTop(IWorkbenchPart part)
- {
- // Do nothing.
- }
-
- public void partActivated(IWorkbenchPart part)
- {
- // Do nothing.
- }
- };
-
- page.addPartListener(partListener);
- editor[0] = doOpenEditor(page, uri);
-
- if (!editors.contains(editor))
- {
- // The editor must have been open already and someone else will handle close.
- page.removePartListener(partListener);
- }
-
- return editor[0];
- }
-
- protected abstract IEditorPart doOpenEditor(IWorkbenchPage page, URI uri);
-
- @Override
- public String toString()
- {
- return id + "[" + regex + "]";
- }
- }
}
diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutEditorOpenerRegistry.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutEditorOpenerRegistry.java
index 1ba75653d7..b406e01253 100644
--- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutEditorOpenerRegistry.java
+++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutEditorOpenerRegistry.java
@@ -10,402 +10,12 @@
*/
package org.eclipse.emf.cdo.explorer.ui.checkouts;
-import org.eclipse.emf.cdo.explorer.CDOExplorerUtil;
-import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout;
-import org.eclipse.emf.cdo.explorer.ui.bundle.OM;
-import org.eclipse.emf.cdo.internal.ui.InteractiveConflictHandlerSelector;
-import org.eclipse.emf.cdo.transaction.CDOTransaction;
-import org.eclipse.emf.cdo.ui.CDOEditorUtil;
-import org.eclipse.emf.cdo.util.CDOURIUtil;
-import org.eclipse.emf.cdo.view.CDOView;
-
-import org.eclipse.emf.internal.cdo.transaction.CDOHandlingConflictResolver;
-
-import org.eclipse.net4j.util.StringUtil;
-import org.eclipse.net4j.util.WrappedException;
-import org.eclipse.net4j.util.container.Container;
-import org.eclipse.net4j.util.om.OMPlatform;
-
-import org.eclipse.emf.common.util.URI;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import org.eclipse.emf.cdo.ui.CDOEditorOpener;
/**
* @author Eike Stepper
*/
-@SuppressWarnings("restriction")
-public class CDOCheckoutEditorOpenerRegistry extends Container<CDOCheckoutEditorOpener>
+@Deprecated
+public class CDOCheckoutEditorOpenerRegistry extends CDOEditorOpener.Registry
{
- public static final CDOCheckoutEditorOpenerRegistry INSTANCE = new CDOCheckoutEditorOpenerRegistry();
-
- private static final String EXT_POINT = "editorOpeners"; //$NON-NLS-1$
-
- private final Map<String, CDOCheckoutEditorOpener> editorOpeners = new HashMap<String, CDOCheckoutEditorOpener>();
-
- public CDOCheckoutEditorOpenerRegistry()
- {
- addEditorOpener(new CDOModelEditorOpener());
- }
-
- public IEditorPart openEditor(IWorkbenchPage page, URI uri)
- {
- if (uri == null)
- {
- return null;
- }
-
- for (CDOCheckoutEditorOpener editorOpener : getEditorOpeners(uri))
- {
- IEditorPart editor = editorOpener.openEditor(page, uri);
- if (editor != null)
- {
- return editor;
- }
- }
-
- return null;
- }
-
- public CDOCheckoutEditorOpener getEditorOpener(String id)
- {
- synchronized (editorOpeners)
- {
- return editorOpeners.get(id);
- }
- }
-
- public CDOCheckoutEditorOpener[] getEditorOpeners(URI uri)
- {
- List<CDOCheckoutEditorOpener> result = new ArrayList<CDOCheckoutEditorOpener>();
-
- synchronized (editorOpeners)
- {
- for (CDOCheckoutEditorOpener editorOpener : editorOpeners.values())
- {
- if (editorOpener.matchesRegex(uri))
- {
- result.add(editorOpener);
- }
- }
- }
-
- // Sort highest priority first
- Collections.sort(result, new Comparator<CDOCheckoutEditorOpener>()
- {
- public int compare(CDOCheckoutEditorOpener o1, CDOCheckoutEditorOpener o2)
- {
- return -Integer.valueOf(o1.getPriority()).compareTo(o2.getPriority());
- }
- });
-
- return result.toArray(new CDOCheckoutEditorOpener[result.size()]);
- }
-
- public void addEditorOpener(CDOCheckoutEditorOpener editorOpener)
- {
- boolean added;
- synchronized (editorOpeners)
- {
- String id = editorOpener.getID();
- added = !editorOpeners.containsKey(id);
- if (added)
- {
- editorOpeners.put(id, editorOpener);
- }
- }
-
- if (added)
- {
- fireElementAddedEvent(editorOpener);
- }
- }
-
- public void removeEditorOpener(CDOCheckoutEditorOpener editorOpener)
- {
- boolean removed;
- synchronized (editorOpeners)
- {
- String id = editorOpener.getID();
- removed = editorOpeners.remove(id) != null;
- }
-
- if (removed)
- {
- fireElementRemovedEvent(editorOpener);
- }
- }
-
- public CDOCheckoutEditorOpener[] getElements()
- {
- synchronized (editorOpeners)
- {
- return editorOpeners.values().toArray(new CDOCheckoutEditorOpener[editorOpeners.size()]);
- }
- }
-
- @Override
- public boolean isEmpty()
- {
- synchronized (editorOpeners)
- {
- return editorOpeners.isEmpty();
- }
- }
-
- @Override
- protected void doActivate() throws Exception
- {
- super.doActivate();
- if (OMPlatform.INSTANCE.isOSGiRunning())
- {
- try
- {
- readExtensions();
- }
- catch (Throwable t)
- {
- OM.LOG.error(t);
- }
- }
- }
-
- public void readExtensions()
- {
- IExtensionRegistry registry = Platform.getExtensionRegistry();
- IConfigurationElement[] configurationElements = registry.getConfigurationElementsFor(OM.BUNDLE_ID, EXT_POINT);
- for (IConfigurationElement element : configurationElements)
- {
- try
- {
- EditorOpenerDescriptor descriptor = new EditorOpenerDescriptor(element);
- addEditorOpener(descriptor);
- }
- catch (Exception ex)
- {
- OM.LOG.error(ex);
- }
- }
- }
-
- /**
- * @author Eike Stepper
- */
- private static final class CDOModelEditorOpener extends CDOCheckoutEditorOpener.Default
- {
- private static final String REGEX = "cdo\\.checkout://.*";
-
- public CDOModelEditorOpener()
- {
- super(CDOEditorUtil.EDITOR_ID, "CDO Editor", OM.getImageDescriptor("icons/cdo_editor.gif"), REGEX, 100);
- }
-
- @Override
- protected IEditorPart doOpenEditor(final IWorkbenchPage page, URI uri)
- {
- CDOCheckout checkout = CDOExplorerUtil.getCheckout(uri);
- final CDOView view = checkout.openView();
-
- if (view instanceof CDOTransaction)
- {
- CDOHandlingConflictResolver conflictResolver = new CDOHandlingConflictResolver();
- conflictResolver.setConflictHandlerSelector(new InteractiveConflictHandlerSelector());
-
- CDOTransaction transaction = (CDOTransaction)view;
- transaction.options().addConflictResolver(conflictResolver);
- }
-
- final IEditorPart editor = openEditor(page, view, CDOURIUtil.extractResourcePath(uri));
- page.addPartListener(new IPartListener()
- {
- public void partClosed(IWorkbenchPart part)
- {
- if (part == editor)
- {
- try
- {
- view.close();
- }
- catch (Exception ex)
- {
- OM.LOG.error(ex);
- }
- finally
- {
- page.removePartListener(this);
- }
- }
- }
-
- public void partOpened(IWorkbenchPart part)
- {
- // Do nothing.
- }
-
- public void partDeactivated(IWorkbenchPart part)
- {
- // Do nothing.
- }
-
- public void partBroughtToTop(IWorkbenchPart part)
- {
- // Do nothing.
- }
-
- public void partActivated(IWorkbenchPart part)
- {
- // Do nothing.
- }
- });
-
- return editor;
- }
-
- private IEditorPart openEditor(IWorkbenchPage page, CDOView view, String resourcePath)
- {
- try
- {
- String editorID = CDOEditorUtil.getEditorID();
-
- IEditorReference[] references = CDOEditorUtil.findEditor(page, view, resourcePath);
- for (IEditorReference reference : references)
- {
- if (editorID.equals(reference.getId()))
- {
- IEditorPart editor = references[0].getEditor(true);
- page.activate(editor);
- return editor;
- }
- }
-
- IEditorInput input = CDOEditorUtil.createCDOEditorInput(view, resourcePath, false);
- return page.openEditor(input, editorID);
- }
- catch (Exception ex)
- {
- OM.LOG.error(ex);
- }
-
- return null;
- }
- }
-
- /**
- * @author Eike Stepper
- */
- public static final class EditorOpenerDescriptor extends CDOCheckoutEditorOpener.Default
- {
- private IConfigurationElement element;
-
- public EditorOpenerDescriptor(IConfigurationElement element)
- {
- super(getID(element), getName(element), getIcon(element), getRegex(element), getPriority(element));
- this.element = element;
-
- if (StringUtil.isEmpty(element.getAttribute("class"))) //$NON-NLS-1$
- {
- throw new IllegalArgumentException(MessageFormat.format("Class not defined for extension {0}", element)); //$NON-NLS-1$
- }
- }
-
- @Override
- protected IEditorPart doOpenEditor(IWorkbenchPage page, URI uri)
- {
- return getEditorOpener().openEditor(page, uri);
- }
-
- private CDOCheckoutEditorOpener getEditorOpener()
- {
- try
- {
- return (CDOCheckoutEditorOpener)element.createExecutableExtension("class"); //$NON-NLS-1$
- }
- catch (CoreException ex)
- {
- throw WrappedException.wrap(ex);
- }
- }
-
- private static String getID(IConfigurationElement element)
- {
- String value = element.getAttribute("id"); //$NON-NLS-1$
- if (StringUtil.isEmpty(value))
- {
- throw new IllegalArgumentException(MessageFormat.format("ID not defined for extension {0}", element)); //$NON-NLS-1$
- }
-
- return value;
- }
-
- private static String getName(IConfigurationElement element)
- {
- String value = element.getAttribute("name"); //$NON-NLS-1$
- if (StringUtil.isEmpty(value))
- {
- throw new IllegalArgumentException(MessageFormat.format("Name not defined for extension {0}", element)); //$NON-NLS-1$
- }
-
- return value;
- }
-
- private static ImageDescriptor getIcon(IConfigurationElement element)
- {
- String icon = element.getAttribute("icon"); //$NON-NLS-1$
- if (icon != null)
- {
- try
- {
- return AbstractUIPlugin.imageDescriptorFromPlugin(element.getNamespaceIdentifier(), icon);
- }
- catch (Exception ex)
- {
- //$FALL-THROUGH$
- }
- }
-
- return null;
- }
-
- private static String getRegex(IConfigurationElement element)
- {
- String value = element.getAttribute("regex"); //$NON-NLS-1$
- if (StringUtil.isEmpty(value))
- {
- throw new IllegalArgumentException(MessageFormat.format("Regex not defined for extension {0}", element)); //$NON-NLS-1$
- }
-
- return value;
- }
-
- private static int getPriority(IConfigurationElement element)
- {
- try
- {
- String value = element.getAttribute("priority"); //$NON-NLS-1$
- return Integer.parseInt(value);
- }
- catch (Exception ex)
- {
- return DEFAULT_PRIORITY;
- }
- }
- }
}
diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOModelEditorOpener.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOModelEditorOpener.java
new file mode 100644
index 0000000000..8301ff4105
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOModelEditorOpener.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2009-2013 Eike Stepper (Berlin, Germany) 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:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.explorer.ui.checkouts;
+
+import org.eclipse.emf.cdo.explorer.CDOExplorerUtil;
+import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout;
+import org.eclipse.emf.cdo.explorer.ui.bundle.OM;
+import org.eclipse.emf.cdo.internal.ui.InteractiveConflictHandlerSelector;
+import org.eclipse.emf.cdo.transaction.CDOTransaction;
+import org.eclipse.emf.cdo.ui.CDOEditorOpener;
+import org.eclipse.emf.cdo.ui.CDOEditorUtil;
+import org.eclipse.emf.cdo.util.CDOURIUtil;
+import org.eclipse.emf.cdo.view.CDOView;
+
+import org.eclipse.emf.common.util.URI;
+
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * @author Eike Stepper
+ */
+public class CDOModelEditorOpener extends CDOEditorOpener.Default
+{
+ public CDOModelEditorOpener()
+ {
+ }
+
+ @Override
+ protected IEditorPart doOpenEditor(final IWorkbenchPage page, URI uri)
+ {
+ CDOCheckout checkout = CDOExplorerUtil.getCheckout(uri);
+ final CDOView view = checkout.openView();
+
+ if (view instanceof CDOTransaction)
+ {
+ configureTransaction((CDOTransaction)view);
+ }
+
+ final IEditorPart editor = openEditor(page, view, CDOURIUtil.extractResourcePath(uri));
+ page.addPartListener(new IPartListener()
+ {
+ public void partClosed(IWorkbenchPart part)
+ {
+ if (part == editor)
+ {
+ try
+ {
+ view.close();
+ }
+ catch (Exception ex)
+ {
+ OM.LOG.error(ex);
+ }
+ finally
+ {
+ page.removePartListener(this);
+ }
+ }
+ }
+
+ public void partOpened(IWorkbenchPart part)
+ {
+ // Do nothing.
+ }
+
+ public void partDeactivated(IWorkbenchPart part)
+ {
+ // Do nothing.
+ }
+
+ public void partBroughtToTop(IWorkbenchPart part)
+ {
+ // Do nothing.
+ }
+
+ public void partActivated(IWorkbenchPart part)
+ {
+ // Do nothing.
+ }
+ });
+
+ return editor;
+ }
+
+ @SuppressWarnings("restriction")
+ protected void configureTransaction(CDOTransaction transaction)
+ {
+ org.eclipse.emf.internal.cdo.transaction.CDOHandlingConflictResolver conflictResolver = new org.eclipse.emf.internal.cdo.transaction.CDOHandlingConflictResolver();
+ conflictResolver.setConflictHandlerSelector(new InteractiveConflictHandlerSelector());
+
+ transaction.options().addConflictResolver(conflictResolver);
+ }
+
+ private IEditorPart openEditor(IWorkbenchPage page, CDOView view, String resourcePath)
+ {
+ try
+ {
+ String editorID = CDOEditorUtil.getEditorID();
+
+ IEditorReference[] references = CDOEditorUtil.findEditor(page, view, resourcePath);
+ for (IEditorReference reference : references)
+ {
+ if (editorID.equals(reference.getId()))
+ {
+ IEditorPart editor = references[0].getEditor(true);
+ page.activate(editor);
+ return editor;
+ }
+ }
+
+ IEditorInput input = CDOEditorUtil.createCDOEditorInput(view, resourcePath, false);
+ return page.openEditor(input, editorID);
+ }
+ catch (Exception ex)
+ {
+ OM.LOG.error(ex);
+ }
+
+ return null;
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/OpenWithActionProvider.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/OpenWithActionProvider.java
index 61d1a7d96a..e1f334e6cd 100644
--- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/OpenWithActionProvider.java
+++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/OpenWithActionProvider.java
@@ -19,10 +19,9 @@ import org.eclipse.emf.cdo.eresource.CDOResourceNode;
import org.eclipse.emf.cdo.explorer.CDOExplorerUtil;
import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout;
import org.eclipse.emf.cdo.explorer.ui.bundle.OM;
-import org.eclipse.emf.cdo.explorer.ui.checkouts.CDOCheckoutEditorOpener;
-import org.eclipse.emf.cdo.explorer.ui.checkouts.CDOCheckoutEditorOpenerRegistry;
import org.eclipse.emf.cdo.internal.ui.dialogs.EditObjectDialog;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
+import org.eclipse.emf.cdo.ui.CDOEditorOpener;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.net4j.util.ObjectUtil;
@@ -155,13 +154,13 @@ public class OpenWithActionProvider extends CommonActionProvider
CDOCheckout checkout = CDOExplorerUtil.getCheckout(cdoObject);
if (checkout != null)
{
- CDOCheckoutEditorOpener[] editorOpeners = CDOCheckoutEditorOpenerRegistry.INSTANCE.getEditorOpeners(uri);
+ CDOEditorOpener[] editorOpeners = CDOEditorOpener.Registry.INSTANCE.getEditorOpeners(uri);
if (editorOpeners.length != 0)
{
IMenuManager submenu = new MenuManager("Open With", ICommonMenuConstants.GROUP_OPEN_WITH);
submenu.add(new GroupMarker(ICommonMenuConstants.GROUP_TOP));
- for (CDOCheckoutEditorOpener editorOpener : editorOpeners)
+ for (CDOEditorOpener editorOpener : editorOpeners)
{
OpenWithAction action = new OpenWithAction(viewSite.getPage(), cdoObject, editorOpener);
submenu.add(action);
@@ -309,7 +308,7 @@ public class OpenWithActionProvider extends CommonActionProvider
CDOCheckout checkout = CDOExplorerUtil.getCheckout(cdoObject);
if (checkout != null)
{
- CDOCheckoutEditorOpener[] editorOpeners = CDOCheckoutEditorOpenerRegistry.INSTANCE.getEditorOpeners(uri);
+ CDOEditorOpener[] editorOpeners = CDOEditorOpener.Registry.INSTANCE.getEditorOpeners(uri);
String defaultEditorOpenerID = editorOpeners.length != 0 ? editorOpeners[0].getID() : null;
CDOID objectID = cdoObject.cdoID();
@@ -327,8 +326,7 @@ public class OpenWithActionProvider extends CommonActionProvider
if (editorOpenerID != null)
{
- CDOCheckoutEditorOpener editorOpener = CDOCheckoutEditorOpenerRegistry.INSTANCE
- .getEditorOpener(editorOpenerID);
+ CDOEditorOpener editorOpener = CDOEditorOpener.Registry.INSTANCE.getEditorOpener(editorOpenerID);
if (editorOpener != null)
{
if (!ObjectUtil.equals(editorOpenerID, lastEditorOpenerID))
@@ -574,9 +572,9 @@ public class OpenWithActionProvider extends CommonActionProvider
private EObject openableElement;
- private CDOCheckoutEditorOpener editorOpener;
+ private CDOEditorOpener editorOpener;
- public OpenWithAction(IWorkbenchPage page, EObject openableElement, CDOCheckoutEditorOpener editorOpener)
+ public OpenWithAction(IWorkbenchPage page, EObject openableElement, CDOEditorOpener editorOpener)
{
setId(ID);
setText(editorOpener.getName());
diff --git a/plugins/org.eclipse.emf.cdo.ui/.project b/plugins/org.eclipse.emf.cdo.ui/.project
index f02e9d860a..662261f2be 100644
--- a/plugins/org.eclipse.emf.cdo.ui/.project
+++ b/plugins/org.eclipse.emf.cdo.ui/.project
@@ -15,6 +15,11 @@
<arguments>
</arguments>
</buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
<buildCommand>
<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
<arguments>
diff --git a/plugins/org.eclipse.emf.cdo.ui/.settings/org.eclipse.core.resources.prefs b/plugins/org.eclipse.emf.cdo.ui/.settings/org.eclipse.core.resources.prefs
index 4f61cd36ae..b19315ec0a 100644
--- a/plugins/org.eclipse.emf.cdo.ui/.settings/org.eclipse.core.resources.prefs
+++ b/plugins/org.eclipse.emf.cdo.ui/.settings/org.eclipse.core.resources.prefs
@@ -1,3 +1,2 @@
-#Mon Jul 04 13:02:52 CEST 2011
eclipse.preferences.version=1
-
+encoding//schema/editorOpeners.exsd=UTF-8
diff --git a/plugins/org.eclipse.emf.cdo.ui/build.properties b/plugins/org.eclipse.emf.cdo.ui/build.properties
index 4feac8c666..ba0d650b0c 100644
--- a/plugins/org.eclipse.emf.cdo.ui/build.properties
+++ b/plugins/org.eclipse.emf.cdo.ui/build.properties
@@ -18,10 +18,12 @@ bin.includes = META-INF/,\
model/,\
.options,\
about.html,\
- icons/
+ icons/,\
+ schema/
src.includes = about.html,\
CDOClient1.launch,\
- CDOClient2.launch
+ CDOClient2.launch,\
+ component.ext
doc.project = org.eclipse.emf.cdo.doc
diff --git a/plugins/org.eclipse.emf.cdo.ui/plugin.xml b/plugins/org.eclipse.emf.cdo.ui/plugin.xml
index 3fe932e05c..935e547609 100644
--- a/plugins/org.eclipse.emf.cdo.ui/plugin.xml
+++ b/plugins/org.eclipse.emf.cdo.ui/plugin.xml
@@ -14,10 +14,12 @@
<plugin>
- <extension
+ <extension-point id="editorOpeners" name="Editor Openers" schema="schema/editorOpeners.exsd"/>
+
+ <extension
point="org.eclipse.net4j.util.elementProcessors">
<elementProcessor class="org.eclipse.emf.cdo.ui.CDOInteractiveExceptionHandler"/>
- </extension>
+ </extension>
<extension
point="org.eclipse.net4j.util.factories">
@@ -95,14 +97,14 @@
</editor>
</extension>
- <extension
+ <extension
point="org.eclipse.ui.importWizards">
<category
id="org.eclipse.emf.cdo.category"
name="CDO">
</category>
</extension>
-
+
<extension
point="org.eclipse.ui.newWizards">
<category
@@ -215,7 +217,7 @@
</filesystem>
</extension>
-->
-
+
<extension
point="org.eclipse.ui.editors.documentProviders">
<provider
@@ -317,7 +319,7 @@
</enablement>
</objectContribution>
</extension-->
-
+
<extension point="org.eclipse.ui.popupMenus">
<objectContribution
adaptable="true"
@@ -334,7 +336,7 @@
</action>
</objectContribution>
</extension>
-
+
<extension point="org.eclipse.ui.commands">
<command
id="org.eclipse.emf.cdo.ui.CreateBranch"
diff --git a/plugins/org.eclipse.emf.cdo.ui/schema/editorOpeners.exsd b/plugins/org.eclipse.emf.cdo.ui/schema/editorOpeners.exsd
new file mode 100644
index 0000000000..0257f98f5a
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.ui/schema/editorOpeners.exsd
@@ -0,0 +1,139 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.emf.cdo.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.emf.cdo.ui" id="editorOpeners" name="Editor Openers"/>
+ </appinfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="editorOpener"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="editorOpener">
+ <complexType>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="icon" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="resource"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="regex" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="priority" type="string" use="default" value="500">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.emf.cdo.ui.CDOEditorOpener"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="since"/>
+ </appinfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="examples"/>
+ </appinfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="apiinfo"/>
+ </appinfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="implementation"/>
+ </appinfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/bundle/OM.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/bundle/OM.java
index 4c8e745c1d..bdbf740b46 100644
--- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/bundle/OM.java
+++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/bundle/OM.java
@@ -11,6 +11,7 @@
*/
package org.eclipse.emf.cdo.internal.ui.bundle;
+import org.eclipse.emf.cdo.ui.CDOEditorOpener;
import org.eclipse.emf.cdo.ui.CDOLabelDecorator;
import org.eclipse.emf.cdo.ui.OverlayImage;
@@ -49,25 +50,25 @@ public abstract class OM
public static final OMPreferences PREFS = BUNDLE.preferences();
public static final OMPreference<String> PREF_LABEL_DECORATION = //
- PREFS.init("PREF_LABEL_DECORATION", CDOLabelDecorator.DEFAULT_DECORATION); //$NON-NLS-1$
+ PREFS.init("PREF_LABEL_DECORATION", CDOLabelDecorator.DEFAULT_DECORATION); //$NON-NLS-1$
public static final OMPreference<String[]> PREF_HISTORY_SELECT_PACKAGES = //
- PREFS.initArray("PREF_HISTORY_SELECT_PACKAGES"); //$NON-NLS-1$
+ PREFS.initArray("PREF_HISTORY_SELECT_PACKAGES"); //$NON-NLS-1$
public static final OMPreference<String[]> PREF_HISTORY_CONNECTORS = //
- PREFS.init("PREF_HISTORY_CONNECTORS", new String[] { "tcp://localhost" }); //$NON-NLS-1$
+ PREFS.init("PREF_HISTORY_CONNECTORS", new String[] { "tcp://localhost" }); //$NON-NLS-1$
public static final OMPreference<String[]> PREF_HISTORY_REPOSITORIES = //
- PREFS.init("PREF_HISTORY_REPOSITORIES", new String[] { "repo1" }); //$NON-NLS-1$
+ PREFS.init("PREF_HISTORY_REPOSITORIES", new String[] { "repo1" }); //$NON-NLS-1$
public static final OMPreference<Boolean> PREF_AUTOMATIC_PACKAGE_REGISTRY = //
- PREFS.init("PREF_AUTOMATIC_PACKAGE_REGISTRY", true); //$NON-NLS-1$
+ PREFS.init("PREF_AUTOMATIC_PACKAGE_REGISTRY", true); //$NON-NLS-1$
public static final OMPreference<Boolean> PREF_LEGACY_MODE_DEFAULT = //
- PREFS.init("PREF_LEGACY_MODE_DEFAULT", true); //$NON-NLS-1$
+ PREFS.init("PREF_LEGACY_MODE_DEFAULT", true); //$NON-NLS-1$
public static final OMPreference<Boolean> PREF_EDITOR_AUTO_RELOAD = //
- PREFS.init("PREF_EDITOR_AUTO_RELOAD", true); //$NON-NLS-1$
+ PREFS.init("PREF_EDITOR_AUTO_RELOAD", true); //$NON-NLS-1$
public static Image getOverlayImage(Object image, Object overlayImage, int x, int y)
{
@@ -102,5 +103,17 @@ public abstract class OM
super(BUNDLE);
INSTANCE = this;
}
+
+ @Override
+ protected void doStart() throws Exception
+ {
+ CDOEditorOpener.Registry.INSTANCE.activate();
+ }
+
+ @Override
+ protected void doStop() throws Exception
+ {
+ CDOEditorOpener.Registry.INSTANCE.deactivate();
+ }
}
}
diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOEditorOpener.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOEditorOpener.java
new file mode 100644
index 0000000000..f0ac5cfad3
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOEditorOpener.java
@@ -0,0 +1,475 @@
+/*
+ * Copyright (c) 2009, 2011, 2012 Eike Stepper (Berlin, Germany) 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:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.ui;
+
+import org.eclipse.emf.cdo.internal.ui.bundle.OM;
+
+import org.eclipse.net4j.util.ReflectUtil.ExcludeFromDump;
+import org.eclipse.net4j.util.StringUtil;
+import org.eclipse.net4j.util.WrappedException;
+import org.eclipse.net4j.util.container.Container;
+import org.eclipse.net4j.util.om.OMPlatform;
+
+import org.eclipse.emf.common.util.URI;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Eike Stepper
+ * @since 4.4
+ */
+public interface CDOEditorOpener
+{
+ public static final int DEFAULT_PRIORITY = 500;
+
+ public String getID();
+
+ public String getName();
+
+ public ImageDescriptor getIcon();
+
+ /**
+ * Returns the priority of this editor opener. Usually used to choose between several editor openers that
+ * match the same repository URI.
+ */
+ public int getPriority();
+
+ /**
+ * Returns the regular expression that determines if the editor opener can open a certain URI.
+ */
+ public String getRegex();
+
+ /**
+ * Checks if the URI matches the regular expression of this editor opener.
+ */
+ public boolean matchesRegex(URI uri);
+
+ public IEditorPart openEditor(IWorkbenchPage page, URI uri);
+
+ /**
+ * @author Eike Stepper
+ */
+ public static abstract class Default implements CDOEditorOpener
+ {
+ private String id;
+
+ private String name;
+
+ private ImageDescriptor icon;
+
+ private String regex;
+
+ private int priority = DEFAULT_PRIORITY;
+
+ @ExcludeFromDump
+ private transient Pattern pattern;
+
+ public Default()
+ {
+ }
+
+ public Default(String id, String name, ImageDescriptor icon, String regex, int priority)
+ {
+ this.id = id;
+ this.name = name;
+ this.icon = icon;
+ this.regex = regex;
+ this.priority = priority;
+ }
+
+ public String getID()
+ {
+ return id;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public ImageDescriptor getIcon()
+ {
+ return icon;
+ }
+
+ public final int getPriority()
+ {
+ return priority;
+ }
+
+ public final String getRegex()
+ {
+ return regex;
+ }
+
+ public final boolean matchesRegex(URI uri)
+ {
+ synchronized (regex)
+ {
+ if (pattern == null)
+ {
+ pattern = Pattern.compile(regex);
+ }
+ }
+
+ Matcher matcher = pattern.matcher(uri.toString());
+ return matcher.matches();
+ }
+
+ public IEditorPart openEditor(final IWorkbenchPage page, URI uri)
+ {
+ final Set<IEditorPart> editors = new HashSet<IEditorPart>();
+ final IEditorPart[] editor = { null };
+
+ IPartListener partListener = new IPartListener()
+ {
+ public void partClosed(IWorkbenchPart part)
+ {
+ if (part == editor[0])
+ {
+ try
+ {
+ // view.close();
+ }
+ catch (Exception ex)
+ {
+ OM.LOG.error(ex);
+ }
+ finally
+ {
+ page.removePartListener(this);
+ }
+ }
+ }
+
+ public void partOpened(IWorkbenchPart part)
+ {
+ // Do nothing.
+ }
+
+ public void partDeactivated(IWorkbenchPart part)
+ {
+ // Do nothing.
+ }
+
+ public void partBroughtToTop(IWorkbenchPart part)
+ {
+ // Do nothing.
+ }
+
+ public void partActivated(IWorkbenchPart part)
+ {
+ // Do nothing.
+ }
+ };
+
+ page.addPartListener(partListener);
+ editor[0] = doOpenEditor(page, uri);
+
+ if (!editors.contains(editor))
+ {
+ // The editor must have been open already and someone else will handle close.
+ page.removePartListener(partListener);
+ }
+
+ return editor[0];
+ }
+
+ protected abstract IEditorPart doOpenEditor(IWorkbenchPage page, URI uri);
+
+ @Override
+ public String toString()
+ {
+ return id + "[" + regex + "]";
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ * @since 4.4
+ * @noextend This class is not intended to be subclassed by clients.
+ * @noinstantiate This class is not intended to be instantiated by clients.
+ */
+ public static class Registry extends Container<CDOEditorOpener>
+ {
+ public static final Registry INSTANCE = new Registry();
+
+ private static final String EXT_POINT = "editorOpeners"; //$NON-NLS-1$
+
+ private final Map<String, CDOEditorOpener> editorOpeners = new HashMap<String, CDOEditorOpener>();
+
+ public Registry()
+ {
+ }
+
+ public IEditorPart openEditor(IWorkbenchPage page, URI uri)
+ {
+ if (uri == null)
+ {
+ return null;
+ }
+
+ for (CDOEditorOpener editorOpener : getEditorOpeners(uri))
+ {
+ IEditorPart editor = editorOpener.openEditor(page, uri);
+ if (editor != null)
+ {
+ return editor;
+ }
+ }
+
+ return null;
+ }
+
+ public CDOEditorOpener getEditorOpener(String id)
+ {
+ synchronized (editorOpeners)
+ {
+ return editorOpeners.get(id);
+ }
+ }
+
+ public CDOEditorOpener[] getEditorOpeners(URI uri)
+ {
+ List<CDOEditorOpener> result = new ArrayList<CDOEditorOpener>();
+
+ synchronized (editorOpeners)
+ {
+ for (CDOEditorOpener editorOpener : editorOpeners.values())
+ {
+ if (editorOpener.matchesRegex(uri))
+ {
+ result.add(editorOpener);
+ }
+ }
+ }
+
+ // Sort highest priority first
+ Collections.sort(result, new Comparator<CDOEditorOpener>()
+ {
+ public int compare(CDOEditorOpener o1, CDOEditorOpener o2)
+ {
+ return -Integer.valueOf(o1.getPriority()).compareTo(o2.getPriority());
+ }
+ });
+
+ return result.toArray(new CDOEditorOpener[result.size()]);
+ }
+
+ public void addEditorOpener(CDOEditorOpener editorOpener)
+ {
+ boolean added;
+ synchronized (editorOpeners)
+ {
+ String id = editorOpener.getID();
+ added = !editorOpeners.containsKey(id);
+ if (added)
+ {
+ editorOpeners.put(id, editorOpener);
+ }
+ }
+
+ if (added)
+ {
+ fireElementAddedEvent(editorOpener);
+ }
+ }
+
+ public void removeEditorOpener(CDOEditorOpener editorOpener)
+ {
+ boolean removed;
+ synchronized (editorOpeners)
+ {
+ String id = editorOpener.getID();
+ removed = editorOpeners.remove(id) != null;
+ }
+
+ if (removed)
+ {
+ fireElementRemovedEvent(editorOpener);
+ }
+ }
+
+ public CDOEditorOpener[] getElements()
+ {
+ synchronized (editorOpeners)
+ {
+ return editorOpeners.values().toArray(new CDOEditorOpener[editorOpeners.size()]);
+ }
+ }
+
+ @Override
+ public boolean isEmpty()
+ {
+ synchronized (editorOpeners)
+ {
+ return editorOpeners.isEmpty();
+ }
+ }
+
+ @Override
+ protected void doActivate() throws Exception
+ {
+ super.doActivate();
+ if (OMPlatform.INSTANCE.isOSGiRunning())
+ {
+ try
+ {
+ readExtensions();
+ }
+ catch (Throwable t)
+ {
+ OM.LOG.error(t);
+ }
+ }
+ }
+
+ public void readExtensions()
+ {
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ IConfigurationElement[] configurationElements = registry.getConfigurationElementsFor(OM.BUNDLE_ID, EXT_POINT);
+ for (IConfigurationElement element : configurationElements)
+ {
+ try
+ {
+ EditorOpenerDescriptor descriptor = new EditorOpenerDescriptor(element);
+ addEditorOpener(descriptor);
+ }
+ catch (Exception ex)
+ {
+ OM.LOG.error(ex);
+ }
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ public static final class EditorOpenerDescriptor extends CDOEditorOpener.Default
+ {
+ private IConfigurationElement element;
+
+ public EditorOpenerDescriptor(IConfigurationElement element)
+ {
+ super(getID(element), getName(element), getIcon(element), getRegex(element), getPriority(element));
+ this.element = element;
+
+ if (StringUtil.isEmpty(element.getAttribute("class"))) //$NON-NLS-1$
+ {
+ throw new IllegalArgumentException(MessageFormat.format("Class not defined for extension {0}", element)); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ protected IEditorPart doOpenEditor(IWorkbenchPage page, URI uri)
+ {
+ return getEditorOpener().openEditor(page, uri);
+ }
+
+ private CDOEditorOpener getEditorOpener()
+ {
+ try
+ {
+ return (CDOEditorOpener)element.createExecutableExtension("class"); //$NON-NLS-1$
+ }
+ catch (CoreException ex)
+ {
+ throw WrappedException.wrap(ex);
+ }
+ }
+
+ private static String getID(IConfigurationElement element)
+ {
+ String value = element.getAttribute("id"); //$NON-NLS-1$
+ if (StringUtil.isEmpty(value))
+ {
+ throw new IllegalArgumentException(MessageFormat.format("ID not defined for extension {0}", element)); //$NON-NLS-1$
+ }
+
+ return value;
+ }
+
+ private static String getName(IConfigurationElement element)
+ {
+ String value = element.getAttribute("name"); //$NON-NLS-1$
+ if (StringUtil.isEmpty(value))
+ {
+ throw new IllegalArgumentException(MessageFormat.format("Name not defined for extension {0}", element)); //$NON-NLS-1$
+ }
+
+ return value;
+ }
+
+ private static ImageDescriptor getIcon(IConfigurationElement element)
+ {
+ String icon = element.getAttribute("icon"); //$NON-NLS-1$
+ if (icon != null)
+ {
+ try
+ {
+ return AbstractUIPlugin.imageDescriptorFromPlugin(element.getNamespaceIdentifier(), icon);
+ }
+ catch (Exception ex)
+ {
+ //$FALL-THROUGH$
+ }
+ }
+
+ return null;
+ }
+
+ private static String getRegex(IConfigurationElement element)
+ {
+ String value = element.getAttribute("regex"); //$NON-NLS-1$
+ if (StringUtil.isEmpty(value))
+ {
+ throw new IllegalArgumentException(MessageFormat.format("Regex not defined for extension {0}", element)); //$NON-NLS-1$
+ }
+
+ return value;
+ }
+
+ private static int getPriority(IConfigurationElement element)
+ {
+ try
+ {
+ String value = element.getAttribute("priority"); //$NON-NLS-1$
+ return Integer.parseInt(value);
+ }
+ catch (Exception ex)
+ {
+ return DEFAULT_PRIORITY;
+ }
+ }
+ }
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOHandlingConflictResolver.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOHandlingConflictResolver.java
index 644fa24614..74b8426de4 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOHandlingConflictResolver.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOHandlingConflictResolver.java
@@ -94,13 +94,18 @@ public class CDOHandlingConflictResolver extends CDOMergingConflictResolver impl
}
long lastNonConflictTimeStamp = getLastNonConflictTimeStamp();
- return conflictHandler.handleConflict(this, lastNonConflictTimeStamp);
+ return handleConflict(conflictHandler, lastNonConflictTimeStamp);
}
}
return true;
}
+ protected boolean handleConflict(ConflictHandler conflictHandler, long lastNonConflictTimeStamp)
+ {
+ return conflictHandler.handleConflict(this, lastNonConflictTimeStamp);
+ }
+
protected IManagedContainer getContainer()
{
return IPluginContainer.INSTANCE;

Back to the top