package org.objectstyle.wolips.eomodeler.actions; import java.util.LinkedList; import java.util.List; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.operations.AbstractOperation; import org.eclipse.core.commands.operations.ICompositeOperation; import org.eclipse.core.commands.operations.IUndoContext; import org.eclipse.core.commands.operations.IUndoableOperation; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.objectstyle.wolips.eomodeler.Activator; public class SimpleCompositeOperation extends AbstractOperation implements ICompositeOperation { private List<IUndoableOperation> _operations; public SimpleCompositeOperation(String label) { super(label); _operations = new LinkedList<IUndoableOperation>(); } @Override public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { ExecutionException pendingException = null; boolean completed = false; List<IUndoableOperation> completedOperations = new LinkedList<IUndoableOperation>(); for (IUndoableOperation operation : _operations) { completed = false; try { IStatus status = operation.execute(monitor, info); if (status.getSeverity() == IStatus.OK) { completed = true; completedOperations.add(operation); } } catch (ExecutionException e) { pendingException = e; } if (!completed) { break; } } IStatus status; if (!completed) { for (IUndoableOperation operation : completedOperations) { operation.undo(monitor, info); } if (pendingException != null) { throw pendingException; } status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, "Failed", null); } else { status = Status.OK_STATUS; } return status; } @Override public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { IStatus status = Status.OK_STATUS; for (IUndoableOperation operation : _operations) { status = operation.redo(monitor, info); if (status.getSeverity() == IStatus.ERROR) { break; } } return status; } @Override public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { IStatus status = Status.OK_STATUS; for (IUndoableOperation operation : _operations) { status = operation.undo(monitor, info); if (status.getSeverity() == IStatus.ERROR) { break; } } return status; } public void add(IUndoableOperation operation) { _operations.add(operation); } public void remove(IUndoableOperation operation) { _operations.remove(operation); } @Override public void addContext(IUndoContext context) { super.addContext(context); for (IUndoableOperation operation : _operations) { operation.addContext(context); } } @Override public void removeContext(IUndoContext context) { super.addContext(context); for (IUndoableOperation operation : _operations) { operation.removeContext(context); } } @Override public boolean canExecute() { boolean canExecute = super.canExecute(); for (IUndoableOperation operation : _operations) { canExecute &= operation.canExecute(); } return canExecute; } @Override public boolean canUndo() { boolean canUndo = super.canUndo(); for (IUndoableOperation operation : _operations) { canUndo &= operation.canUndo(); } return canUndo; } @Override public boolean canRedo() { boolean canRedo = super.canRedo(); for (IUndoableOperation operation : _operations) { canRedo &= operation.canRedo(); } return canRedo; } @Override public void dispose() { for (IUndoableOperation operation : _operations) { operation.dispose(); } super.dispose(); } }