blob: a10f28cbf6142d16eb1fa1e568d2edaae0b249c1 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}