package org.eclipse.emf.emfstore.client.model.controller;
import java.util.Date;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.emfstore.client.model.WorkspaceManager;
import org.eclipse.emf.emfstore.client.model.connectionmanager.ServerCall;
import org.eclipse.emf.emfstore.client.model.controller.callbacks.CommitCallback;
import org.eclipse.emf.emfstore.client.model.impl.ProjectSpaceBase;
import org.eclipse.emf.emfstore.client.model.observers.CommitObserver;
import org.eclipse.emf.emfstore.server.exceptions.BaseVersionOutdatedException;
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.LogMessage;
import org.eclipse.emf.emfstore.server.model.versioning.PrimaryVersionSpec;
import org.eclipse.emf.emfstore.server.model.versioning.VersionSpec;
import org.eclipse.emf.emfstore.server.model.versioning.VersioningFactory;
import org.eclipse.emf.emfstore.server.model.versioning.operations.AbstractOperation;
public class CommitController extends ServerCall<PrimaryVersionSpec> {
private LogMessage logMessage;
private CommitCallback callback;
public CommitController(ProjectSpaceBase projectSpace,
LogMessage logMessage, CommitCallback callback,
IProgressMonitor monitor) {
super(projectSpace);
this.logMessage = (logMessage == null) ? createLogMessage()
: logMessage;
this.callback = callback == null ? CommitCallback.NOCALLBACK : callback;
setProgressMonitor(monitor);
}
@Override
protected PrimaryVersionSpec run() throws EmfStoreException {
return commit(this.logMessage);
}
private PrimaryVersionSpec commit(LogMessage logMessage)
throws EmfStoreException {
getProgressMonitor().beginTask("Commiting Changes", 100);
getProgressMonitor().worked(1);
getProgressMonitor().subTask("Checking changes");
// check if there are any changes
if (!getProjectSpace().isDirty()) {
return getProjectSpace().getBaseVersion();
}
getProjectSpace().cleanCutElements();
getProgressMonitor().subTask("Resolving new version");
// check if we need to update first
PrimaryVersionSpec resolvedVersion = getProjectSpace()
.resolveVersionSpec(VersionSpec.HEAD_VERSION);
if (!getProjectSpace().getBaseVersion().equals(resolvedVersion)) {
if (!callback.baseVersionOutOfDate(getProjectSpace())) {
throw new BaseVersionOutdatedException();
}
}
getProgressMonitor().worked(10);
getProgressMonitor().subTask("Gathering changes");
ChangePackage changePackage = getProjectSpace().getLocalChangePackage(
true);
changePackage.setLogMessage(logMessage);
if (changePackage.getOperations().isEmpty()) {
for (AbstractOperation operation : getProjectSpace()
.getOperations()) {
getProjectSpace().getOperationManager().notifyOperationUndone(
operation);
}
getProjectSpace().getOperations().clear();
getProjectSpace().updateDirtyState();
// finally, no local changes
}
WorkspaceManager.getObserverBus().notify(CommitObserver.class)
.inspectChanges(getProjectSpace(), changePackage);
getProgressMonitor().subTask("Presenting Changes");
if (!callback.inspectChanges(getProjectSpace(), changePackage)
|| getProgressMonitor().isCanceled()) {
return getProjectSpace().getBaseVersion();
}
getProgressMonitor().subTask("Sending changes to server");
PrimaryVersionSpec newBaseVersion = getConnectionManager()
.createVersion(getUsersession().getSessionId(),
getProjectSpace().getProjectId(),
getProjectSpace().getBaseVersion(), changePackage,
changePackage.getLogMessage());
getProgressMonitor().worked(75);
getProgressMonitor().subTask("Finalizing commit");
getProjectSpace().setBaseVersion(newBaseVersion);
getProjectSpace().getOperations().clear();
getProjectSpace().saveProjectSpaceOnly();
// TODO reimplement with ObserverBus and think about subtasks for commit
getProjectSpace().getFileTransferManager().uploadQueuedFiles(
new NullProgressMonitor());
WorkspaceManager.getObserverBus().notify(CommitObserver.class)
.commitCompleted(getProjectSpace(), newBaseVersion);
getProjectSpace().updateDirtyState();
return newBaseVersion;
}
private LogMessage createLogMessage() {
LogMessage logMessage = VersioningFactory.eINSTANCE.createLogMessage();
String commiter = "UNKOWN";
if (getProjectSpace().getUsersession() != null
&& getProjectSpace().getUsersession().getACUser() != null
&& getProjectSpace().getUsersession().getACUser().getName() != null) {
commiter = getProjectSpace().getUsersession().getACUser().getName();
}
logMessage.setAuthor(commiter);
logMessage.setClientDate(new Date());
logMessage.setMessage("");
return logMessage;
}
}