| <!-- |
| Copyright 2006 The Apache Software Foundation |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| $Id$ |
| |
| COMMONS SCXML |
| STATELESS_MODEL BRANCH |
| |
| -- PURPOSE -- |
| |
| To decouple the execution context for the Commons SCXML Java object model. |
| |
| -- STATUS -- |
| |
| This branch is CLOSED. The work done in this branch was merged with trunk |
| in r375053. See Bugzilla issue 38311 for details. |
| [ http://issues.apache.org/bugzilla/show_bug.cgi?id=38311 ] |
| |
| -- DETAILS -- |
| |
| A clean summary of the issue this branch attempts to work on was posted |
| by Tim O'Brien to the commons-dev mailing list. |
| |
| <TIM-QUOTE> |
| |
| 2. Decouple Execution Context from the SCXML Model |
| |
| Right now, the Context passed into the class that parses the XML and |
| creates the SCXML object is the global execution context. You pass in |
| a JexlContext when you are parsing the SCXML model, it is assigned to |
| all of the State objects. |
| |
| So, bear with me, assume I have a SCXML document that represents the |
| valid states of a stopwatch (ready, running, paused, stopped). The |
| SCXML models the watch in a way similar to the microwave sample in the |
| Working Draft, it uses a reference to a "timer" variable. To do this |
| with the current implementation of SCXML, I would need to do the |
| following twice (assuming a JexlContext): |
| |
| a. Create a JexlContext |
| b. Populate the JexlContext with the appropriate variables |
| c. Call SCXMLDigester passing in the JexlEvaluator and the JexlContext |
| I want to execute this state machine with |
| d. Create an instance of SCXMLExecutor, pass it the SCXML from step c. |
| |
| For each watch I need to model in this application, the implementation |
| forces me to parse that SCXML document with Digester every time I want |
| to model a separate StopWatch. In the application I'm interested in |
| using this in, hundreds of documents in a content management system are |
| going to be modeled as individual state machines, I would hate to have |
| to parse an SCXML file for each individual document. |
| |
| * Alternative: Provide a mechanism that allows you to clone an SCXML |
| instance so that you can create a separate SCXMLExecutor that can model |
| the same statemachine with an isolated Context. |
| |
| * Better Alternative: States do not "have" a context. Take the context |
| property off of the State and change executeActionList in |
| SCXMLSemanticsImpl to get the Context from the Executor. Likewise, |
| Transitions do not have a "notificationRegistry", take that property off |
| of a transition and just have the SCXMLSemanticsImpl get the |
| notificationRegistry from the Executor. |
| |
| I don't think this is a terribly difficult idea, and decoupling the |
| description of the FSM from the execution state, would also make it much |
| easier to persist either one. |
| |
| </TIM-QUOTE> |
| |
| -- CHOSEN APPROACH -- |
| |
| We always go for the best approach around here, so we will go for the |
| "Better Alternative" listed in the details section. |
| |