<?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.
-->
<!--
 +======================================================================+
 |****                                                              ****|
 |****      THIS FILE IS GENERATED BY THE COMMONS BUILD PLUGIN      ****|
 |****                    DO NOT EDIT DIRECTLY                      ****|
 |****                                                              ****|
 +======================================================================+
 | TEMPLATE FILE: issue-tracking-template.xml                           |
 | commons-build-plugin/trunk/src/main/resources/commons-xdoc-templates |
 +======================================================================+
 |                                                                      |
 | 1) Re-generate using: mvn commons-build:jira-page                    |
 |                                                                      |
 | 2) Set the following properties in the component's pom:              |
 |    - commons.jira.id  (required, alphabetic, upper case)             |
 |    - commons.jira.pid (required, numeric)                            |
 |                                                                      |
 | 3) Example Properties                                                |
 |                                                                      |
 |  <properties>                                                        |
 |    <commons.jira.id>MATH</commons.jira.id>                           |
 |    <commons.jira.pid>12310485</commons.jira.pid>                     |
 |  </properties>                                                       |
 |                                                                      |
 +======================================================================+
-->
<document>
  <properties>
    <title>Apache Commons JCS Issue tracking</title>
    <author email="dev@commons.apache.org">Apache Commons Documentation Team</author>
  </properties>
  <body>

    <section name="Apache Commons JCS Issue tracking">
      <p>
      Apache Commons JCS uses <a href="https://issues.apache.org/jira/">ASF JIRA</a> for tracking issues.
      See the <a href="https://issues.apache.org/jira/browse/JCS">Apache Commons JCS JIRA project page</a>.
      </p>

      <p>
      To use JIRA you may need to <a href="https://issues.apache.org/jira/secure/Signup!default.jspa">create an account</a>
      (if you have previously created/updated Commons issues using Bugzilla an account will have been automatically
      created and you can use the <a href="https://issues.apache.org/jira/secure/ForgotPassword!default.jspa">Forgot Password</a>
      page to get a new password).
      </p>

      <p>
      If you would like to report a bug, or raise an enhancement request with
      Apache Commons JCS please do the following:
      <ol>
        <li><a href="https://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&amp;pid=${commons.jira.pid}&amp;sorter/field=issuekey&amp;sorter/order=DESC&amp;status=1&amp;status=3&amp;status=4">Search existing open bugs</a>.
            If you find your issue listed then please add a comment with your details.</li>
        <li><a href="mail-lists.html">Search the mailing list archive(s)</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="https://issues.apache.org/jira/secure/CreateIssueDetails!init.jspa?pid=${commons.jira.pid}&amp;issuetype=1&amp;priority=4&amp;assignee=-1">bug report</a>
            or <a href="https://issues.apache.org/jira/secure/CreateIssueDetails!init.jspa?pid=${commons.jira.pid}&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>the developers of Apache Commons JCS are all unpaid volunteers</li>
      </ul>
      </p>

      <p>
      For more information on subversion and creating patches see the
      <a href="https://www.apache.org/dev/contributors.html">Apache Contributors Guide</a>.
      </p>

      <p>
      You may also find these links useful:
      <ul>
        <li><a href="https://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&amp;pid=${commons.jira.pid}&amp;sorter/field=issuekey&amp;sorter/order=DESC&amp;status=1&amp;status=3&amp;status=4">All Open Apache Commons JCS bugs</a></li>
        <li><a href="https://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&amp;pid=${commons.jira.pid}&amp;sorter/field=issuekey&amp;sorter/order=DESC&amp;status=5&amp;status=6">All Resolved Apache Commons JCS bugs</a></li>
        <li><a href="https://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&amp;pid=${commons.jira.pid}&amp;sorter/field=issuekey&amp;sorter/order=DESC">All Apache Commons JCS bugs</a></li>
      </ul>
      </p>
    </section>
  </body>
</document>
