blob: 82878c8e8dfc134fd2021d12203fc30d477f0a88 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008-2015 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:
* Otto von Wesendonk, Edgar Mueller - initial API and implementation
******************************************************************************/
package org.eclipse.emf.emfstore.internal.client.model.controller;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Callable;
import org.eclipse.emf.emfstore.client.util.RunESCommand;
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.Project;
import org.eclipse.emf.emfstore.internal.common.model.util.ModelUtil;
import org.eclipse.emf.emfstore.internal.server.model.versioning.AbstractChangePackage;
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.internal.server.model.versioning.operations.AbstractOperation;
import org.eclipse.emf.emfstore.server.ESCloseableIterable;
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 final PrimaryVersionSpec versionSpec;
private final boolean headRevert;
private final 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
* @param checkedoutCopyName
* the name of the checkout that is going to be created
*/
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 {
final PrimaryVersionSpec localHead = getConnectionManager()
.resolveVersionSpec(
projectSpace.getUsersession().getSessionId(),
projectSpace.getProjectId(),
Versions.createHEAD(baseVersion));
final ESLocalProjectImpl revertSpace = projectSpace.toAPI().getRemoteProject().checkout(
checkedoutCopyName,
projectSpace.getUsersession().toAPI(),
getProgressMonitor());
// TODO: LCP
final List<AbstractChangePackage> changes = revertSpace.toInternalAPI().getChanges(
baseVersion,
headRevert ? localHead : ModelUtil.clone(baseVersion));
Collections.reverse(changes);
final Project project = revertSpace.toInternalAPI().getProject();
for (final AbstractChangePackage changePackage : changes) {
final ESCloseableIterable<AbstractOperation> reversedOperations = changePackage.reversedOperations();
try {
for (final AbstractOperation reversedOperation : reversedOperations.iterable()) {
try {
reversedOperation.reverse().apply(project);
} catch (final IllegalStateException e) {
// ignore all non-applied operations
}
}
} finally {
reversedOperations.close();
}
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.connectionmanager.ServerCall#run()
*/
@Override
protected Void run() throws ESException {
return RunESCommand.WithException.runWithResult(ESException.class, new Callable<Void>() {
public Void call() throws Exception {
checkoutHeadAndReverseCommit(getProjectSpace(), versionSpec, headRevert);
return null;
}
});
}
}