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]