<?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="commons-dev@jakarta.apache.org">Commons Documentation Team</author>
 </properties>
<body>
<!-- ================================================== -->
<section name="Commons Digester Issue tracking">
<p>
  Commons Digester uses <a href="http://issues.apache.org/jira/">ASF JIRA</a>
  for tracking issues. Issues for Commons Digester are tracked at
  <a href="http://issues.apache.org/jira/browse/DIGESTER">http://issues.apache.org/jira/browse/DIGESTER</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 Digester" project in JIRA. 
  If you would like to report a bug, or raise an enhancement request with Commons
  Digester please do the following:
  <ol>
  <li><a href="http://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&amp;mode=hide&amp;pid=12310471">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/jakarta-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=12310471&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=12310471&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=12310471&amp;status=1">All Open Digester bugs</a></li>
  <li><a href="http://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&amp;pid=12310471&amp;status=5">All Resolved Digester bugs</a></li>
  <li><a href="http://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&amp;mode=hide&amp;pid=12310471">All Digester bugs</a></li>
  </ul>
</p>
</section>
<!-- ================================================== -->
</body>
</document>
