| /******************************************************************************* |
| * 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: |
| * koegel |
| * Johannes Faltermeier - API Delegate |
| ******************************************************************************/ |
| package org.eclipse.emf.emfstore.internal.client.model; |
| |
| import java.util.Date; |
| |
| import org.eclipse.emf.emfstore.internal.client.model.exceptions.InvalidHandleException; |
| import org.eclipse.emf.emfstore.internal.client.model.impl.OperationRecorder; |
| import org.eclipse.emf.emfstore.internal.client.model.impl.api.ESCompositeOperationHandleImpl; |
| import org.eclipse.emf.emfstore.internal.common.api.APIDelegate; |
| import org.eclipse.emf.emfstore.internal.common.model.ModelElementId; |
| import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.CompositeOperation; |
| import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.semantic.SemanticCompositeOperation; |
| |
| /** |
| * A handle to control a composite operation during recording. |
| * |
| * @author koegel |
| * @author Johannes Faltermeier |
| */ |
| public class CompositeOperationHandle implements APIDelegate<ESCompositeOperationHandleImpl> { |
| |
| private boolean isValid; |
| private CompositeOperation compositeOperation; |
| private OperationRecorder operationRecorder; |
| private ESCompositeOperationHandleImpl handle; |
| |
| /** |
| * Default constructor. |
| * |
| * @param operationRecorder |
| * the change tracker this composite is tracked on |
| * @param compositeOperation |
| * the composite operation to be handled |
| */ |
| public CompositeOperationHandle(OperationRecorder operationRecorder, CompositeOperation compositeOperation) { |
| this.operationRecorder = operationRecorder; |
| this.compositeOperation = compositeOperation; |
| isValid = true; |
| } |
| |
| /** |
| * Returns whether the handle is still valid. |
| * |
| * @return false if the composite operation is already completed or aborted. |
| */ |
| public boolean isValid() { |
| return isValid; |
| } |
| |
| /** |
| * Aborts a composite operation. The state before starting the composite |
| * operation will be recovered. |
| * |
| * @throws InvalidHandleException |
| * if the handle is invalid |
| */ |
| public void abort() throws InvalidHandleException { |
| checkAndCloseHandle(); |
| operationRecorder.abortCompositeOperation(); |
| dropAllReferences(); |
| } |
| |
| private void dropAllReferences() { |
| compositeOperation = null; |
| operationRecorder = null; |
| } |
| |
| private void checkAndCloseHandle() throws InvalidHandleException { |
| if (!isValid) { |
| throw new InvalidHandleException(); |
| } |
| isValid = false; |
| } |
| |
| /** |
| * Completes a composite operation. |
| * |
| * @param name |
| * the name for the operation |
| * @param description |
| * the description of the operation |
| * @param modelElementId |
| * the id of the model element that is most important for the |
| * operation |
| * @throws InvalidHandleException |
| * if the handle is invalid |
| */ |
| public void end(String name, String description, ModelElementId modelElementId) throws InvalidHandleException { |
| checkAndCloseHandle(); |
| compositeOperation.setCompositeName(name); |
| compositeOperation.setCompositeDescription(description); |
| compositeOperation.setClientDate(new Date()); |
| compositeOperation.setReversed(false); |
| compositeOperation.setModelElementId(modelElementId); |
| operationRecorder.endCompositeOperation(); |
| dropAllReferences(); |
| } |
| |
| /** |
| * Completes a the given semantic composite operation. |
| * |
| * @param semanticCompositeOperation |
| * a semanticCompositeOperation that was executed and represents |
| * the composite |
| * @throws InvalidHandleException |
| * if the handle is invalid |
| */ |
| public void end(SemanticCompositeOperation semanticCompositeOperation) throws InvalidHandleException { |
| checkAndCloseHandle(); |
| semanticCompositeOperation.setClientDate(new Date()); |
| semanticCompositeOperation.setReversed(false); |
| semanticCompositeOperation.getSubOperations().addAll(compositeOperation.getSubOperations()); |
| operationRecorder.endCompositeOperation(semanticCompositeOperation); |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * @see org.eclipse.emf.emfstore.internal.common.api.APIDelegate#toAPI() |
| */ |
| public ESCompositeOperationHandleImpl toAPI() { |
| if (handle == null) { |
| handle = createAPI(); |
| } |
| return handle; |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * @see org.eclipse.emf.emfstore.internal.common.api.APIDelegate#createAPI() |
| */ |
| public ESCompositeOperationHandleImpl createAPI() { |
| return new ESCompositeOperationHandleImpl(this); |
| } |
| } |