<?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>Developers Guide</title>
  </properties>

  <body>

    <section name="Aims">
      <p>
        Maintenance of a library by decentralized team requires communication.
        It is important that developers follow guidelines laid down by the community
        to ensure that the code they create can be successfully maintained by others.
      </p>
    </section>

    <section name='Guidelines'>
      <p>
        Developers are asked to comply with the following development guidelines.
        Code that does not comply with the guidelines including the word <i>must</i>
        will not be committed.  Our aim will be to fix all of the exceptions to the
        "<i>should</i>" guidelines prior to a release.
      </p>
      <subsection name="Contributing">
        <p><strong>Getting Started</strong></p>
        <ol>
          <li>
            Download the Commons RNG source code.  Follow the instructions
            under the heading "Repository Checkout" on the
            <a href="https://gitbox.apache.org/">Git at the ASF page</a>.
            The git url for the current development sources of Commons RNG
            is <source class="none">http://gitbox.apache.org/repos/asf/commons-rng.git</source>
            for anonymous read-only access and
            <source class="none">https://apacheid@gitbox.apache.org/repos/asf/commons-rng.git</source>
            (where apacheid should be replaced by each committer Apache ID) for committers
            read-write access.
          </li>
          <li>
            Like most commons components, Commons RNG uses Apache Maven as our
            build tool. The sources can also be built using Ant (a working
            Ant build.xml is included in the top level project directory).
            To build Commons RNG using Maven, you can follow the instructions for
            <a href="https://maven.apache.org/run-maven/index.html">Building a
            project with Maven</a>.
            Launch Maven from the top-level directory
            in the checkout of Commons RNG trunk. No special setup is required,
            except that currently to build the site (i.e. to execute Maven's
            "<kbd>site</kbd>" goal), you may need to increase the default memory allocation
            (e.g. <kbd>export MAVEN_OPTS=-Xmx512m</kbd>) before launching
            Maven.
          </li>
          <li>
            Be sure to join the commons-dev and commons-user
            <a href="mail-lists.html">
              email lists</a> and use them appropriately (make sure the string
              "[RNG]" starts the Subject line of all your postings).
              Make any proposals here where the group can comment on them.
          </li>
          <li>
            <a href="https://issues.apache.org/jira/secure/Signup!default.jspa">
              Setup an account on JIRA
            </a>
            and use it to submit patches and
            identify bugs. Read the
            <a href="https://issues.apache.org/bugwritinghelp.html">
            directions</a>
            for submitting bugs and search the database to
            determine if an issue exists or has already been dealt with.
            <p>
              See the <a href="https://commons.apache.org/rng/issue-tracking.html">
              Commons RNG Issue Tracking Page</a>
              for more information on how to
              search for or submit bugs or enhancement requests.
            </p>
            <li>
              Generating patches: The requested format for generating patches is
              the Unified Diff format, which can be easily generated using the git
              client or various IDEs.
              <source class="none">git diff -p > patch </source>
              Run this command from the top-level project directory (where pom.xml
              resides).
            </li>
          </li>
        </ol>
        <p><strong>Contributing ideas and code</strong></p>
        <p>
          Follow the steps below when making suggestions for additions or
          enhancements to Commons RNG. This will make it easier for the community
          to comment on your ideas and for the committers to keep track of them.
          Thanks in advance!
        </p>
        <ol>
          <li>Start with a post to the commons-dev mailing list, with [RNG] at
          the beginning of the subject line, followed by a short title
          describing the new feature or enhancement;  for example, "[RNG]
          New cryptographically secure generator".
          The body of the post should include each of the following items
          (but be <strong>as brief as possible</strong>):
          <ul>
            <li>A concise description of the new feature / enhancement</li>
            <li>References to definitions and algorithms. Using standard
            definitions and algorithms makes communication much easier and will
            greatly increase the chances that we will accept the code / idea</li>
            <li>Some indication of why the addition / enhancement is practically
            useful</li>
          </ul></li>
          <li>Assuming a generally favorable response to the idea on commons-dev,
          create a JIRA ticket using the the feature title as the short
          description. Incorporate feedback from the initial posting in the
          description.
          </li>
          <li>Submit code as attachments to the JIRA ticket.  Please use one
          ticket for each feature, adding multiple patches to the ticket
          as necessary.  Use the git diff command to generate your patches as
          diffs.  Please do not submit modified copies of existing java files. Be
          patient (but not <strong>too</strong> patient) with committers reviewing
          patches. Post a *nudge* message to commons-dev with a reference to the
          ticket if a patch goes more than a few days with no comment or commit.
          </li>
        </ol>
      </subsection>

      <subsection name='Coding Style'>
        <p>
          Commons RNG follows
          <a href="https://www.oracle.com/technetwork/java/codeconventions-150003.pdf">Code
          Conventions for the Java Programming Language</a>. As part of the maven
          build process, style checking is performed using the Checkstyle plugin,
          using the properties specified in <kbd>checkstyle.xml</kbd>.
          Committed code <i>should</i> generate no Checkstyle errors.  One thing
          that Checkstyle will complain about is tabs included in the code code.
          Please make sure to set your IDE or editor to use spaces instead of tabs.
        </p>
        <p>
          Committers should configure the git repository or global settings for:
        </p>
        <source>user.name
user.email</source>
        <p>These settings define the identity and mail of the committer. See <a
          href="https://www.git-scm.com/book/en/Customizing-Git-Git-Configuration">Customizing
          Git - Git Configuration</a> in the git book for explanation about how to
          configure these settings and more.
        </p>
      </subsection>
      <subsection name='Documentation'>
        <ul>
          <li>
            Committed code <i>must</i> include full javadoc.
          </li>
          <li>
            All component contracts <i>must</i> be fully specified in the javadoc class,
            interface or method comments, including specification of acceptable ranges
            of values, exceptions or special return values.
          </li>
          <li>
            External references or full statements of definitions for all the
            terms used in component documentation <i>must</i> be provided.
          </li>
          <li>
            Commons RNG javadoc generation supports embedded LaTeX formulas via the
            <a href="https://www.mathjax.org">MathJax</a> javascript display engine.
            To embed mathematical expressions formatted in LaTeX in javadoc, simply surround
            the expression to be formatted with either <kbd>\(</kbd> and <kbd>\)</kbd>
            for inline formulas (or <kbd>\[</kbd> and <kbd>\]</kbd> to have the formula
            appear on a separate line).
            For example,
            <kbd>\(</kbd> <kbd>a^2 + b^2 = c^2</kbd> <kbd>\)</kbd>
            will render an in-line formula
            saying that <kbd>(a, b, c)</kbd> is a Pythagorean triplet: \( a^2 + b^2 = c^2 \).
            <br/>
            See the MathJax and LaTex documentation for details on how to represent formulas
            and escape special characters.
          </li>
          <li>
            Implementations <i>should</i> use standard algorithms and
            references or full descriptions of all algorithms <i>should</i> be
            provided.
          </li>
          <li>
            Additions and enhancements <i>should</i> include updates to the User
            Guide.
          </li>
        </ul>
      </subsection>
      <subsection name='Exceptions'>
        <ul>
          <li>
            Exceptions generated by Commons RNG are all unchecked.
          </li>
          <li>
            All public methods advertise all exceptions that they can generate.
            Exceptions <i>must</i> be documented in Javadoc and the documentation
            <i>must</i> include full description of the conditions under which
            exceptions are thrown.
          </li>
        </ul>
      </subsection>
      <subsection name='Unit Tests'>
        <ul>
          <li>
            Committed code <i>must</i> include unit tests.
          </li>
          <li>
            Unit tests <i>should</i> provide full path coverage.
          </li>
          <li>
            Unit tests <i>should</i> verify all boundary conditions specified in
            interface contracts, including verification that exceptions are thrown or
            special values (e.g. Double.NaN, Double.Infinity) are returned as
            expected.
          </li>
        </ul>
      </subsection>
      <subsection name='Licensing and copyright'>
        <ul>
          <li>
            All new source file submissions <i>must</i> include the Apache Software
            License in a comment that begins the file.
          </li>
          <li>
            All contributions must comply with the terms of the Apache
            <a href="https://www.apache.org/licenses/contributor-agreements.html">Contributor License
            Agreement (CLA)</a>.
          </li>
          <li>
            Patches <i>must</i> be accompanied by a clear reference to a "source"
            - if code has been "ported" from another language, clearly state the
            source of the original implementation.  If the "expression" of a given
            algorithm is derivative, please note the original source (textbook,
            paper, etc.).
          </li>
          <li>
            References to source materials covered by restrictive proprietary
            licenses should be avoided.  In particular, contributions should not
            implement or include references to algorithms in
            <a href="http://numerical.recipes/">Numerical Recipes (NR)</a>.
            Any questions about copyright or patent issues should be raised on
            the commons-dev mailing list before contributing or committing code.
          </li>
        </ul>
      </subsection>
    </section>
  </body>
</document>
