<?xml version="1.0" encoding="UTF-8"?>
<!--
 * Copyright 2001-2009 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.
 *
 */ -->
<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V1.2//EN" "http://forrest.apache.org/dtd/document-v12.dtd">
<document>
  <properties>
    <title>Participation</title>
  </properties>
  <body>
	  <section name="Introduction">
      <p>Every volunteer project obtains its strength from the people involved in it.
        We invite you to participate as much or as little as you choose. The roles
        and responsibilities that people can assume in the project are based on
        merit. Everybody's input matters!
      </p>
      <p>There are a variety of ways to participate. Regardless of how you choose
        to participate, we suggest you join some or all of our <a href="lists.html">mailing lists</a>.
      </p>
      </section>

      <section name="Use the Products &amp; Give Us Feedback">
        <p>Using the products,reporting bugs, making feature requests, etc. is by
          far the most important role. It's your feedback that allows the technology
          to evolve.
          <ul>
            <li><a href="mail-lists.html">Join Mailing Lists</a></li>
            <li><a href="releases.html">Download Binary Builds</a></li>
            <li><a href="http://issues.apache.org/jira/secure/BrowseProject.jspa?id=10401">Report Bugs &amp; Request New Features</a></li>
          </ul>
        </p>
      </section>

      <section name="Contribute Code or Documentation Patches">
        <p>In this role, you participate in the actual development of the code. If this
          is the type of role you'd like to play, here are some steps (in addition to
          the ones above) to get you started:
          <ul>
            <li> <a href="list-guidelines.html#guidelines">Read Mailing List Guidelines </a></li>
            <li> <a href="library.html">Review Reference Library </a></li>
            <li> <a href="releases.html">Download the Source Code</a></li>
            <li> <a href="source-repository.html">Access SVN Repository </a></li>
          </ul>
        </p>
        <p>Any and all new development or bug fixing uses the latest code base.
          If you have a patch, it should be submitted against the latest available
          code.
        </p>
      </section>

      <section name="Getting Support on the Lists">
        <p>We do all development and bug fixing on the latest available code base.
          If you've encountered what you think is a bug, please first check the
          <a href="http://issues.apache.org/jira/secure/BrowseProject.jspa?id=10401">issues database</a> for known issues. If you
          can't find your bug, make sure you're using the latest code base. We are
          not able to fix bugs on earlier code bases.
        </p>
        <p>Please include any relevant version information and the error message
            text, if there is one. If you have a problem with a specific interface,
            like find_business, you'll likely be asked to post a log of the SOAP
            message exchanges between your client and the jUDDI server. You can
            use the axis tool
            <a href="http://ws.apache.org/axis/java/developers-guide.html">TCPMon</a>
            to capture these messages.
        </p>
        <p>Remember, Apache helps those that help themselves. Please take a look
          at Eric S. Raymond's and Rick Moen's explanation of
          <a href="http://www.catb.org/~esr/faqs/smart-questions.html">"How to Ask Questions The Smart Way</a>.
          </p>
      </section>
      <section name="jUDDI Wiki">
        <p>Like other Apache projects, jUDDI maintains a wiki, a sort of virtual
          meeting place for the jUDDI community. This is a resource available
          to everyone, and you are encouraged to contribute. This is a good resource
          for 'HowTos' for common configuration issues.
          <ul>
            <li> <a href="http://wiki.apache.org/juddi">http://wiki.apache.org/juddi</a></li>
          </ul>
          </p>
      </section>

  </body>
</document>
