[
https://issues.apache.org/jira/browse/SCXML-47?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12507958
]
Michael Heuer commented on SCXML-47:
------------------------------------
I have discovered a problem with StateMachineSupport as designed, due to its
static reference to stateMachine.
The following test case will fail:
public void testMoreThanOneScxmlDocument() throws Exception {
URL fooScxmlDocument = getClass().getResource("foo.xml");
URL barScxmlDocument = getClass().getResource("bar.xml");
Foo foo = new Foo(fooScxmlDocument);
Bar bar = new Bar(barScxmlDocument);
assertTrue(fooCalled);
// bar's initialstate "bar" never called, since bar's
StateMachineSupport has
// static reference to stateMachine for foo.xml
assertTrue(barCalled);
}
private class Foo {
private StateMachineSupport delegate;
public Foo(final URL scxmlDocument) {
delegate = new StateMachineSupport(this, scxmlDocument);
}
public void foo() {
fooCalled = true;
}
}
private class Bar {
private StateMachineSupport delegate;
public Bar(final URL scxmlDocument) {
delegate = new StateMachineSupport(this, scxmlDocument);
}
public void bar() {
barCalled = true;
}
}
with simple SCXML files
foo.xml:
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" initialstate="foo">
<state id="foo"/>
</scxml>
bar.xml:
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" initialstate="bar">
<state id="bar"/>
</scxml>
java.lang.NoSuchMethodException:
org.apache.commons.scxml.env.StateMachineSupportTest$Bar.foo()
at java.lang.Class.getDeclaredMethod(Class.java:1937)
at
org.apache.commons.scxml.env.StateMachineSupport.invoke(StateMachineSupport.java:249)
I believe the way to make this work is to have StateMachineSupport accept a
reference to an instance of SCXML in its constructor or otherwise and to not
reuse StateMachineSupport in AbstractStateMachine.
Sorry for not providing better unit tests in the first place.
> Provide a state machine support class to allow for delegation.
> --------------------------------------------------------------
>
> Key: SCXML-47
> URL: https://issues.apache.org/jira/browse/SCXML-47
> Project: Commons SCXML
> Issue Type: Improvement
> Affects Versions: 0.6
> Reporter: Michael Heuer
> Priority: Minor
> Fix For: 0.7
>
> Attachments: additional-tests.tar.gz, state-machine-support-src.tar.gz
>
>
> This is not completely thought out yet, but if folks like the idea I might
> persue it further.
> I would like to use AbstractStateMachine but cannot extend from it:
> class B extends A /*, AbstractStateMachine */ {
> // copy source from AbstractStateMachine here
> }
> I propose here a StateMachineSupport class that provides for use by
> subclassing and for use by delegation. The constructors are a little messy,
> but in the end I have
> public class StateMachineSupport {
> // use by subclassing
> protected StateMachineSupport(...) {
> }
> // use by delegation
> public StateMachineSupport(Object delegator, ...) {
> }
> // ... methods from AbstractStateMachine
> }
> public abstract class AbstractStateMachine extends StateMachineSupport {
> protected AbstractStateMachine(...) {
> super(...);
> }
> }
> // use by subclassing
> class ConcreteStateMachine extends AbstractStateMachine {
> ConcreteStateMachine() {
> super(..."stopwatch.xml");
> }
> public void reset() { ... }
> public void running() { ... }
> public void paused() { ... }
> public void stopped() { ... }
> }
> // use by delegation
> class DelegatingStateMachine extends SomethingElse {
> StateMachineSupport delegate;
> DelegatingStateMachine() {
> delegate = new StateMachineSupport(this, ..."stopwatch.xml");
> }
> public void reset() { ... }
> public void running() { ... }
> public void paused() { ... }
> public void stopped() { ... }
> }
> StateMachineSupport.java, AbstractStateMachine2.java,
> StateMachineSupportTest.java, and AbstractStateMachine2Test.java attached.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]