diff options
author | Eike Stepper | 2015-05-17 07:08:12 +0000 |
---|---|---|
committer | Eike Stepper | 2015-05-17 07:08:12 +0000 |
commit | e993693885652bc67ae69ea1a4d9202123172f35 (patch) | |
tree | c1e00ff9d72fba78a1f9db9c9d18da55d564992a | |
parent | 95d2be88f607c6b94bfaab37e988366e729b25c8 (diff) | |
download | cdo-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
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; |