Dear Wiki user,

You have subscribed to a wiki page or wiki category on "Jakarta-commons Wiki" 
for change notification.

The following page has been changed by FasihullahAskiri:
http://wiki.apache.org/jakarta-commons/SCXML/HomePage/Tutorials/Templating

New page:
##language:en
== A brief tutorial on SCXML Templating ==
SCXML allows for reusability of a certain FSM externally. This is helpful when 
a certain sequence of states, events  and actions occur frequently. Instead of 
repeating the sequence multiple times, an FSM can be designed seperately which 
can be referred as a state body using src attribute of a state.

=== Use Case ===
In a typical call control application, the sequence to connect to an end-point 
would be something like
 * waiting-for-connection [connection.alerting/conection.accept()] --> 
accepting-connection
 * accepting-connection [connection.connected] --> connection-connected
This sequence is a completely reusable one and can be ''templated''

=== Example based on the use case above ===
{{{
<scxml
  xmlns="http://www.w3.org/2005/07/SCXML";
  version="1.0" 
  xmlns:ccxml="http://stack.mera.com/CCXML";
  initialstate="wait-for-connection-request">

  <state id="wait-for-connection-request">
    <transition event="connection.alerting" 
target="wait-for-connection-connected"/>
  </state>
  <state id="wait-for-connection-connected">
    <onentry>
      <ccxml:accept callid="incoming-line"/>
    </onentry>
    <transition 
        event="connection.connected"
        cond="_eventdata.ID eq 'incoming-line'">
      <send event="connection.connected"/>
    </transition>
  </state>
</scxml>

}}} 

=== SCXML Using the template above ===
{{{
<scxml
  xmlns="http://www.w3.org/2005/07/SCXML";
  version="1.0" 
  xmlns:ccxml="http://stack.mera.com/CCXML";
  initialstate="wait-for-connection-request">

  <state id="wait-for-connection-request" 
src="accept-connection.scxml?call-id=incoming-line">
    <transition event="connection.connected" target="send-dtmf"/>
  </state>
  <state id="send-dtmf">
    <onentry>
      <ccxml:send-dtmf digits="'1234'"/>
    </onentry>
    <transition event="dtmf.sent" target="bye"/>
  </state>

  <state id="bye" src="send-bye.scxml" final="true"/>
</scxml>
}}}

=== Explanation ===
The example above is fairly elaborate and simple. As we can see, the otherwise 
complicated State Engine has been broken into three seperate FSMs, 
send-bye.scxml and accept-connection.scxml being fairly reusable.

=== Posting to external JSPs ===
In the example above, we used an SCXML doc to post the content to, we could 
also have used a JSP/Velocity Template which is able to return an SCXML doc. 
Using a JSP/Velocity template we can make the SCXML dynamic.
Going back to the example above, the accept-connection.scxml accepts the 
connection in the incoming-line variable, to use a different value we could 
have used a JSP like in the example below

{{{
<state id="foo${param.id}">
 <!-- some content -->
</state>

placed at URL http://foo.bar/baz.jsp , then
src="http://foo.bar/baz.jsp?id=1"; will get us:

<state id="foo1">
 <!-- some content -->
</state>
}}}
=== A word of caution ===
 * When the src attribute is used, it is highly recommended to use a 
path-resolver (Provide Link). This is done while creating the SCXML
{{{
SCXMLDigester.newInstance(SCXML, PathResolver);
}}}
[http://jakarta.apache.org/commons/scxml/apidocs/org/apache/commons/scxml/io/SCXMLDigester.html#newInstance(org.apache.commons.scxml.model.SCXML,%20org.apache.commons.scxml.PathResolver)
  API]
If the PathResolver is not used (By passing a null), then the src is taken as 
the path of the file.
 * In many cases, it might be required to re-use the same template in the same 
"master" scxml. i.e. In our example above, after the send-bye, it might be 
required to reconnect to the ''incoming-line''. This will lead to the same 
states being duplicated and the SCXML Engine to be indeterminate. This can be 
avoided by using a param=value after the URL, this mangles the url and avoids 
duplicate IDs

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

Reply via email to