blob: d2195f176ec056b63036174168814394c2d6141c [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:
* ovonwesen
* emueller
******************************************************************************/
package org.eclipse.emf.emfstore.internal.client.model.controller;
import java.util.Collections;
import java.util.List;
import org.eclipse.emf.emfstore.internal.client.model.ProjectSpace;
import org.eclipse.emf.emfstore.internal.client.model.connectionmanager.ServerCall;
import org.eclipse.emf.emfstore.internal.client.model.impl.api.ESLocalProjectImpl;
import org.eclipse.emf.emfstore.internal.common.model.util.ModelUtil;
import org.eclipse.emf.emfstore.internal.server.model.versioning.ChangePackage;
import org.eclipse.emf.emfstore.internal.server.model.versioning.PrimaryVersionSpec;
import org.eclipse.emf.emfstore.internal.server.model.versioning.Versions;
import org.eclipse.emf.emfstore.server.exceptions.ESException;
/**
* Controller that forces a revert of version specifier.
*
* @author ovonwesen
* @author emueller
*/
public class RevertCommitController extends ServerCall<Void> {
private PrimaryVersionSpec versionSpec;
private final boolean headRevert;
private String checkedoutCopyName;
/**
* Constructor.
*
* @param projectSpace
* the {@link ProjectSpace} containing the project upon which to revert a commit
* @param versionSpec
* the target version to revert to
* @param headRevert
* reverts HEAD if set to {@code true}, otherwise just revert individual version
*/
public RevertCommitController(ProjectSpace projectSpace,
PrimaryVersionSpec versionSpec, boolean headRevert, String checkedoutCopyName) {
super(projectSpace);
this.versionSpec = versionSpec;
this.headRevert = headRevert;
this.checkedoutCopyName = checkedoutCopyName;
}
private void checkoutHeadAndReverseCommit(final ProjectSpace projectSpace, final PrimaryVersionSpec baseVersion,
boolean headRevert) throws ESException {
PrimaryVersionSpec localHead = getConnectionManager()
.resolveVersionSpec(
projectSpace.getUsersession().getSessionId(),
projectSpace.getProjectId(),
Versions.createHEAD(baseVersion));
ESLocalProjectImpl revertSpace = projectSpace.toAPI().getRemoteProject().checkout(
checkedoutCopyName,
projectSpace.getUsersession().toAPI(),
getProgressMonitor());
List<ChangePackage> changes = revertSpace.toInternalAPI().getChanges(
baseVersion,
headRevert ? localHead : ModelUtil.clone(baseVersion));
Collections.reverse(changes);
for (ChangePackage changePackage : changes) {
changePackage.reverse().apply(revertSpace.toInternalAPI().getProject(), true);
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.connectionmanager.ServerCall#run()
*/
@Override
protected Void run() throws ESException {
checkoutHeadAndReverseCommit(getProjectSpace(), versionSpec, headRevert);
return null;
}
}