Package org.apache.wiki.workflow

## Class AbstractStep

- java.lang.Object
- - org.apache.wiki.workflow.AbstractStep

All Implemented Interfaces:
  `java.io.Serializable`, `Step`

Direct Known Subclasses:
  `Decision`, `Task`

    public abstract class AbstractStep
    extends java.lang.Object
    implements Step

Abstract superclass that provides a complete implementation of most Step methods; subclasses need only implement `execute(Context)` and `getActor()`.

Since:
  2.5
See Also:
  Serialized Form

### Field Summary

### Fields inherited from interface org.apache.wiki.workflow.Step

`TIME_NOT_SET`

### Constructor Summary

Constructors
`` `AbstractStep​(int workflowId, java.util.Map<java.lang.String,​java.io.Serializable> workflowContext, java.lang.String messageKey)` Constructs a new Step belonging to a specified Workflow and having a specified message key.
`protected` `AbstractStep​(java.lang.String messageKey)` Protected constructor that creates a new Step with a specified message key.

### Method Summary

All Methods Instance Methods Abstract Methods Concrete Methods
`protected void` `addError​(java.lang.String message)` Protected helper method that adds a String representing an error message to the Step's cached errors list.
`void` `addSuccessor​(Outcome outcome, Step step)` Adds a successor Step to this one, which will be triggered by a supplied Outcome.
`abstract Outcome` `execute​(Context ctx)` Executes the processing for this Step and returns an Outcome indicating if it succeeded (`Outcome.STEP_COMPLETE` or `Outcome.STEP_ABORT`).
`abstract java.security.Principal` `getActor()` The Principal responsible for completing this Step, such as a system user or actor assigned to a Decision.
`java.util.Collection<Outcome>` `getAvailableOutcomes()` Returns a Collection of available outcomes, such as "approve", "deny" or "reassign", in the order in which they were added via `Step.addSuccessor(Outcome, Step)`.
`java.util.Date` `getEndTime()` The end time for this Step.
`java.util.List<java.lang.String>` `getErrors()` Returns a List of error strings generated by this Step.
`java.lang.String` `getMessageKey()` Message key for human-friendly name of this Step, including any parameter substitutions.
`Outcome` `getOutcome()` Returns the Outcome of this Step's processing; by default, `Outcome.STEP_CONTINUE`.
`java.util.Date` `getStartTime()` The start time for this Step.
`Step` `getSuccessor​(Outcome outcome)` Identifies the next Step for a particular Outcome; if there is no next Step for this Outcome, this method returns `null`.
`java.util.Map<java.lang.String,​java.io.Serializable>` `getWorkflowContext()`
`int` `getWorkflowId()`
`boolean` `isCompleted()` Determines whether the Step is completed; if not, it is by definition awaiting action by the owner or in process.
`boolean` `isStarted()` Determines whether the Step has started.
`void` `setOutcome​(Outcome outcome)` Sets the current Outcome for the step.
`void` `setWorkflow​(int workflowId, java.util.Map<java.lang.String,​java.io.Serializable> workflowContext)` method that sets the parent Workflow id and context post-construction.
`void` `start()` Starts the Step, and sets the start time to the moment when this method is first invoked.

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Constructor Detail

#### AbstractStep

    protected AbstractStep​(java.lang.String messageKey)

Protected constructor that creates a new Step with a specified message key. After construction, the method `setWorkflow(int, Map)` should be called.

Parameters:
  `messageKey` - the Step's message key, such as `decision.editPageApproval`. By convention, the message prefix should be a lower-case version of the Step's type, plus a period (e.g., `task.` and `decision.`).

#### AbstractStep

    public AbstractStep​(int workflowId,
                        java.util.Map<java.lang.String,​java.io.Serializable> workflowContext,
                        java.lang.String messageKey)

Constructs a new Step belonging to a specified Workflow and having a specified message key.

Parameters:
  `workflowId` - the parent workflow id to set
  `workflowContext` - the parent workflow context to set
  `messageKey` - the Step's message key, such as `decision.editPageApproval`. By convention, the message prefix should be a lower-case version of the Step's type, plus a period (e.g., `task.` and `decision.`).

### Method Detail

#### addSuccessor

    public final void addSuccessor​(Outcome outcome,
                                   Step step)

Adds a successor Step to this one, which will be triggered by a supplied Outcome. Implementations should respect the order in which Outcomes are added; `Step.getAvailableOutcomes()` should return them in the same order they were added.

Specified by:
  `addSuccessor` in interface `Step`
Parameters:
  `outcome` - the Outcome triggering a particular successor Step
  `step` - the Step to associated with this Outcomes (`null` denotes no Steps)

#### getAvailableOutcomes

    public final java.util.Collection<Outcome> getAvailableOutcomes()

Returns a Collection of available outcomes, such as "approve", "deny" or "reassign", in the order in which they were added via `Step.addSuccessor(Outcome, Step)`. Concrete implementations should always return a defensive copy of the outcomes, not the original backing collection.

Specified by:
  `getAvailableOutcomes` in interface `Step`
Returns:
  the set of outcomes

#### getErrors

    public final java.util.List<java.lang.String> getErrors()

Returns a List of error strings generated by this Step. If this Step generated no errors, this method returns a zero-length array.

Specified by:
  `getErrors` in interface `Step`
Returns:
  the errors

#### execute

    public abstract Outcome execute​(Context ctx)
                             throws WikiException

Executes the processing for this Step and returns an Outcome indicating if it succeeded (`Outcome.STEP_COMPLETE` or `Outcome.STEP_ABORT`). Processing instructions can do just about anything, such as executing custom business logic or changing the Step's final outcome via `Step.setOutcome(Outcome)`. A return value of `STEP_COMPLETE` indicates that the instructions executed completely, without errors; `STEP_ABORT` indicates that the Step and its parent Workflow should be aborted (that is, fail silently without error). If the execution step encounters any errors, it should throw a WikiException or a subclass.

Note that successful execution of this methods does not necessarily mean that the Step is considered "complete"; rather, it just means that it has executed. Therefore, it is possible that `execute` could run multiple times.

Specified by:
  `execute` in interface `Step`
Parameters:
  `ctx` - executing wiki context.
Returns:
  the result of the Step, expressed as an Outcome
Throws:
  `WikiException` - if the step encounters errors while executing

#### getActor

    public abstract java.security.Principal getActor()

The Principal responsible for completing this Step, such as a system user or actor assigned to a Decision.

Specified by:
  `getActor` in interface `Step`
Returns:
  the responsible Principal

#### getEndTime

    public final java.util.Date getEndTime()

The end time for this Step. This value should be set when the step completes. Returns `Step.TIME_NOT_SET` if not completed yet.

Specified by:
  `getEndTime` in interface `Step`
Returns:
  the end time

#### getMessageKey

    public final java.lang.String getMessageKey()

Message key for human-friendly name of this Step, including any parameter substitutions. By convention, the message prefix should be a lower-case version of the Step's type, plus a period (e.g., `task.` and `decision.`).

Specified by:
  `getMessageKey` in interface `Step`
Returns:
  the message key for this Step.

#### getOutcome

    public final Outcome getOutcome()

Returns the Outcome of this Step's processing; by default, `Outcome.STEP_CONTINUE`.

Specified by:
  `getOutcome` in interface `Step`
Returns:
  the outcome

#### getStartTime

    public final java.util.Date getStartTime()

The start time for this Step. Returns `Step.TIME_NOT_SET` if not started yet.

Specified by:
  `getStartTime` in interface `Step`
Returns:
  the start time

#### isCompleted

    public final boolean isCompleted()

Determines whether the Step is completed; if not, it is by definition awaiting action by the owner or in process. If a Step has completed, it must also return a non-`null` result for `Step.getOutcome()`.

Specified by:
  `isCompleted` in interface `Step`
Returns:
  `true` if the Step has completed; `false` if not.

#### isStarted

    public final boolean isStarted()

Determines whether the Step has started.

Specified by:
  `isStarted` in interface `Step`
Returns:
  `true` if the Step has started; `false` if not.

#### setOutcome

    public final void setOutcome​(Outcome outcome)

Sets the current Outcome for the step. If the Outcome is a "completion" Outcome, it should also sets the completion time and mark the Step as complete. Once a Step has been marked complete, this method cannot be called again. If the supplied Outcome is not in the set returned by `Step.getAvailableOutcomes()`, or is not `Outcome.STEP_CONTINUE` or `Outcome.STEP_ABORT`, this method returns an IllegalArgumentException. If the caller attempts to set an Outcome and the Step has already completed, this method throws an IllegalStateException.

Specified by:
  `setOutcome` in interface `Step`
Parameters:
  `outcome` - whether the step should be considered completed

#### start

    public final void start()
                     throws WikiException

Starts the Step, and sets the start time to the moment when this method is first invoked. If this Step has already been started, this method throws an IllegalStateException. If the Step cannot be started because the underlying implementation encounters an error, it the implementation should throw a WikiException.

Specified by:
  `start` in interface `Step`
Throws:
  `WikiException` - if the step encounters errors while starting

#### getSuccessor

    public final Step getSuccessor​(Outcome outcome)

Identifies the next Step for a particular Outcome; if there is no next Step for this Outcome, this method returns `null`.

Specified by:
  `getSuccessor` in interface `Step`
Parameters:
  `outcome` - the outcome
Returns:
  the next step

#### setWorkflow

    public final void setWorkflow​(int workflowId,
                                  java.util.Map<java.lang.String,​java.io.Serializable> workflowContext)

method that sets the parent Workflow id and context post-construction.

Specified by:
  `setWorkflow` in interface `Step`
Parameters:
  `workflowId` - the parent workflow id to set
  `workflowContext` - the parent workflow context to set

#### getWorkflowId

    public int getWorkflowId()

#### getWorkflowContext

    public java.util.Map<java.lang.String,​java.io.Serializable> getWorkflowContext()

#### addError

    protected final void addError​(java.lang.String message)

Protected helper method that adds a String representing an error message to the Step's cached errors list.

Parameters:
  `message` - the error message