This is an automated email from the ASF dual-hosted git repository. juanpablo pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/jspwiki.git
commit 38356ab39c413d6d4171088c89108fea8524652a Author: juanpablo <[email protected]> AuthorDate: Sat Apr 11 18:09:56 2020 +0200 Workflow doesn't need to know about WorkflowManager + use ConcurrentHashMap for attributes to avoid synchronized in its related methods --- .../java/org/apache/wiki/workflow/Workflow.java | 95 ++++------------------ 1 file changed, 15 insertions(+), 80 deletions(-) diff --git a/jspwiki-main/src/main/java/org/apache/wiki/workflow/Workflow.java b/jspwiki-main/src/main/java/org/apache/wiki/workflow/Workflow.java index 2cdda87..63d2ca2 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/workflow/Workflow.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/workflow/Workflow.java @@ -19,8 +19,6 @@ package org.apache.wiki.workflow; import org.apache.wiki.api.exceptions.WikiException; -import org.apache.wiki.event.WikiEventListener; -import org.apache.wiki.event.WikiEventManager; import org.apache.wiki.event.WorkflowEvent; import java.io.Serializable; @@ -28,10 +26,11 @@ import java.security.Principal; import java.util.ArrayList; import java.util.Collections; import java.util.Date; -import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * <p> @@ -186,7 +185,7 @@ public class Workflow implements Serializable { /** State value: Workflow instantiated, but not started. */ public static final int CREATED = -2; - /** Lazily-initialized attribute map. */ + /** attribute map. */ private Map< String, Object > m_attributes; /** The initial Step for this Workflow. */ @@ -209,8 +208,6 @@ public class Workflow implements Serializable { private Step m_currentStep; - private WorkflowManager m_manager; - /** * Constructs a new Workflow object with a supplied message key, owner Principal, and undefined unique identifier {@link #ID_NOT_SET}. * Once instantiated the Workflow is considered to be in the {@link #CREATED} state; a caller must explicitly invoke the @@ -220,12 +217,11 @@ public class Workflow implements Serializable { * @param owner the Principal who owns the Workflow. Typically, this is the user who created and submitted it */ public Workflow( final String messageKey, final Principal owner ) { - m_attributes = null; + m_attributes = new ConcurrentHashMap<>(); m_currentStep = null; m_history = new LinkedList<>(); m_id = ID_NOT_SET; m_key = messageKey; - m_manager = null; m_messageArgs = new ArrayList<>(); m_owner = owner; m_started = false; @@ -249,15 +245,14 @@ public class Workflow implements Serializable { } if( m_currentStep != null ) { - if( m_manager != null && m_currentStep instanceof Decision ) { - final Decision d = ( Decision )m_currentStep; - m_manager.getDecisionQueue().remove( d ); + if( m_currentStep instanceof Decision ) { + WorkflowEventEmitter.fireEvent( ( Decision )m_currentStep, WorkflowEvent.DQ_REMOVAL ); } m_currentStep.setOutcome( Outcome.STEP_ABORT ); m_history.addLast( m_currentStep ); } m_state = ABORTED; - fireEvent( WorkflowEvent.ABORTED ); + WorkflowEventEmitter.fireEvent( this, WorkflowEvent.ABORTED ); cleanup(); } @@ -316,10 +311,7 @@ public class Workflow implements Serializable { * @param attr the name of the attribute * @return the value */ - public final synchronized Object getAttribute( final String attr ) { - if( m_attributes == null ) { - return null; - } + public final Object getAttribute( final String attr ) { return m_attributes.get( attr ); } @@ -409,16 +401,6 @@ public class Workflow implements Serializable { } /** - * Returns the WorkflowManager that contains this Workflow. - * - * @return the workflow manager - */ - public final synchronized WorkflowManager getWorkflowManager() - { - return m_manager; - } - - /** * Returns a Step history for this Workflow as a List, chronologically, from the first Step to the currently executing one. The first * step is the first item in the array. If the Workflow has not started, this method returns a zero-length array. * @@ -483,7 +465,7 @@ public class Workflow implements Serializable { throw new IllegalStateException( "Workflow is not paused; cannot restart." ); } m_state = RUNNING; - fireEvent( WorkflowEvent.RUNNING ); + WorkflowEventEmitter.fireEvent( this, WorkflowEvent.RUNNING ); // Process current step try { @@ -502,10 +484,7 @@ public class Workflow implements Serializable { * @param attr the attribute name * @param obj the value */ - public final synchronized void setAttribute( final String attr, final Object obj ) { - if( m_attributes == null ) { - m_attributes = new HashMap<>(); - } + public final void setAttribute( final String attr, final Object obj ) { m_attributes.put( attr, obj ); } @@ -533,16 +512,6 @@ public class Workflow implements Serializable { } /** - * Sets the WorkflowManager that contains this Workflow. - * - * @param manager the workflow manager - */ - public final synchronized void setWorkflowManager( final WorkflowManager manager ) { - m_manager = manager; - addWikiEventListener( manager ); - } - - /** * Starts the Workflow and sets the state to {@link #RUNNING}. If the Workflow has already been started (or previously aborted), this * method returns an {@linkplain IllegalStateException}. If any of the Steps in this Workflow throw a WikiException, the Workflow will * abort and propagate the exception to callers. @@ -558,7 +527,7 @@ public class Workflow implements Serializable { } m_started = true; m_state = RUNNING; - fireEvent( WorkflowEvent.RUNNING ); + WorkflowEventEmitter.fireEvent( this, WorkflowEvent.RUNNING ); // Mark the first step as the current one & add to history m_currentStep = m_firstStep; @@ -582,15 +551,13 @@ public class Workflow implements Serializable { throw new IllegalStateException( "Workflow is not running; cannot pause." ); } m_state = WAITING; - fireEvent( WorkflowEvent.WAITING ); + WorkflowEventEmitter.fireEvent( this, WorkflowEvent.WAITING ); } /** - * Clears the attribute map and sets the current step field to - * <code>null</code>. + * Clears the attribute map and sets the current step field to <code>null</code>. */ - protected void cleanup() - { + protected void cleanup() { m_currentStep = null; m_attributes = null; } @@ -602,7 +569,7 @@ public class Workflow implements Serializable { protected final synchronized void complete() { if( !isCompleted() ) { m_state = COMPLETED; - fireEvent( WorkflowEvent.COMPLETED ); + WorkflowEventEmitter.fireEvent( this, WorkflowEvent.COMPLETED ); cleanup(); } } @@ -661,36 +628,4 @@ public class Workflow implements Serializable { } - // events processing ....................................................... - - /** - * Registers a WikiEventListener with this instance. This is a convenience method. - * - * @param listener the event listener - */ - public final synchronized void addWikiEventListener( final WikiEventListener listener ) { - WikiEventManager.addWikiEventListener( this, listener ); - } - - /** - * Un-registers a WikiEventListener with this instance. This is a convenience method. - * - * @param listener the event listener - */ - public final synchronized void removeWikiEventListener( final WikiEventListener listener ) { - WikiEventManager.removeWikiEventListener( this, listener ); - } - - /** - * Fires a WorkflowEvent of the provided type to all registered listeners. - * - * @see org.apache.wiki.event.WorkflowEvent - * @param type the event type to be fired - */ - protected final void fireEvent( final int type ) { - if ( WikiEventManager.isListening( this ) ) { - WikiEventManager.fireEvent( this, new WorkflowEvent( this, type ) ); - } - } - }
