| /******************************************************************************* |
| * 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; |
| } |
| }); |
| } |
| } |