<?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>How To Help with Turbine Development</title>
 </properties>

<body>

<section name="How to help">

<p>We are always happy to encourage new committers to the project. 
The Apache Software foundation requires that anyone to be a contributor, that he/she/it has signed 
the ICLA (Individual Contributor License Agreement). Find an overview, more information and how-tos 
<a href="https://www.apache.org/licenses/contributor-agreements.html#clas">here</a>.
</p>

<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 Turbine 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
            <a href="http://issues.apache.org/jira/browse/TRB">in our bug tracker</a>
            using the &quot;Site&quot; component and attach the patch files (or new files).
        </li>
        <li>
            Mailing list - The archives of <a href="mailto:user@turbine.apache.org">user@turbine.apache.org</a>
            and <a href="mailto:dev@turbine.apache.org">dev@turbine.apache.org</a>
            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="https://cwiki.apache.org/confluence/display/TURBINE/">Turbine
            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
            <a href="http://issues.apache.org/jira/browse/TRB">in our bug tracker</a>
            and attach the patch files (or new files).
        </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
    <a href="http://issues.apache.org/jira/browse/TRB">our bug tracker</a> clearly
    describing 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="https://cwiki.apache.org/confluence/display/TURBINE/Turbine2+WishList">
    Apache Wiki</a>.  Everyone is encouraged to take part in the discussion, design, and
    implementation.
</p>

</section>

</body>
</document>
