package org.eclipse.emf.emfstore.client.model.controller;
import java.util.List;
import org.eclipse.emf.emfstore.client.model.ProjectSpace;
import org.eclipse.emf.emfstore.client.model.WorkspaceManager;
import org.eclipse.emf.emfstore.client.model.connectionmanager.ConnectionManager;
import org.eclipse.emf.emfstore.client.model.connectionmanager.ServerCall;
import org.eclipse.emf.emfstore.common.model.util.ModelUtil;
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;
public class ForceRevertController extends ServerCall<Void> {
private ProjectSpace projectSpace;
private PrimaryVersionSpec versionSpec;
public ForceRevertController(ProjectSpace projectSpace, PrimaryVersionSpec versionSpec) {
this.projectSpace = projectSpace;
this.versionSpec = versionSpec;
}
public void checkoutHeadAndReverseCommit(final ProjectSpace projectSpace, final PrimaryVersionSpec versionSpec)
throws EmfStoreException {
ConnectionManager connectionManager = WorkspaceManager.getInstance().getConnectionManager();
ProjectSpace revertSpace = WorkspaceManager
.getInstance()
.getCurrentWorkspace()
.checkout(
projectSpace.getUsersession(),
projectSpace.getProjectInfo(),
connectionManager.resolveVersionSpec(projectSpace.getUsersession().getSessionId(),
projectSpace.getProjectId(), VersionSpec.HEAD_VERSION));
PrimaryVersionSpec sourceVersion = ModelUtil.clone(versionSpec);
sourceVersion.setIdentifier(sourceVersion.getIdentifier() - 1);
List<ChangePackage> changes = revertSpace.getChanges(sourceVersion, versionSpec);
if (changes.size() != 1) {
throw new EmfStoreException("Zero or more than 1 Change Package received for one revision!");
}
ChangePackage changePackage = changes.get(0);
ChangePackage reversedChangePackage = changePackage.reverse();
reversedChangePackage.apply(revertSpace.getProject(), true);
}
@Override
protected Void run() throws EmfStoreException {
checkoutHeadAndReverseCommit(projectSpace, versionSpec);
return null;
}
}