Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'extraplugins/team.collaborative/org.eclipse.papyrus.team.collaborative.integration.papyrus/src/org/eclipse/papyrus/team/collaborative/integration/papyrus/ui/actions/UnlockAction.java')
-rw-r--r--extraplugins/team.collaborative/org.eclipse.papyrus.team.collaborative.integration.papyrus/src/org/eclipse/papyrus/team/collaborative/integration/papyrus/ui/actions/UnlockAction.java179
1 files changed, 179 insertions, 0 deletions
diff --git a/extraplugins/team.collaborative/org.eclipse.papyrus.team.collaborative.integration.papyrus/src/org/eclipse/papyrus/team/collaborative/integration/papyrus/ui/actions/UnlockAction.java b/extraplugins/team.collaborative/org.eclipse.papyrus.team.collaborative.integration.papyrus/src/org/eclipse/papyrus/team/collaborative/integration/papyrus/ui/actions/UnlockAction.java
new file mode 100644
index 00000000000..3fddcafc200
--- /dev/null
+++ b/extraplugins/team.collaborative/org.eclipse.papyrus.team.collaborative.integration.papyrus/src/org/eclipse/papyrus/team/collaborative/integration/papyrus/ui/actions/UnlockAction.java
@@ -0,0 +1,179 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Atos
+ * 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:
+ * Arthur Daussy - initial implementation
+ *******************************************************************************/
+package org.eclipse.papyrus.team.collaborative.integration.papyrus.ui.actions;
+
+import java.util.Collection;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.papyrus.team.collaborative.ICollaborativeManager;
+import org.eclipse.papyrus.team.collaborative.IExtendedURI;
+import org.eclipse.papyrus.team.collaborative.integration.papyrus.MatchingURIObject;
+import org.eclipse.papyrus.team.collaborative.integration.papyrus.ui.ICollabColors;
+import org.eclipse.papyrus.team.collaborative.integration.papyrus.ui.dialogs.PreviewDialog;
+import org.eclipse.papyrus.team.collaborative.integration.papyrus.ui.providers.ExtensivePartitionNameLabelProvider;
+import org.eclipse.papyrus.team.collaborative.integration.papyrus.utils.UIUtils;
+import org.eclipse.papyrus.team.collaborative.participants.locker.IUnlocker;
+import org.eclipse.papyrus.team.collaborative.participants.version.ICommitter;
+import org.eclipse.papyrus.team.collaborative.reports.CollabStatus;
+import org.eclipse.papyrus.team.collaborative.strategy.ILockingStrategy;
+import org.eclipse.papyrus.team.collaborative.strategy.ILockingStrategy.Descriptor;
+import org.eclipse.swt.widgets.Display;
+
+
+/**
+ * Handler for the Unlock action in Papyrus
+ */
+public class UnlockAction extends Action {
+
+ /** The strategy. */
+ protected ILockingStrategy.Descriptor strategy;
+
+ /**
+ * Instantiates a new unlock action.
+ *
+ * @param strategy
+ * the strategy
+ */
+ public UnlockAction(Descriptor strategy) {
+ super();
+ this.strategy = strategy;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.action.Action#run()
+ */
+ @Override
+ public void run() {
+ if(!UIUtils.saveAllDirtyEditor().isOK()) {
+ return;
+ }
+ Collection<EObject> selection = UIUtils.getSelection();
+ if(!selection.isEmpty()) {
+ IStatus status = doSafeUnlock(selection, strategy);
+ if(!status.isOK()) {
+ UIUtils.errorDialog(status, "Error during Unlock");
+ }
+ }
+ super.run();
+ }
+
+ /**
+ * Do unlock.
+ *
+ * @param selection
+ * The {@link EObject} selected by the user
+ * @param strategy
+ * the strategy use to compute the business object set to unlock
+ * @throws CollabException
+ * the collab exception
+ */
+ public static IStatus doSafeUnlock(Collection<EObject> selection, ILockingStrategy.Descriptor strategy) {
+ EObject firstSelectedObject = selection.iterator().next();
+ ResourceSet resourceSet = firstSelectedObject.eResource().getResourceSet();
+
+ //Execute the strategy to define the functional object to lock
+ Set<IExtendedURI> objectToLock = strategy.getStrategy().getBusinessObject(selection);
+ //First check there no modification uncommitted
+ ICommitter committer = ICollaborativeManager.INSTANCE.getCommitter(objectToLock, resourceSet);
+ if(committer == null) {
+ return CollabStatus.createErrorStatus("Unable to find an Committer");
+ }
+
+ IStatus preventUnlockingWithUntrackedModification = preventUnlockingWithUntrackedModification(resourceSet, objectToLock, committer, firstSelectedObject);
+ if(!preventUnlockingWithUntrackedModification.isOK()) {
+ return preventUnlockingWithUntrackedModification;
+ }
+ //Reset the resourceSet because the editor may have been reloaded
+ resourceSet = UIUtils.getCurrentResourceSet();
+
+ IUnlocker unlocker = ICollaborativeManager.INSTANCE.getUnlocker(objectToLock, resourceSet);
+ if(unlocker == null) {
+ return CollabStatus.createErrorStatus("Unable to find a unlocker for:\n " + objectToLock);
+ }
+ return doUnlock(resourceSet, unlocker);
+ }
+
+ protected static IStatus doUnlock(ResourceSet resourceSet, IUnlocker unlocker) {
+ Set<IExtendedURI> needUnlock = unlocker.getExtendedSet();
+ //Check if the lock can be taken
+ ExtensivePartitionNameLabelProvider labelProvider = new ExtensivePartitionNameLabelProvider(new MatchingURIObject(needUnlock),UIUtils.getModelExplorerLavelProvider());
+ labelProvider.setColor(ICollabColors.UNLOCK_COLLOR);
+ PreviewDialog unlockPreviewDialog = new PreviewDialog(Display.getDefault().getActiveShell(), labelProvider, "Unlock Preview", "Element in green will be unlocked");
+ Collection<EObject> objectsToReveal = UIUtils.getLeafSemanticElement(needUnlock, resourceSet);
+ if(objectsToReveal != null && !objectsToReveal.isEmpty()) {
+ unlockPreviewDialog.setObjectsToReveal(objectsToReveal);
+ }
+ if(unlockPreviewDialog.open() == PreviewDialog.OK) {
+ IStatus lockResult = unlocker.unlock();
+ UIUtils.refreshModelExplorer(needUnlock, resourceSet);
+ return lockResult;
+ } else {
+ return CollabStatus.CANCEL_STATUS;
+ }
+ }
+
+
+ /**
+ * Prevent unlocking with untracked modification.
+ *
+ * @param resourceSet
+ * the resource set
+ * @param objectToLock
+ * the object to lock
+ * @param committer
+ * the committer
+ * @param selected
+ * the selected
+ * @return the i status
+ */
+ private static IStatus preventUnlockingWithUntrackedModification(ResourceSet resourceSet, Set<IExtendedURI> objectToLock, ICommitter committer, EObject selected) {
+ Set<IExtendedURI> committableResource = committer.getExtendedSet();
+ if(!committableResource.isEmpty()) {
+ //The user shall either commit or revert it's changes
+ MessageDialog dialog = new MessageDialog(Display.getCurrent().getActiveShell(), "Modification in progess", null, "You have untrackted modification. You either have to commit it or revert it(Everything will be lost) to release the lock", MessageDialog.WARNING, new String[]{ "Commit", "Revert" }, 0);
+ int dialogResult = dialog.open();
+ if(dialogResult == 0) {
+ //then commit
+ return CommitHandler.doCommitFromBuilder(resourceSet, committer, committableResource, true, null);
+ } else if(dialogResult == 1) {
+ //then revert
+ return RevertHandler.doRevert(committableResource, resourceSet);
+ } else {
+ //cancel
+ return Status.CANCEL_STATUS;
+ }
+ }
+ return Status.OK_STATUS;
+ }
+
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.action.Action#getText()
+ */
+ @Override
+ public String getText() {
+ return strategy.getName();
+ }
+
+
+
+}

Back to the top