| /******************************************************************************* |
| * Copyright (c) 2008-2011 Chair for Applied Software Engineering, |
| * Technische Universitaet Muenchen. |
| * 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: |
| * wesendon |
| ******************************************************************************/ |
| package org.eclipse.emf.emfstore.internal.client.ui.controller; |
| |
| import java.text.MessageFormat; |
| import java.util.Date; |
| import java.util.List; |
| import java.util.concurrent.Callable; |
| |
| import org.apache.commons.lang.StringUtils; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.emf.emfstore.client.ESLocalProject; |
| import org.eclipse.emf.emfstore.client.callbacks.ESCommitCallback; |
| import org.eclipse.emf.emfstore.client.util.RunESCommand; |
| import org.eclipse.emf.emfstore.common.model.ESModelElementIdToEObjectMapping; |
| import org.eclipse.emf.emfstore.internal.client.model.ProjectSpace; |
| import org.eclipse.emf.emfstore.internal.client.model.exceptions.CancelOperationException; |
| import org.eclipse.emf.emfstore.internal.client.model.impl.api.ESLocalProjectImpl; |
| import org.eclipse.emf.emfstore.internal.client.model.util.WorkspaceUtil; |
| import org.eclipse.emf.emfstore.internal.client.ui.common.RunInUI; |
| import org.eclipse.emf.emfstore.internal.client.ui.common.RunInUI.WithException; |
| import org.eclipse.emf.emfstore.internal.client.ui.dialogs.BranchSelectionDialog; |
| import org.eclipse.emf.emfstore.internal.client.ui.dialogs.CommitDialog; |
| import org.eclipse.emf.emfstore.internal.common.model.impl.ESModelElementIdToEObjectMappingImpl; |
| import org.eclipse.emf.emfstore.internal.server.model.impl.api.ESAbstractChangePackageImpl; |
| import org.eclipse.emf.emfstore.internal.server.model.versioning.BranchInfo; |
| import org.eclipse.emf.emfstore.internal.server.model.versioning.BranchVersionSpec; |
| import org.eclipse.emf.emfstore.internal.server.model.versioning.LogMessage; |
| import org.eclipse.emf.emfstore.internal.server.model.versioning.PrimaryVersionSpec; |
| import org.eclipse.emf.emfstore.internal.server.model.versioning.VersioningFactory; |
| import org.eclipse.emf.emfstore.internal.server.model.versioning.Versions; |
| import org.eclipse.emf.emfstore.server.exceptions.ESException; |
| import org.eclipse.emf.emfstore.server.exceptions.ESUpdateRequiredException; |
| import org.eclipse.emf.emfstore.server.model.ESChangePackage; |
| import org.eclipse.emf.emfstore.server.model.versionspec.ESPrimaryVersionSpec; |
| import org.eclipse.jface.dialogs.MessageDialog; |
| import org.eclipse.jface.window.Window; |
| import org.eclipse.swt.widgets.Shell; |
| |
| /** |
| * UIController for branch creation. Slightly modified copy of the commit |
| * controller |
| * |
| * @author wesendon |
| * |
| */ |
| public class UICreateBranchController extends |
| AbstractEMFStoreUIController<ESPrimaryVersionSpec> implements |
| ESCommitCallback { |
| |
| private final ProjectSpace projectSpace; |
| private int dialogReturnValue; |
| private BranchVersionSpec branch; |
| |
| /** |
| * Constructor. |
| * |
| * @param shell |
| * the parent {@link Shell} that should be used during the |
| * creation of the branch |
| * @param projectSpace |
| * the project space for which to create a branch for |
| */ |
| public UICreateBranchController(Shell shell, ESLocalProject projectSpace) { |
| this(shell, projectSpace, null); |
| } |
| |
| /** |
| * Constructor. |
| * |
| * @param shell |
| * the parent {@link Shell} that should be used during the |
| * creation of the branch |
| * @param localProject |
| * the project space for which to create a branch for |
| * @param branch |
| * the branch to be committed |
| */ |
| public UICreateBranchController(Shell shell, ESLocalProject localProject, |
| BranchVersionSpec branch) { |
| super(shell, true, true); |
| projectSpace = ((ESLocalProjectImpl) localProject) |
| .toInternalAPI(); |
| this.branch = branch; |
| } |
| |
| /** |
| * |
| * {@inheritDoc} |
| * |
| * @see org.eclipse.emf.emfstore.client.callbacks.ESCommitCallback#noLocalChanges(ESLocalProject) |
| */ |
| public void noLocalChanges(ESLocalProject projectSpace) { |
| RunInUI.run(new Callable<Void>() { |
| public Void call() throws Exception { |
| MessageDialog.openInformation(getShell(), null, |
| Messages.UICreateBranchController_NoLocalChanges); |
| return null; |
| } |
| }); |
| } |
| |
| /** |
| * |
| * {@inheritDoc} |
| * |
| * @see org.eclipse.emf.emfstore.client.callbacks.ESCommitCallback#baseVersionOutOfDate(ESLocalProject, |
| * IProgressMonitor) |
| */ |
| public boolean baseVersionOutOfDate(final ESLocalProject projectSpace, |
| final IProgressMonitor progressMonitor) { |
| |
| final String message = Messages.UICreateBranchController_ProjectOutdated; |
| return RunInUI.runWithResult(new Callable<Boolean>() { |
| |
| public Boolean call() throws Exception { |
| final boolean shouldUpdate = MessageDialog.openConfirm(getShell(), |
| Messages.UICreateBranchController_Confirmation, |
| message); |
| if (shouldUpdate) { |
| final ESPrimaryVersionSpec baseVersion = UICreateBranchController.this.projectSpace |
| .getBaseVersion().toAPI(); |
| final ESPrimaryVersionSpec version = new UIUpdateProjectController( |
| getShell(), projectSpace) |
| .executeSub(progressMonitor); |
| if (version.equals(baseVersion)) { |
| return false; |
| } |
| |
| } |
| return shouldUpdate; |
| } |
| }); |
| } |
| |
| /** |
| * |
| * {@inheritDoc} |
| * |
| * @see org.eclipse.emf.emfstore.client.callbacks.ESCommitCallback#inspectChanges(ESLocalProject, ESChangePackage, |
| * ESModelElementIdToEObjectMapping) |
| */ |
| |
| public boolean inspectChanges( |
| ESLocalProject localProject, |
| final ESChangePackage changePackage, |
| ESModelElementIdToEObjectMapping idToEObjectMapping) { |
| |
| final ESLocalProjectImpl localProjectImpl = (ESLocalProjectImpl) localProject; |
| |
| final CommitDialog commitDialog = new CommitDialog(getShell(), |
| ESAbstractChangePackageImpl.class.cast(changePackage).toInternalAPI(), |
| localProjectImpl.toInternalAPI(), |
| ((ESModelElementIdToEObjectMappingImpl) idToEObjectMapping).toInternalAPI()); |
| |
| dialogReturnValue = RunInUI.runWithResult(new Callable<Integer>() { |
| public Integer call() throws Exception { |
| return commitDialog.open(); |
| } |
| }); |
| |
| if (dialogReturnValue == Window.OK) { |
| RunESCommand.run(new Callable<Void>() { |
| public Void call() throws Exception { |
| final LogMessage logMessage = VersioningFactory.eINSTANCE.createLogMessage(); |
| logMessage.setAuthor(projectSpace |
| .getUsersession().getUsername()); |
| logMessage.setClientDate(new Date()); |
| logMessage.setMessage(commitDialog.getLogText()); |
| changePackage.setLogMessage(logMessage.toAPI()); |
| return null; |
| } |
| }); |
| return true; |
| } |
| |
| return false; |
| } |
| |
| /** |
| * |
| * {@inheritDoc} |
| * |
| * @see org.eclipse.emf.emfstore.internal.client.ui.controller.AbstractEMFStoreUIController#doRun(org.eclipse.core.runtime.IProgressMonitor) |
| */ |
| @Override |
| public ESPrimaryVersionSpec doRun(final IProgressMonitor progressMonitor) |
| throws ESException { |
| try { |
| if (branch == null) { |
| branch = branchSelection(projectSpace); |
| } |
| |
| final PrimaryVersionSpec commitToBranch = projectSpace.commitToBranch( |
| branch, |
| null, |
| UICreateBranchController.this, |
| progressMonitor); |
| return commitToBranch.toAPI(); |
| } catch (final ESUpdateRequiredException e) { |
| // project is out of date and user canceled update |
| // ignore |
| } catch (final ESException e) { |
| if (e instanceof CancelOperationException) { |
| return null; |
| } |
| WorkspaceUtil.logException(e.getMessage(), e); |
| RunInUI.run(new Callable<Void>() { |
| public Void call() throws Exception { |
| MessageDialog.openError(getShell(), |
| Messages.UICreateBranchController_CreateBranch_Title, |
| MessageFormat.format(Messages.UICreateBranchController_CreateBranch_Message, e.getMessage())); |
| return null; |
| } |
| }); |
| } |
| |
| return null; |
| } |
| |
| private BranchVersionSpec branchSelection(final ProjectSpace projectSpace) |
| throws ESException { |
| final List<BranchInfo> branches = projectSpace.getBranches(); |
| |
| final String branch = WithException |
| .runWithResult(new Callable<String>() { |
| |
| public String call() throws Exception { |
| final BranchSelectionDialog.Creation dialog = new BranchSelectionDialog.Creation( |
| getShell(), branches); |
| dialog.setBlockOnOpen(true); |
| |
| if (dialog.open() != Window.OK |
| || dialog.getNewBranch() == null |
| || dialog.getNewBranch().equals(StringUtils.EMPTY)) { |
| throw new CancelOperationException( |
| Messages.UICreateBranchController_NoBranchSpecified); |
| } |
| return dialog.getNewBranch(); |
| } |
| }); |
| |
| return Versions.createBRANCH(branch); |
| } |
| } |