<?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.
-->
<document>
 <properties>
  <title>Issue tracking</title>
  <author email="dev@commons.apache.org">Commons Documentation Team</author>
 </properties>
<body>
<!-- ================================================== -->
<section name="Commons SCXML Issue tracking">
<p>
  Commons SCXML uses <a href="http://issues.apache.org/jira/">ASF JIRA</a>
  for tracking issues. Issues for Commons SCXML are tracked at
  <a href="http://issues.apache.org/jira/browse/SCXML">http://issues.apache.org/jira/browse/SCXML</a>
</p>
<p>
  To create a new issue you will need to
  <a href="http://issues.apache.org/jira/secure/Signup!default.jspa">sign up</a>
  for a new account, unless you had previously used the Commons product in
  Bugzilla in which case your username is your email address and you will
  need to use the
  <a href="http://issues.apache.org/jira/secure/ForgotPassword!default.jspa">Forgot Password</a>
  page to get a new password.
</p>
<p>
  Bugs and enhancements should be filed under the "Commons SCXML" project in JIRA. 
  If you would like to report a bug, or raise an enhancement request with Commons
  SCXML please do the following:
  <ol>
  <li><a href="http://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&amp;mode=hide&amp;pid=12310492">Search existing bugs</a>.
  If you find your issue listed then please add a comment with your details.</li>
  <li><a href="http://mail-archives.apache.org/mod_mbox/commons-dev/">Search the mailing list archive</a>.
  You may find your issue or idea has already been discussed.</li>
  <li>Decide if your issue is a bug or an enhancement.</li>
  <li>Submit either a <a href="http://issues.apache.org/jira/secure/CreateIssueDetails!init.jspa?pid=12310492&amp;issuetype=1&amp;priority=4&amp;assignee=-1">bug report</a>
  or <a href="http://issues.apache.org/jira/secure/CreateIssueDetails!init.jspa?pid=12310492&amp;issuetype=4&amp;priority=4&amp;assignee=-1">enhancement request</a>.</li>
  </ol>
</p>
<p>
  Please also remember these points:
  <ul>
  <li>The more information you provide, the better we can help you</li>
  <li>Test cases are vital, particularly for any proposed enhancements</li>
  <li>Patches containing new files must contain the ASL v2.0 header at the top of every new file</li>
  <li>A test class for Foo.java must be named FooTest.java</li>
  </ul>
</p>
<p>
  You may also find these links useful:
  <ul>
  <li><a href="http://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&amp;pid=12310492&amp;status=1">All Open SCXML bugs</a></li>
  <li><a href="http://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&amp;pid=12310492&amp;status=5">All Resolved SCXML bugs</a></li>
  <li><a href="http://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&amp;mode=hide&amp;pid=12310492">All SCXML bugs</a></li>
  </ul>
</p>
</section>
<!-- ================================================== -->
</body>
</document>
