[ 
https://issues.apache.org/jira/browse/SCXML-197?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Ate Douma updated SCXML-197:
----------------------------

    Description: 
For the execution of a SCXML instance, several external services are used and 
needed as well as management of intermediate state and external Invoker 
instances.
Currently these are spread out between the SCXMLExecutor and SCInstance (both 
marked as Serializable...) making it confusing and even incorrect how these are 
managed.

The SCInstance keeps a map of current Invoker instances, while the semantics 
for these Invokers are necessarily asynchronous and running in their own thread.
This makes them unqualified to be serialized together with the SCInstance. I'll 
move these to a new SCXMLExecutionContext instead.

The SCXMLExecutionContext will encapsulate all non-persistable SCXML state, the 
internal event queue and all external services like the ErrorReporter, the 
(external) EventDispatcher
and the NotificationRegistry (see below).

The SCInstance currently holds the NotificationRegistry, which maintains a map 
of external SCXMListeners, which likewise should not be serialized together 
with the SCInstance.

And the SCInstance hold a public reference to the SCXMLExecutor, which is used 
for the callback handling from Invokers, but if the SCInstance and/or 
SCXMLExecutor would be serialized, there is nothing to 'talk back' to.
It will require some changes in the handling and communication with the 
Invokers, but once done then the SCInstance also no longer need to reference 
the SCXMLExecutor.
For the SCXMLExecutor I will introduce an external event queue, which can be 
access concurrently, and the Invokers can and only need access to the 
SCXMLExecutor for adding events to this queue. The SCXMLExecutor thus will 
provide all the 'external' APIs, the SCXMLExecutionContext all the 'internal' 
APIs.

The intend is to make the SCXMLExecutor and the SCXMLExecutionContext 
non-serializable and instead move the current Status and SCXML model object to 
the SCInstance instance,
which then properly and completely will encapsulate all 'persistable' SCXML 
instance state, and can be 'detached' and 're-attached' from the SCXMLExecutor 
to be persisted or serialized.

The SCXMLExecutionContext then will be used as single 'context' parameter for 
the SCMLSemantics provided algorithms, besides the current processing 'step' 
state, which will makes the current API a lot cleaner and the new Algorithm 
inplementations (SCXML-196) a lot easier. 

For the execution of Actions (SCXML executable content), I'll also introduce a 
new ActionExecutionContext, on top of the SCXMLExecutionContext, which expose 
only a subset of the SCXMLExecutionContext as only needed by the Action 
execution, thereby reducing the exposure of the internal API and state 
management.

These changes will have a big impact on the current APIs, but the advantage is 
that further and future changes will be much easier to do, and with a lot less 
impact than this one time upfront big change now.
All the internal APIs have to change anyway, no matter what, to be able to 
support and implement the current SCXML specification requirements.

Because both the internal events and external events will now properly be 
managed through separate queues, it now also becomes easy to implement the 
'single event step' sequential processing, as required by the specification, 
including asynchronous handling (receiving) of external events.
To a large extend this thus also will solve SCXML-112.

The result of all this is a SCXMLExecutor which only will need and have 3 
(primary) instance variables: a SCXMLSemantics, SCInstance and 
SCXMLExecutionContext,
and with a clean separation of concern between them.

This will then complete a major step for Milestone 0 of the 
[Roadmap|http://commons.apache.org/proper/commons-scxml/roadmap.html] towards 
Commons SCXML 2.0.

  was:
For the execution of a SCXML instance, several external services are used and 
needed as well as management of intermediate state and external Invoker 
instances.
Currently these are spread out between the SCXMLExecutor and SCInstance (both 
marked as Serializable...) making it confusing and even incorrect how these are 
managed.

The SCInstance keeps a map of current Invoker instances, while the semantics 
for these Invokers are necessarily asynchronous and running in their own thread.
This makes them unqualified to be serialized together with the SCInstance. I'll 
move these to a new SCXMLExecutionContext instead.

The SCXMLExecutionContext will encapsulate all non-persistable SCXML state, the 
internal event queue and all external services like the ErrorReporter, the 
(external) EventDispatcher
and the NotificationRegistry (see below).

The SCInstance currently holds the NotificationRegistry, which maintains a map 
of external SCXMListeners, which likewise should not be serialized together 
with the SCInstance.

And the SCInstance hold a public reference to the SCXMLExecutor, which is used 
for the callback handling from Invokers, but if the SCInstance and/or 
SCXMLExecutor would be serialized, there is nothing to 'talk back' to.
It will require some changes in the handling and communication with the 
Invokers, but once done then the SCInstance also no longer need to reference 
the SCXMLExecutor.
For the SCXMLExecutor I will introduce an external event queue, which can be 
access concurrently, and the Invokers can and only need access to the 
SCXMLExecutor for adding events
to this queue. The SCXMLExecutor thus will provide all the 'external' APIs, the 
SCXMLExecutionContext all the 'internal' APIs.

The intend is to make the SCXMLExecutor and the SCXMLExecutionContext 
non-serializable and instead move the current Status and SCXML model object to 
the SCInstance instance,
which then properly and completely will encapsulate all 'persistable' SCXML 
instance state, and can be 'detached' and 're-attached' from the SCXMLExecutor 
to be persisted or serialized.

The SCXMLExecutionContext then will be used as single 'context' parameter for 
the SCMLSemantics provided algorithms, besides the current processing 'step' 
state, which will makes the current API a lot cleaner and the new Algorithm 
inplementations (SCXML-196) a lot easier. 

For the execution of Actions (SCXML executable content), I'll also introduce a 
new ActionExecutionContext, on top of the SCXMLExecutionContext, which expose 
only a subset of the SCXMLExecutionContext as only needed by the Action 
execution, thereby reducing the exposure of the internal API and state 
management.

These changes will have a big impact on the current APIs, but the advantage is 
that further and future changes will be much easier to do, and with a lot less 
impact than this one time upfront big change now.
All the internal APIs have to change anyway, no matter what, to be able to 
support and implement the current SCXML specification requirements.

Because both the internal events and external events will now properly be 
managed through separate queues, it now also becomes easy to implement the 
'single event step' sequential processing, as required by the specification, 
including asynchronous handling (receiving) of external events.
To a large extend this thus also will solve SCXML-112.

The result of all this is a SCXMLExecutor which only will need and have 3 
(primary) instance variables: a SCXMLSemantics, SCInstance and 
SCXMLExecutionContext,
and with a clean separation of concern between them.

This will then complete a major step for Milestone 0 of the 
[Roadmap|http://commons.apache.org/proper/commons-scxml/roadmap.html] towards 
Commons SCXML 2.0.


> Better separation of concern between SCXMLExecutor and SCInstance and 
> introducing a new SCXMLExecutionContext
> -------------------------------------------------------------------------------------------------------------
>
>                 Key: SCXML-197
>                 URL: https://issues.apache.org/jira/browse/SCXML-197
>             Project: Commons SCXML
>          Issue Type: New Feature
>    Affects Versions: 2.0
>            Reporter: Ate Douma
>            Assignee: Ate Douma
>             Fix For: 2.0
>
>
> For the execution of a SCXML instance, several external services are used and 
> needed as well as management of intermediate state and external Invoker 
> instances.
> Currently these are spread out between the SCXMLExecutor and SCInstance (both 
> marked as Serializable...) making it confusing and even incorrect how these 
> are managed.
> The SCInstance keeps a map of current Invoker instances, while the semantics 
> for these Invokers are necessarily asynchronous and running in their own 
> thread.
> This makes them unqualified to be serialized together with the SCInstance. 
> I'll move these to a new SCXMLExecutionContext instead.
> The SCXMLExecutionContext will encapsulate all non-persistable SCXML state, 
> the internal event queue and all external services like the ErrorReporter, 
> the (external) EventDispatcher
> and the NotificationRegistry (see below).
> The SCInstance currently holds the NotificationRegistry, which maintains a 
> map of external SCXMListeners, which likewise should not be serialized 
> together with the SCInstance.
> And the SCInstance hold a public reference to the SCXMLExecutor, which is 
> used for the callback handling from Invokers, but if the SCInstance and/or 
> SCXMLExecutor would be serialized, there is nothing to 'talk back' to.
> It will require some changes in the handling and communication with the 
> Invokers, but once done then the SCInstance also no longer need to reference 
> the SCXMLExecutor.
> For the SCXMLExecutor I will introduce an external event queue, which can be 
> access concurrently, and the Invokers can and only need access to the 
> SCXMLExecutor for adding events to this queue. The SCXMLExecutor thus will 
> provide all the 'external' APIs, the SCXMLExecutionContext all the 'internal' 
> APIs.
> The intend is to make the SCXMLExecutor and the SCXMLExecutionContext 
> non-serializable and instead move the current Status and SCXML model object 
> to the SCInstance instance,
> which then properly and completely will encapsulate all 'persistable' SCXML 
> instance state, and can be 'detached' and 're-attached' from the 
> SCXMLExecutor to be persisted or serialized.
> The SCXMLExecutionContext then will be used as single 'context' parameter for 
> the SCMLSemantics provided algorithms, besides the current processing 'step' 
> state, which will makes the current API a lot cleaner and the new Algorithm 
> inplementations (SCXML-196) a lot easier. 
> For the execution of Actions (SCXML executable content), I'll also introduce 
> a new ActionExecutionContext, on top of the SCXMLExecutionContext, which 
> expose only a subset of the SCXMLExecutionContext as only needed by the 
> Action execution, thereby reducing the exposure of the internal API and state 
> management.
> These changes will have a big impact on the current APIs, but the advantage 
> is that further and future changes will be much easier to do, and with a lot 
> less impact than this one time upfront big change now.
> All the internal APIs have to change anyway, no matter what, to be able to 
> support and implement the current SCXML specification requirements.
> Because both the internal events and external events will now properly be 
> managed through separate queues, it now also becomes easy to implement the 
> 'single event step' sequential processing, as required by the specification, 
> including asynchronous handling (receiving) of external events.
> To a large extend this thus also will solve SCXML-112.
> The result of all this is a SCXMLExecutor which only will need and have 3 
> (primary) instance variables: a SCXMLSemantics, SCInstance and 
> SCXMLExecutionContext,
> and with a clean separation of concern between them.
> This will then complete a major step for Milestone 0 of the 
> [Roadmap|http://commons.apache.org/proper/commons-scxml/roadmap.html] towards 
> Commons SCXML 2.0.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to