| /******************************************************************************* |
| * Copyright (c) 2012-2013 EclipseSource Muenchen GmbH and others. |
| * |
| * 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: |
| * Edgar Mueller - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.emf.emfstore.client.test.ui.controllers; |
| |
| import java.util.List; |
| import java.util.concurrent.Callable; |
| |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.NullProgressMonitor; |
| import org.eclipse.emf.emfstore.bowling.BowlingFactory; |
| import org.eclipse.emf.emfstore.bowling.Player; |
| import org.eclipse.emf.emfstore.bowling.Tournament; |
| import org.eclipse.emf.emfstore.client.ESLocalProject; |
| import org.eclipse.emf.emfstore.client.ESWorkspaceProvider; |
| import org.eclipse.emf.emfstore.client.callbacks.ESUpdateCallback; |
| import org.eclipse.emf.emfstore.client.util.RunESCommand; |
| import org.eclipse.emf.emfstore.common.model.ESModelElementIdToEObjectMapping; |
| import org.eclipse.emf.emfstore.internal.client.ui.controller.UIRevertCommitController; |
| import org.eclipse.emf.emfstore.server.ESConflictSet; |
| import org.eclipse.emf.emfstore.server.exceptions.ESException; |
| import org.eclipse.emf.emfstore.server.model.ESChangePackage; |
| import org.eclipse.emf.emfstore.server.model.versionspec.ESPrimaryVersionSpec; |
| import org.eclipse.emf.emfstore.server.model.versionspec.ESVersionSpec; |
| import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable; |
| import org.eclipse.swtbot.swt.finder.results.VoidResult; |
| import org.eclipse.swtbot.swt.finder.waits.DefaultCondition; |
| import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell; |
| import org.junit.Test; |
| |
| public class UIRevertCommitControllerTest2 extends AbstractUIControllerTestWithCommit { |
| |
| @Override |
| @Test |
| public void testController() throws ESException { |
| assertEquals(0, getLocalProject().getModelElements().size()); |
| final ESUpdateCallback updateCallback = new MyUpdateCallback(); |
| final IProgressMonitor monitor = new NullProgressMonitor(); |
| |
| // create checkout |
| checkout(); |
| createPlayerAndTournamentAndCommit(); |
| final ESPrimaryVersionSpec baseVersion = getLocalProject().getBaseVersion(); |
| |
| // update checkout |
| getCopy().update(getLocalProject().getBaseVersion(), updateCallback, monitor); |
| |
| // delete player |
| deleteTournamentAndCommit(); |
| assertEquals(1, getLocalProject().getModelElements().size()); |
| |
| // update checkout |
| getCopy().update(getLocalProject().getBaseVersion(), updateCallback, monitor); |
| assertEquals(1, getCopy().getModelElements().size()); |
| |
| // revert to version where tournament has been created |
| revertAndCommit(baseVersion); |
| |
| // update checkout |
| getCopy().update(ESVersionSpec.FACTORY.createHEAD(), updateCallback, monitor); |
| assertEquals(2, getCopy().getModelElements().size()); |
| final Tournament tournament = getCopy().getAllModelElementsByClass(Tournament.class).iterator().next(); |
| assertEquals(new Integer(32), tournament.getPlayerPoints().values().iterator().next()); |
| |
| // revert again, should have no effect |
| revertAndCommit(baseVersion); |
| getCopy().update(ESVersionSpec.FACTORY.createHEAD(), updateCallback, monitor); |
| |
| assertEquals(2, getCopy().getModelElements().size()); |
| } |
| |
| private void createPlayerAndTournamentAndCommit() { |
| final Player player = BowlingFactory.eINSTANCE.createPlayer(); |
| player.setName("player"); |
| final Tournament tournament = BowlingFactory.eINSTANCE.createTournament(); |
| tournament.getPlayerPoints().put(player, 32); |
| |
| RunESCommand.run(new Callable<Void>() { |
| public Void call() throws Exception { |
| getLocalProject().getModelElements().add(player); |
| getLocalProject().getModelElements().add(tournament); |
| return null; |
| } |
| }); |
| commit(); |
| } |
| |
| private void revertAndCommit(final ESPrimaryVersionSpec baseVersion) throws ESException { |
| |
| final int localProjectsSize = ESWorkspaceProvider.INSTANCE.getWorkspace().getLocalProjects().size(); |
| |
| UIThreadRunnable.asyncExec(new VoidResult() { |
| public void run() { |
| final UIRevertCommitController revertCommitController = new UIRevertCommitController( |
| getBot().getDisplay().getActiveShell(), |
| baseVersion, |
| getLocalProject()); |
| revertCommitController.execute(); |
| } |
| }); |
| |
| final SWTBotShell shell = getBot().shell("Confirmation"); |
| shell.bot().button("OK").click(); |
| |
| getBot().waitUntil(new DefaultCondition() { |
| // BEGIN SUPRESS CATCH EXCEPTION |
| |
| public boolean test() throws Exception { |
| return localProjectsSize + 1 == ESWorkspaceProvider.INSTANCE.getWorkspace().getLocalProjects().size(); |
| } |
| |
| // END SUPRESS CATCH EXCEPTION |
| |
| public String getFailureMessage() { |
| return "Revert did not succeed."; |
| } |
| }, timeout()); |
| |
| final List<ESLocalProject> localProjects = ESWorkspaceProvider.INSTANCE.getWorkspace().getLocalProjects(); |
| final ESLocalProject localProject = localProjects.get(localProjects.size() - 1); |
| localProject.commit(new NullProgressMonitor()); |
| |
| } |
| |
| protected void deleteTournamentAndCommit() { |
| assertEquals(2, getLocalProject().getModelElements().size()); |
| RunESCommand.run(new Callable<Void>() { |
| public Void call() throws Exception { |
| final Tournament tournament = getLocalProject().getAllModelElementsByClass(Tournament.class).iterator() |
| .next(); |
| getLocalProject().getModelElements().remove(tournament); |
| return null; |
| } |
| }); |
| commit(); |
| assertEquals(1, getLocalProject().getModelElements().size()); |
| } |
| |
| private class MyUpdateCallback implements ESUpdateCallback { |
| |
| public boolean inspectChanges(ESLocalProject projectSpace, List<ESChangePackage> changes, |
| ESModelElementIdToEObjectMapping idToEObjectMapping) { |
| return ESUpdateCallback.NOCALLBACK.inspectChanges(projectSpace, changes, idToEObjectMapping); |
| } |
| |
| public void noChangesOnServer() { |
| ESUpdateCallback.NOCALLBACK.noChangesOnServer(); |
| } |
| |
| public boolean conflictOccurred(ESConflictSet changeConflictException, |
| IProgressMonitor progressMonitor) { |
| return ESUpdateCallback.NOCALLBACK.conflictOccurred(changeConflictException, progressMonitor); |
| } |
| } |
| |
| } |