<!--
 * 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.
-->
<html>
<head>
<title>Status File for Apache Commons "SCXML" Component</title>
</head>
<body bgcolor="white">


<div align="center">
<h1>The Apache Commons <em>SCXML</em> Component</h1>
$Id$<br />
<a href="#Introduction">[Introduction]</a>
<a href="#Dependencies">[Dependencies]</a>
<a href="#Release Info">[Release Info]</a>
<a href="#Committers">[Committers]</a>
<a href="#Unsupported">[Unsupported Items]</a>
<a href="#ActionItems">[Action Items]</a>
<br /><br />
</div>


<a name="Introduction"></a>
<h3>1.  INTRODUCTION</h3>

<p>The World Wide Web Consortium (W3C) Voice Browser Working Group 
recently announced the publication of the first 
<a href="http://www.w3.org/TR/2005/WD-scxml-20050705/">Working Draft of 
State Chart XML</a> (SCXML). SCXML provides a generic state-machine 
based execution environment based on CCXML and Harel State Tables. 
<em>Commons SCXML</em> is a state chart engine, using the SCXML semantics.
</p>


<a name="Dependencies"></a>
<h3>2.  DEPENDENCIES</h3>

<p>The <em>SCXML</em> component is dependent upon the following external
components for development and use:</p>
<ul>
<li>Apache Jakarta 
<a href="http://commons.apache.org/digester/">Commons 
Digester</a></li>
<li>Apache Jakarta 
<a href="http://commons.apache.org/logging/">Commons 
Logging</a></li>
<li><a href="http://java.sun.com/j2se">Java Development Kit</a> 
(Version 1.4 or later)</li>
</ul>

<p>JUnit is used as the testing framework</p>
<ul>
<li><a href="http://www.junit.org">JUnit Testing Framework</a>
(Version 3.7 or later) - for unit tests only, not required
for deployment</li>
</ul>

<p>Expression evaluation in SCXML documents is environment specific, 
the expression evaluator and context of evaluation is envisioned to be 
&quot;pluggable&quot;. The existing code provides an example for the 
servlet/JSP environment which needs: </p>
<ul>
<li>Apache Jakarta 
<a href="http://commons.apache.org/el/">Commons EL</a></li>
<li><a href="http://java.sun.com/products/servlet/">Servlet 2.4</a></li>
<li><a href="http://java.sun.com/products/jsp/">JSP 2.0</a></li>
</ul>
</p>

<a name="Release Info"></a>
<h3>3.  RELEASE INFO</h3>

<p>Current Release: SCXML is yet to be released.</p>

<p>Planned Next Release:  See the
<a href="#ActionItems">Action Items</a> list for tasks that need to be
completed prior to this release.</p>


<a name="Committers"></a>
<h3>4.  COMMITTERS</h3>

<p>The following individuals are the primary developers and maintainers of this
component.  Developers who plan to use <em>SCXML</em> in their own
projects are encouraged to collaborate on the future development of this
component to ensure that it continues to meet a variety of needs.</p>
<ul>
  <li><a href="mailto:rahul AT apache.org">Rahul Akolkar</a></li>
  <li><a href="mailto:martinc AT apache.org">Martin Cooper</a></li>
  <li>Fancy volunteering?  We need you!</li>
</ul>


<a name="Unsupported"></a>
<h3>5.  UNSUPPORTED ITEMS</h3>

<p>The SCXML engine implementation is under development. The major items that are 
yet unimplemented are (Section numbers and Working Draft details in brackets):</p>

<ul> 
<li>Multiple (simultaneous) targets for a single transition (Section 3.3.1 July 05 WD) -
Similar results can be achieved in most cases by adding "action states" and a single
target.</li>
<li>SYNCH (Section 4.4 July 05 WD) - This has been removed from the latest WD.</li>
<li>JOIN (Section 4.3 July 05 WD) - Wait for the next WD, since SYNCH is no longer
listed.</li>
</ul>

<a name="ActionItems"></a>
<h3>6.  ACTION ITEMS</h3>

<p>These are the nice to haves before the next release. Help is welcome.</p>

<ul>
<li>More, better documentation.</li>
<li>More usecases.</li>
<li>Improvements to the <i>test</i> package, possibly providing <i>SCXMLUnit</i>
test utilities.</li>
</ul>

</body>
</html>
