<?xml version="1.0"?>
<!-- 
/*
 * Copyright 2001-2004 The Apache Software Foundation.
 * 
 * Licensed 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>How To Help with Turbine Development</title>
 </properties>

<body>

<section name="How to help">

<p>
  If you are a new developer to Turbine or even an existing developer, these are
  areas where you can take ownership and help complete. Please do not ask us how
  you can help, but rather specific questions about how you think that these items
  should be implemented. It is up to you to take initiative and provide solutions
  to the missing functionality described below. ;-)
</p>

<p>
  It is always possible to take ownership of any portion of the project. The way
  to do this is to post a message to the turbine-dev mailing list.  Just explain
  what you are wanting to work on or any ideas that you might have on the subject.
</p>

<p>
    Documentation is <b>*always*</b> appreciated in any form.  The documentation for
    Turbine exists in basically four forms.
    <ul>
        <li>
            XML formatted docs (xdoc) - This is used to generate the documentation
            on the jakarta site.  The source for this documentation can be found
            in the xdocs directory in the source distribution.  To submit additional
            documentation in this form or patches to existing documentation, please
            create an issue is the
            <a href="http://issues.apache.org/scarab/issues">issue tracking system</a>
            and attach the patch files (or new files).
        </li>
        <li>
            Mailing list - The archives of turbine-user@jakarta.apache.org and
            turbine-dev@jakarta-apache.org are an excellent source of information
            for the project.  Answering questions that are asked on the mailing list
            or simply posting information that might be of use to other Turbine users
            would be very welcome contribution to the project.
        </li>
        <li>
            The <a href="http://nagoya.apache.org/wiki/apachewiki.cgi?TurbineProjectPages">
            Apache Wiki</a> another repository of documentation for the project.  It
            contains development information, user documentation, how-to documents,
            discussion of new features, etc.  Anyone can add new pages and edit existing
            pages very easily!  This is perhaps the easiest way to contribute documentation
            (well, second only to the mailing lists).
        </li>
        <li>
            The javadocs are another very important form of documentation for the project.
            Changes to this form of documentation should be in the form of patches.  To submit
            them, create a new issue in the
            <a href="http://issues.apache.org/scarab/issues">issue tracking system</a>
            and attach your patch(s).
        </li>
    </ul>
    The documentation is probably the easiest area for anyone to contribute in.  If you are
    new to Turbine and learning your way around, documenting what you learn and submitting
    it in any other the various forms would be appreciated.
</p>

<p>
    Testing is another area in which help is always needed.  This could consist of simply
    reporting problems that you run into using Turbine.  It could also consist of submitting
    code to perform unit tests.  Turbine uses JUnit and Cactus for testing.  You can find
    examples in the src/test directory of the source distribution.
</p>

<p>
    If you do discover a defect in the Turbine product, please create a defect issue in
    the <a href="http://issues.apache.org/scarab/issues">issue tracking system</a> clearly
    discribing the problem.  If you can take the time to track down the source of the problem,
    it would certainly help speed the process of getting it corrected.  Of course, actually
    fixing the problem and attaching a patch to the issue would be greatly appreciated.
</p>

<p>
    You can also contribute to the project by enhancing existing functionality and/or
    adding new functionality.  There is a current list of requested features on the
    <a href="http://nagoya.apache.org/wiki/apachewiki.cgi?JakartaTurbine2/WishList">
    Apache Wiki</a>.  Everyone is encouraged to take part in the discussion, design, and
    implementation.
</p>

</section>

</body>
</document>
