package org.eclipse.emf.emfstore.client.ui.controller;
import java.util.List;
import org.eclipse.emf.emfstore.client.model.ProjectSpace;
import org.eclipse.emf.emfstore.client.model.controller.callbacks.UpdateCallback;
import org.eclipse.emf.emfstore.client.model.exceptions.ChangeConflictException;
import org.eclipse.emf.emfstore.client.model.util.WorkspaceUtil;
import org.eclipse.emf.emfstore.client.ui.dialogs.UpdateDialog;
import org.eclipse.emf.emfstore.client.ui.dialogs.merge.MergeProjectHandler;
import org.eclipse.emf.emfstore.client.ui.handlers.AbstractEMFStoreUIController;
import org.eclipse.emf.emfstore.server.exceptions.EmfStoreException;
import org.eclipse.emf.emfstore.server.model.versioning.ChangePackage;
import org.eclipse.emf.emfstore.server.model.versioning.PrimaryVersionSpec;
import org.eclipse.emf.emfstore.server.model.versioning.VersionSpec;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Shell;
public class UIUpdateProjectController extends AbstractEMFStoreUIController implements UpdateCallback {
public UIUpdateProjectController(Shell shell) {
super(shell);
}
public void update(ProjectSpace projectSpace) throws EmfStoreException {
update(projectSpace, null);
}
public void update(ProjectSpace projectSpace, VersionSpec version) throws EmfStoreException {
// TODO sanity check projectspace (is null, is shared)
try {
openProgress();
PrimaryVersionSpec oldBaseVersion = projectSpace.getBaseVersion();
PrimaryVersionSpec updatedVersion = projectSpace.update(version, this, getProgressMonitor());
if (oldBaseVersion.equals(updatedVersion)) {
noChangesOnServer();
}
} finally {
closeProgress();
}
}
public void askForVersionAndUpdate(ProjectSpace projectSpace) throws EmfStoreException {
update(projectSpace, openVersionDialog(projectSpace));
}
protected VersionSpec openVersionDialog(ProjectSpace projectSpace) {
// TODO implement
return null;
}
public void noChangesOnServer() {
closeProgress();
MessageDialog.openInformation(getShell(), "No need to update",
"Your project is up to date, you do not need to update.");
}
public boolean conflictOccurred(ChangeConflictException conflictException) {
ProjectSpace projectSpace = conflictException.getProjectSpace();
boolean mergeSuccessful = false;
try {
PrimaryVersionSpec targetVersion = projectSpace.resolveVersionSpec(VersionSpec.HEAD_VERSION);
mergeSuccessful = projectSpace.merge(targetVersion, new MergeProjectHandler(conflictException));
} catch (EmfStoreException e) {
WorkspaceUtil.logException("Exception when merging the project!", e);
handleException(e);
}
closeProgress();
return mergeSuccessful;
}
public boolean inspectChanges(ProjectSpace projectSpace, List<ChangePackage> changePackages) {
UpdateDialog updateDialog = new UpdateDialog(getShell(), projectSpace, changePackages);
if (updateDialog.open() == Window.OK) {
return true;
}
return false;
}
public void updateCompleted(ProjectSpace projectSpace, PrimaryVersionSpec oldVersion, PrimaryVersionSpec newVersion) {
// explicitly refresh the decorator since no simple attribute has
// been changed
// (as opposed to committing where the dirty property is being set)
// TODO replace by Observerbus or listener mechanism
// Display.getDefault().asyncExec(new Runnable() {
// public void run() {
// PlatformUI.getWorkbench().getDecoratorManager()
// .update("org.eclipse.emf.emfstore.client.ui.decorators.VersionDecorator");
// }
// });
closeProgress();
}
}