/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.workflow.editor.properties;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import de.rcenvironment.core.component.workflow.model.api.WorkflowNode;
/**
* Abstract common base for {@link WorkflowNodeCommand}s composed of several {@link WorkflowNodeSimpleCommand}s.
*
* @author Christian Weiss
*/
public abstract class AbstractWorkflowNodeCompositeCommand extends AbstractWorkflowNodeCommand {
private final List<WorkflowNodeSimpleCommand> commands = new LinkedList<WorkflowNodeSimpleCommand>();
public AbstractWorkflowNodeCompositeCommand(final WorkflowNodeSimpleCommand... commands) {
if (commands.length == 0) {
throw new IllegalArgumentException();
}
this.commands.clear();
for (final WorkflowNodeSimpleCommand command : commands) {
this.commands.add(command);
}
}
public AbstractWorkflowNodeCompositeCommand(final Collection<WorkflowNodeSimpleCommand> commands) {
if (commands.size() == 0) {
throw new IllegalArgumentException();
}
this.commands.clear();
this.commands.addAll(commands);
}
@Override
public final void execute2() {
if (canExecute()) {
final List<WorkflowNodeSimpleCommand> executed = new LinkedList<WorkflowNodeSimpleCommand>();
try {
final WorkflowNode workflowNode = getWorkflowNode();
for (final WorkflowNodeSimpleCommand command : commands) {
command.setWorkflowNode(workflowNode);
command.execute();
executed.add(command);
}
} catch (RuntimeException e) {
for (final WorkflowNodeSimpleCommand command : executed) {
try {
command.undo();
} catch (RuntimeException e2) {
// TODO log
e2 = null;
}
}
}
}
}
@Override
public final void undo2() {
if (canUndo()) {
for (final WorkflowNodeSimpleCommand command : commands) {
try {
command.undo();
} catch (RuntimeException e2) {
// TODO log
e2 = null;
}
}
}
}
/**
* Minimal interface for {@link WorkflowNodeCommand}.
*
* @author Christian Weiss
*/
public abstract static class WorkflowNodeSimpleCommand {
private WorkflowNode workflowNode;
private void setWorkflowNode(final WorkflowNode workflowNode) {
this.workflowNode = workflowNode;
}
protected WorkflowNode getWorkflowNode() {
return workflowNode;
}
/**
* Executes this command.
*
*/
public abstract void execute();
/**
* Undoes this command.
*
*/
public abstract void undo();
}
}