Author: rahul
Date: Tue Jun 26 13:58:10 2007
New Revision: 550948

URL: http://svn.apache.org/viewvc?view=rev&rev=550948
Log:
SCXML-48 Broken subclassing for AbstractStateMachine.

Unrelated changes:
 - Two new constructors to avoid recurring parsing cost
 - Some cosmetic changes so the class Javadoc renders in a readable manner.

Thanks to Michael Heuer <heuermh AT acm DOT org> for the AbstractStateMachine 
tests (which now pass).

Added:
    
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/AbstractStateMachineTest.java
   (with props)
    
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/bar.xml
   (with props)
    
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/foo.xml
   (with props)
Modified:
    
jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/env/AbstractStateMachine.java
    
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/EnvTestSuite.java

Modified: 
jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/env/AbstractStateMachine.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/env/AbstractStateMachine.java?view=diff&rev=550948&r1=550947&r2=550948
==============================================================================
--- 
jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/env/AbstractStateMachine.java
 (original)
+++ 
jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/env/AbstractStateMachine.java
 Tue Jun 26 13:58:10 2007
@@ -39,27 +39,27 @@
 import org.xml.sax.SAXException;
 
 /**
- * This class demonstrates one approach for providing the base
+ * <p>This class demonstrates one approach for providing the base
  * functionality needed by classes representing stateful entities,
- * whose behaviors are defined via SCXML documents.
+ * whose behaviors are defined via SCXML documents.</p>
  *
- * SCXML documents (more generically, UML state chart diagrams) can be
+ * <p>SCXML documents (more generically, UML state chart diagrams) can be
  * used to define stateful behavior of objects, and Commons SCXML enables
  * developers to use this model directly into the corresponding code
  * artifacts. The resulting artifacts tend to be much simpler, embody
  * a useful separation of concerns and are easier to understand and
  * maintain. As the size of the modeled entity grows, these benefits
- * become more apparent.
+ * become more apparent.</p>
  *
- * This approach functions by registering an SCXMLListener that gets
+ * <p>This approach functions by registering an SCXMLListener that gets
  * notified onentry, and calls the namesake method for each state that
- * has been entered.
+ * has been entered.</p>
  *
- * This class swallows all exceptions only to log them. Developers of
+ * <p>This class swallows all exceptions only to log them. Developers of
  * subclasses should think of themselves as &quot;component developers&quot;
  * catering to other end users, and therefore ensure that the subclasses
  * are free of <code>ModelException</code>s and the like. Most methods
- * are <code>protected</code> for ease of subclassing.
+ * are <code>protected</code> for ease of subclassing.</p>
  *
  */
 public abstract class AbstractStateMachine {
@@ -67,7 +67,7 @@
     /**
      * The state machine that will drive the instances of this class.
      */
-    private static SCXML stateMachine;
+    private SCXML stateMachine;
 
     /**
      * The instance specific SCXML engine.
@@ -92,7 +92,7 @@
     private static final Object[] PARAMETERS = new Object[0];
 
     /**
-     * Convenience constructor.
+     * Convenience constructor, object instantiation incurs parsing cost.
      *
      * @param scxmlDocument The URL pointing to the SCXML document that
      *                      describes the &quot;lifecycle&quot; of the
@@ -104,7 +104,7 @@
     }
 
     /**
-     * Primary constructor.
+     * Primary constructor, object instantiation incurs parsing cost.
      *
      * @param scxmlDocument The URL pointing to the SCXML document that
      *                      describes the &quot;lifecycle&quot; of the
@@ -118,20 +118,58 @@
     public AbstractStateMachine(final URL scxmlDocument,
             final Context rootCtx, final Evaluator evaluator) {
         log = LogFactory.getLog(this.getClass());
-        if (stateMachine == null) {
-            // parse only once per subclass
-            ErrorHandler errHandler = new SimpleErrorHandler();
-            try {
-                stateMachine = SCXMLDigester.digest(scxmlDocument,
-                    errHandler);
-            } catch (IOException ioe) {
-                logError(ioe);
-            } catch (SAXException sae) {
-                logError(sae);
-            } catch (ModelException me) {
-                logError(me);
-            }
+        ErrorHandler errHandler = new SimpleErrorHandler();
+        try {
+            stateMachine = SCXMLDigester.digest(scxmlDocument,
+                errHandler);
+        } catch (IOException ioe) {
+            logError(ioe);
+        } catch (SAXException sae) {
+            logError(sae);
+        } catch (ModelException me) {
+            logError(me);
         }
+        initialize(stateMachine, rootCtx, evaluator);
+    }
+
+    /**
+     * Convenience constructor.
+     *
+     * @param stateMachine The parsed SCXML instance that
+     *                     describes the &quot;lifecycle&quot; of the
+     *                     instances of this class.
+     */
+    public AbstractStateMachine(final SCXML stateMachine) {
+        // default is JEXL
+        this(stateMachine, new JexlContext(), new JexlEvaluator());
+    }
+
+    /**
+     * Primary constructor.
+     *
+     * @param stateMachine The parsed SCXML instance that
+     *                     describes the &quot;lifecycle&quot; of the
+     *                     instances of this class.
+     * @param rootCtx The root context for this instance.
+     * @param evaluator The expression evaluator for this instance.
+     *
+     * @see Context
+     * @see Evaluator
+     */
+    public AbstractStateMachine(final SCXML stateMachine,
+            final Context rootCtx, final Evaluator evaluator) {
+        initialize(stateMachine, rootCtx, evaluator);
+    }
+
+    /**
+     * Instantiate and initialize the underlying executor instance.
+     *
+     * @param stateMachine The state machine
+     * @param rootCtx The root context
+     * @param evaluator The expression evaluator
+     */
+    private void initialize(final SCXML stateMachine,
+            final Context rootCtx, final Evaluator evaluator) {
         engine = new SCXMLExecutor(evaluator, new SimpleDispatcher(),
             new SimpleErrorReporter());
         engine.setStateMachine(stateMachine);
@@ -167,9 +205,10 @@
      * Get the SCXML object representing this state machine.
      *
      * @return Returns the stateMachine.
+     * @deprecated Returns null, use getEngine().getStateMachine() instead
      */
     public static SCXML getStateMachine() {
-        return stateMachine;
+        return null;
     }
 
     /**

Added: 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/AbstractStateMachineTest.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/AbstractStateMachineTest.java?view=auto&rev=550948
==============================================================================
--- 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/AbstractStateMachineTest.java
 (added)
+++ 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/AbstractStateMachineTest.java
 Tue Jun 26 13:58:10 2007
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.commons.scxml.env;
+
+import java.net.URL;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+/**
+ * Unit tests [EMAIL PROTECTED] 
org.apache.commons.scxml.env.AbstractStateMachine}.
+ */
+public class AbstractStateMachineTest extends TestCase {
+
+    /**
+     * Construct a new instance of AbstractStateMachineTest with the specified 
name
+     */
+    public AbstractStateMachineTest(String name) {
+        super(name);
+    }
+
+    // Test data
+    private boolean fooCalled;
+    private boolean barCalled;
+
+    /**
+     * Set up instance variables required by this test case.
+     */
+    public void setUp() {
+        fooCalled = false;
+        barCalled = false;
+    }
+
+    public void testMoreThanOneScxmlDocument() throws Exception {
+        URL fooScxmlDocument = getClass().getResource("foo.xml");
+        URL barScxmlDocument = getClass().getResource("bar.xml");
+
+        new Foo(fooScxmlDocument);
+        new Bar(barScxmlDocument);
+
+        assertTrue(fooCalled);
+        assertTrue(barCalled);
+    }
+
+    private class Foo extends AbstractStateMachine {
+
+        public Foo(final URL scxmlDocument) {
+            super(scxmlDocument);
+        }
+
+        public void foo() {
+            fooCalled = true;
+        }
+    }
+
+    private class Bar extends AbstractStateMachine {
+
+        public Bar(final URL scxmlDocument) {
+            super(scxmlDocument);
+        }
+
+        public void bar() {
+            barCalled = true;
+        }
+    }
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite(AbstractStateMachineTest.class);
+        suite.setName("AbstractStateMachine Tests");
+        return suite;
+    }
+
+    public static void main(String args[]) {
+        TestRunner.run(suite());
+    }
+}

Propchange: 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/AbstractStateMachineTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/AbstractStateMachineTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/EnvTestSuite.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/EnvTestSuite.java?view=diff&rev=550948&r1=550947&r2=550948
==============================================================================
--- 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/EnvTestSuite.java
 (original)
+++ 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/EnvTestSuite.java
 Tue Jun 26 13:58:10 2007
@@ -48,6 +48,7 @@
     public static Test suite() {
         TestSuite suite = new TestSuite();
         suite.setName("Commons-SCXML Environments Tests");
+        suite.addTest(AbstractStateMachineTest.suite());
         suite.addTest(AbstractSCXMLListenerTest.suite());
         suite.addTest(LogUtilsTest.suite());
         suite.addTest(SimpleContextTest.suite());

Added: 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/bar.xml
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/bar.xml?view=auto&rev=550948
==============================================================================
--- 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/bar.xml
 (added)
+++ 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/bar.xml
 Tue Jun 26 13:58:10 2007
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+-->
+<scxml xmlns="http://www.w3.org/2005/07/scxml";
+       version="1.0"
+       initialstate="bar">
+
+    <state id="bar"/>
+
+</scxml>
+

Propchange: 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/bar.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/bar.xml
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/foo.xml
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/foo.xml?view=auto&rev=550948
==============================================================================
--- 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/foo.xml
 (added)
+++ 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/foo.xml
 Tue Jun 26 13:58:10 2007
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+-->
+<scxml xmlns="http://www.w3.org/2005/07/scxml";
+       version="1.0"
+       initialstate="foo">
+
+    <state id="foo"/>
+
+</scxml>
+

Propchange: 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/foo.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/foo.xml
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to