Author: rahul
Date: Tue May 29 09:31:02 2007
New Revision: 542582

URL: http://svn.apache.org/viewvc?view=rev&rev=542582
Log:
SCXML-45
Payload of events sent to current scxml session using <send> tag not injected 
into engine

This has been implemented (with a test case), however note the following caveat 
--

The spec doesn't clarify how multiple <send> elements that create derived 
events should be handled, so for example:

<onentry>
  <send event="ev.foo" namelist="alpha beta"/>
  <send event="ev.bar" namelist="gamma delta"/>
</onentry>

I think they should be processed together (this makes sense to leverage 
parallel regions for example), and due to that '_eventdata' becomes ambiguous 
in this scenario. The Commons SCXML implementation introduces an implicit 
variable '_eventdatamap' for such scenarios wherein the event datas are stored 
keyed by event name.

So, the two <send> events above could be processed by two regions like so:

<parallel>

  <state id="region1">

     <transition event="ev.foo" cond="_eventdatamap['ev.foo'].alpha eq 
'somevalue'"
                 target="..." />

     <!-- ... -->

  </state>

  <state id="region2">

     <transition event="ev.bar" cond="_eventdatamap['ev.bar'].delta eq 
'othervalue'"
                 target="..." />

     <!-- ... -->

  </state>

  <!-- ... -->

</parallel>

To summarize, the _eventdatamap variable needs to be used in association with 
"derived" (such as <send> being discussed here) events. Also note that this 
behavior may change if there is clarity in the specification at some point.

Added:
    
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/jexl/eventdata-03.xml
   (with props)
Modified:
    
jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/SCXMLExecutor.java
    
jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/model/Send.java
    
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/EventDataTest.java

Modified: 
jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/SCXMLExecutor.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/SCXMLExecutor.java?view=diff&rev=542582&r1=542581&r2=542582
==============================================================================
--- 
jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/SCXMLExecutor.java
 (original)
+++ 
jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/SCXMLExecutor.java
 Tue May 29 09:31:02 2007
@@ -536,6 +536,8 @@
         currentStatus = step.getAfterStatus();
         scInstance.getRootContext().setLocal("_ALL_STATES",
             SCXMLHelper.getAncestorClosure(currentStatus.getStates(), null));
+        setEventData((TriggerEvent[]) currentStatus.getEvents().
+            toArray(new TriggerEvent[0]));
     }
 
     /**

Modified: 
jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/model/Send.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/model/Send.java?view=diff&rev=542582&r1=542581&r2=542582
==============================================================================
--- 
jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/model/Send.java
 (original)
+++ 
jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/model/Send.java
 Tue May 29 09:31:02 2007
@@ -328,7 +328,7 @@
                             + "' with no delay");
                     }
                     derivedEvents.add(new TriggerEvent(event,
-                        TriggerEvent.SIGNAL_EVENT));
+                        TriggerEvent.SIGNAL_EVENT, params));
                     return;
                 }
             } else {

Modified: 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/EventDataTest.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/EventDataTest.java?view=diff&rev=542582&r1=542581&r2=542582
==============================================================================
--- 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/EventDataTest.java
 (original)
+++ 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/EventDataTest.java
 Tue May 29 09:31:02 2007
@@ -45,7 +45,7 @@
     }
 
     // Test data
-    private URL eventdata01, eventdata02;
+    private URL eventdata01, eventdata02, eventdata03;
     private SCXMLExecutor exec;
 
     /**
@@ -56,13 +56,15 @@
             getResource("org/apache/commons/scxml/env/jexl/eventdata-01.xml");
         eventdata02 = this.getClass().getClassLoader().
             getResource("org/apache/commons/scxml/env/jexl/eventdata-02.xml");
+        eventdata03 = this.getClass().getClassLoader().
+            getResource("org/apache/commons/scxml/env/jexl/eventdata-03.xml");
     }
 
     /**
      * Tear down instance variables required by this test case.
      */
     public void tearDown() {
-        eventdata01 = eventdata02 = null;
+        eventdata01 = eventdata02 = eventdata03 = null;
     }
 
     /**
@@ -120,6 +122,25 @@
             currentStates = SCXMLTestHelper.fireEvent(exec, te2);
             assertEquals(1, currentStates.size());
             assertEquals("state4", ((State)currentStates.iterator().
+                next()).getId());
+        } catch (Exception e) {
+            fail(e.getMessage());
+        }
+    }
+
+    public void testEventdata03Sample() {
+        exec = SCXMLTestHelper.getExecutor(eventdata03);
+        assertNotNull(exec);
+        try {
+            Set currentStates = exec.getCurrentStatus().getStates();
+            assertEquals(1, currentStates.size());
+            assertEquals("ten", ((State)currentStates.iterator().
+                next()).getId());
+            TriggerEvent te = new TriggerEvent("event.foo",
+                TriggerEvent.SIGNAL_EVENT);
+            currentStates = SCXMLTestHelper.fireEvent(exec, te);
+            assertEquals(1, currentStates.size());
+            assertEquals("thirty", ((State)currentStates.iterator().
                 next()).getId());
         } catch (Exception e) {
             fail(e.getMessage());

Added: 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/jexl/eventdata-03.xml
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/jexl/eventdata-03.xml?view=auto&rev=542582
==============================================================================
--- 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/jexl/eventdata-03.xml
 (added)
+++ 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/jexl/eventdata-03.xml
 Tue May 29 09:31:02 2007
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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="ten">
+
+    <datamodel>
+        <data name="rootdata">
+            <root xmlns="">
+                <one>1</one>
+                <two>2</two>
+            </root>
+        </data>
+    </datamodel>
+
+    <state id="ten">
+        <transition event="event.foo" target="twenty"/>
+    </state>
+
+    <state id="twenty">
+        <onentry>
+            <var name="one" expr="Data(rootdata,'root/one')"/>
+            <var name="two" expr="Data(rootdata,'root/two')"/>
+            <send event="event.bar" namelist="one two"/>
+        </onentry>
+        <transition event="event.bar"
+            cond="_eventdatamap['event.bar'].one + 
_eventdatamap['event.bar'].two eq 3"
+            target="thirty"/>
+    </state>
+
+    <state id="thirty" final="true"/>
+
+</scxml>

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

Propchange: 
jakarta/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml/env/jexl/eventdata-03.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