Decision doesn't need to know about WorkflowManager
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/workflow/Decision.java b/jspwiki-main/src/main/java/org/apache/wiki/workflow/Decision.java
index 003be8d..dbbabed 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/workflow/Decision.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/workflow/Decision.java
@@ -18,42 +18,36 @@
*/
package org.apache.wiki.workflow;
+import org.apache.wiki.api.exceptions.WikiException;
+import org.apache.wiki.event.WorkflowEvent;
+
import java.security.Principal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import org.apache.wiki.api.exceptions.WikiException;
/**
* <p>
- * AbstractStep subclass that asks an actor Principal to choose an Outcome on
- * behalf of an owner (also a Principal). The actor "makes the decision" by
- * calling the {@link #decide(Outcome)} method. When this method is called, it
- * will set the Decision's Outcome to the one supplied. If the parent Workflow
- * is in the {@link Workflow#WAITING} state, it will be re-started. Any checked
- * WikiExceptions thrown by the workflow after re-start will be re-thrown to
- * callers.
+ * AbstractStep subclass that asks an actor Principal to choose an Outcome on behalf of an owner (also a Principal). The actor
+ * "makes the decision" by calling the {@link #decide(Outcome)} method. When this method is called, it will set the Decision's Outcome to
+ * the one supplied. If the parent Workflow is in the {@link Workflow#WAITING} state, it will be re-started. Any checked WikiExceptions
+ * thrown by the workflow after re-start will be re-thrown to callers.
* </p>
* <p>
- * When a Decision completes, its {@link #isCompleted()} method returns
- * <code>true</code>. It also tells its parent WorkflowManager to remove it
- * from the list of pending tasks by calling
- * {@link DecisionQueue#remove(Decision)}.
+ * When a Decision completes, its {@link #isCompleted()} method returns <code>true</code>. It also tells its parent WorkflowManager to
+ * remove it from the list of pending tasks by calling {@link DecisionQueue#remove(Decision)}.
* </p>
* <p>
- * To enable actors to choose an appropriate Outcome, Decisions can store
- * arbitrary key-value pairs called "facts." These facts can be presented by the
- * user interface to show details the actor needs to know about. Facts are added
- * by calling classes to the Decision, in order of expected presentation, by the
- * {@link #addFact(Fact)} method. They can be retrieved, in order, via
- * {@link #getFacts()}.
+ * To enable actors to choose an appropriate Outcome, Decisions can store arbitrary key-value pairs called "facts." These facts can be
+ * presented by the user interface to show details the actor needs to know about. Facts are added by calling classes to the Decision,
+ * in order of expected presentation, by the {@link #addFact(Fact)} method. They can be retrieved, in order, via {@link #getFacts()}.
* </p>
*
* @since 2.5
*/
-public abstract class Decision extends AbstractStep
-{
+public abstract class Decision extends AbstractStep {
+
private static final long serialVersionUID = -6835601038263238062L;
private Principal m_actor;
@@ -65,24 +59,18 @@
private final List<Fact> m_facts;
/**
- * Constructs a new Decision for a required "actor" Principal, having a
- * default Outcome.
- *
+ * Constructs a new Decision for a required "actor" Principal, having a default Outcome.
+ *
* @param workflow the parent Workflow object
- * @param messageKey the i18n message key that represents the message the
- * actor will see
- * @param actor the Principal (<em>e.g.</em>, a WikiPrincipal, Role,
- * GroupPrincipal) who is required to select an appropriate
- * Outcome
- * @param defaultOutcome the Outcome that the user interface will recommend
- * as the default choice
+ * @param messageKey the i18n message key that represents the message the actor will see
+ * @param actor the Principal (<em>e.g.</em>, a WikiPrincipal, Role, GroupPrincipal) who is required to select an appropriate Outcome
+ * @param defaultOutcome the Outcome that the user interface will recommend as the default choice
*/
- public Decision( Workflow workflow, String messageKey, Principal actor, Outcome defaultOutcome )
- {
+ public Decision( final Workflow workflow, final String messageKey, final Principal actor, final Outcome defaultOutcome ) {
super( workflow, messageKey );
m_actor = actor;
m_defaultOutcome = defaultOutcome;
- m_facts = new ArrayList<Fact>();
+ m_facts = new ArrayList<>();
addSuccessor( defaultOutcome, null );
}
@@ -91,7 +79,7 @@
*
* @param fact the new fact to add
*/
- public final void addFact( Fact fact )
+ public final void addFact( final Fact fact )
{
m_facts.add( fact );
}
@@ -112,50 +100,35 @@
* </p>
*
* @param outcome the Outcome of the Decision
- * @throws WikiException if the act of restarting the Workflow throws an
- * exception
+ * @throws WikiException if the act of restarting the Workflow throws an exception
*/
- public void decide( Outcome outcome ) throws WikiException
- {
+ public void decide( final Outcome outcome ) throws WikiException {
super.setOutcome( outcome );
- // If current workflow is waiting for input, restart it and remove
- // Decision from DecisionQueue
- Workflow w = getWorkflow();
- if( w.getCurrentState() == Workflow.WAITING && this.equals( w.getCurrentStep() ) )
- {
- WorkflowManager wm = w.getWorkflowManager();
- if( wm != null )
- {
- wm.getDecisionQueue().remove( this );
- }
+ // If current workflow is waiting for input, restart it and remove Decision from DecisionQueue
+ final Workflow w = getWorkflow();
+ if( w.getCurrentState() == Workflow.WAITING && this.equals( w.getCurrentStep() ) ) {
+ WorkflowEventEmitter.fireEvent( this, WorkflowEvent.DQ_REMOVAL );
// Restart workflow
w.restart();
}
}
/**
- * Default implementation that always returns {@link Outcome#STEP_CONTINUE}
- * if the current Outcome isn't a completion (which will be true if the
- * {@link #decide(Outcome)} method hasn't been executed yet. This method
- * will also add the Decision to the associated DecisionQueue.
+ * Default implementation that always returns {@link Outcome#STEP_CONTINUE} if the current Outcome isn't a completion (which will be
+ * true if the {@link #decide(Outcome)} method hasn't been executed yet. This method will also add the Decision to the associated
+ * DecisionQueue.
*
* @return the Outcome of the execution
* @throws WikiException never
*/
- public Outcome execute() throws WikiException
- {
- if( getOutcome().isCompletion() )
- {
+ public Outcome execute() throws WikiException {
+ if( getOutcome().isCompletion() ) {
return getOutcome();
}
// Put decision in the DecisionQueue
- WorkflowManager wm = getWorkflow().getWorkflowManager();
- if( wm != null )
- {
- wm.getDecisionQueue().add( this );
- }
+ WorkflowEventEmitter.fireEvent( this, WorkflowEvent.DQ_ADDITION );
// Indicate we are waiting for user input
return Outcome.STEP_CONTINUE;
@@ -164,72 +137,58 @@
/**
* {@inheritDoc}
*/
- public final Principal getActor()
- {
+ public final Principal getActor() {
return m_actor;
}
/**
- * Returns the default or suggested outcome, which must be one of those
- * returned by {@link #getAvailableOutcomes()}. This method is guaranteed
- * to return a non-<code>null</code> Outcome.
+ * Returns the default or suggested outcome, which must be one of those returned by {@link #getAvailableOutcomes()}. This method is
+ * guaranteed to return a non-<code>null</code> Outcome.
*
* @return the default outcome.
*/
- public Outcome getDefaultOutcome()
- {
+ public Outcome getDefaultOutcome() {
return m_defaultOutcome;
}
/**
- * Returns the Facts associated with this Decision, in the order in which
- * they were added.
+ * Returns the Facts associated with this Decision, in the order in which they were added.
*
* @return the list of Facts
*/
- public final List< Fact > getFacts()
- {
+ public final List< Fact > getFacts() {
return Collections.unmodifiableList( m_facts );
}
/**
- * Returns the unique identifier for this Decision. Normally, this ID is
- * programmatically assigned when the Decision is added to the
+ * Returns the unique identifier for this Decision. Normally, this ID is programmatically assigned when the Decision is added to the
* DecisionQueue.
*
* @return the identifier
*/
- public final int getId()
- {
+ public final int getId() {
return m_id;
}
/**
- * Returns <code>true</code> if the Decision can be reassigned to another
- * actor. This implementation always returns <code>true</code>.
- *
+ * Returns <code>true</code> if the Decision can be reassigned to another actor. This implementation always returns <code>true</code>.
+ *
* @return the result
*/
- public boolean isReassignable()
- {
+ public boolean isReassignable() {
return true;
}
/**
- * Reassigns the Decision to a new actor (that is, provide an outcome). If
- * the Decision is not reassignable, this method throws an
+ * Reassigns the Decision to a new actor (that is, provide an outcome). If the Decision is not reassignable, this method throws an
* IllegalArgumentException.
*
* @param actor the actor to reassign the Decision to
*/
- public final synchronized void reassign( Principal actor )
- {
- if( isReassignable() )
- {
+ public final synchronized void reassign( final Principal actor ) {
+ if( isReassignable() ) {
m_actor = actor;
- }
- else
- {
+ } else {
throw new IllegalArgumentException( "Decision cannot be reassigned." );
}
}
@@ -239,8 +198,8 @@
*
* @param id the identifier
*/
- public final void setId( int id )
- {
+ public final void setId( final int id ) {
m_id = id;
}
+
}