= Contributing

This document defines the different ways available for contributing to the Apache James project.

To keep you informed on James issues, subscribe to the relevant xref:mailing-lists.adoc[mailing lists].

== Be involved in the community

An easy start is to be involved in the community.

Share your experiences with James, your needs, your enhancements proposition via the
xref:mailing-lists.adoc[mailing lists], on https://gitter.im/apache/james-project[Gitter], or on our
https://issues.apache.org/jira/projects/JAMES/issues[Bug Tracker].

Don't hesitate to write articles and blog posts. Use your preferred media to spread the love!

== Reporting bugs

Many improvements come as a direct result of bug reports.

To report a bug, please use the appropriate Bug Tracker JIRA link according to the project you want to address:

* https://issues.apache.org/jira/browse/JAMES[Server]
* https://issues.apache.org/jira/browse/MAILET[Mailet]
* https://issues.apache.org/jira/browse/MAILBOX[Mailbox]
* https://issues.apache.org/jira/browse/PROTOCOLS[Protocols]
* https://issues.apache.org/jira/browse/MPT[MPT]
* https://issues.apache.org/jira/browse/MIME4J[Mime4j]
* https://issues.apache.org/jira/browse/JSIEVE[jSieve]
* https://issues.apache.org/jira/browse/JSPF[jSPF]
* https://issues.apache.org/jira/browse/JDKIM[jDKIM]

Once you are logged on the appropriate JIRA page, click on the red Create button, then complete the different fields
as accurately as possible, so that any user can reproduce the reported bug. Also, note that all your information must be
readable (use markdown).

Then, you have to click on Create to submit your bug.

=== Reporting security vulnerabilities

http://www.apache.org/security/[Security vulnerabilities] should be announced to the Apache Security team.
PMCs will be notified about them, and will work hard to propose fixes as fast as possible.

Specific details about security in James can be found here.

== Documentation

Documentation is an easy way to get on board! Check out the
link:https://issues.apache.org/jira/issues/?jql=project%20%3D%20JAMES%20AND%20resolution%20%3D%20Unresolved%20AND%20labels%20%3D%20documentation%20ORDER%20BY%20priority%20DESC%2C%20updated%20DESC[~documentation]
label on JIRA to get some ideas.
Report on JIRA the typos you spot, the information you miss, and any improvement you can think of.
The next step is to contribute the documentation changes via https://github.com/apache/james-project/tree/master/docs/modules[Git].

To edit an existing document try to edit the adoc version in `docs/modules` (check it out from Git) and if you can, submit a
patch as for xref:_code_patches[Code Patches].

If you want to contribute new files please try to use the AsciiDoc format as shown in `docs/modules`.

If all this seems like unnecessary nonsense, send us whatever you like, we'd still be happy to receive good documentation.

Each of the Apache James projects has its own documentation maintained with the automated build. Once a build is done,
the documentation can be further committed in the https://git-wip-us.apache.org/repos/asf/james-site.git[site module]
which will be automatically published via gitpubsub to http://james.apache.org[Apache James web site].

== Idea or design proposals

People can submit ideas, features or design changes proposals by discussing it through the
xref:mailing-lists.adoc[mailing lists].

Structuring design changes are tracked by link:https://github.com/joelparkerhenderson/architecture-decision-record[ADRs]
(Architecture Decision Records). A discussion on the mailing list getting a consensus of the community can be the object
of the writing of an ADR to confirm the change agreed upon. The Project Member Committee will take care of maintaining such
records but anyone should feel free to help on such a task by proposing ADRs related to his work.

ADRs *MUST* be submitted under the folder `src/adr` via a pull request. The standards used for writing an ADR are
described in the https://github.com/apache/james-project/blob/master/src/adr/0001-record-architecture-decisions.md[first ADR]
written for the Apache James project.

The number of the ADR should be incremental. If another ADR gets merged concurrently, the committer is responsible for
updating its number accordingly.

When the ADR reaches a consensus within the community and is accepted, it can be merged and goes into effect.

An ADR can't be removed after being accepted and merged. However, a new ADR can supersede a previous one. This is so
we are able to keep track on all the decisions being made regarding the project.

== How to contribute some code?

We encourage discussions prior code contributions on the xref:mailing-lists.adoc[mailing lists]. For significant design
changes the writing of xref:#_idea_or_design_proposals[ADRs] is encouraged.

Your code contribution *must* be backed by a xref:_reporting_bugs[JIRA ticket].

* Clone the source code of the project from its link:git://git.apache.org/james-project.git[apache git repository] or its
https://github.com/apache/james-project[Github]
* Create your branch and name it with the JIRA ticket number.
* Create a Pull Request on Github with your branch name and prefix its different commits with the same name.
* A build will be started for your work on the link:https://ci-builds.apache.org/job/james/job/ApacheJames/[Apache CI].
* Active contributors will review your work, and merge it.

A valid commit comment might be:

```
JAMES-2285 My awesome commit title

Here is some more details about what my commit does, and the rationals of the choice I took.
```

Alternatively you can create a patch as xref:_code_patches[outlined below], and attach it to the JIRA ticket.

=== Licenses

All contributions to the James project are made under the https://www.apache.org/licenses[Apache license 2.0]

=== Contributions proposals

* We reference some easy tasks to start with:
https://issues.apache.org/jira/issues/?jql=project%20%3D%20JAMES%20AND%20resolution%20%3D%20Unresolved%20AND%20labels%20%3D%20newbie%20ORDER%20BY%20priority%20DESC%2C%20updated%20DESC[~newbie]
* We have a collection of minor fixes awaiting contributions:
https://issues.apache.org/jira/issues/?jql=project%20%3D%20JAMES%20AND%20resolution%20%3D%20Unresolved%20AND%20labels%20%3D%20easyfix%20ORDER%20BY%20priority%20DESC%2C%20updated%20DESC[~easyfix]
* Challenge yourself with some cool features we thought to:
https://issues.apache.org/jira/issues/?jql=project%20%3D%20JAMES%20AND%20resolution%20%3D%20Unresolved%20AND%20labels%20%3D%20feature%20ORDER%20BY%20priority%20DESC%2C%20updated%20DESC[~feature]

Additional ideas are more than welcome. Don't hesitate to discuss that with us!

=== Coding standards

While we are glad to accept contributions to documentation from anyone, in almost any format, because its much better
than none, please consider these guidelines to help us to assimilate your contribution.

Submissions to the James project must follow the coding conventions outlined in the
link:https://github.com/apache/james-project/blob/master/checkstyle.xml[checkstyle document], which runs
upon `mvn compile` and all phases which depend on `compile`. Not respecting it will halt the build, and means
your contribution would not be
acceptable.


*Developers who commit code that does not follow the coding conventions outlined in this document will be responsible
for fixing their own code.* `.

[start=3]
. Four spaces. *No tabs.* Period.
The James mailing list receives commit messages that are almost impossible to read if tabs are used.
. Use Unix linefeeds for all .java source code files. Only platform-specific files (e.g. .bat files for Windows) should
contain non-Unix linefeeds.
. Javadoc *MUST* exist on all API methods. Contributing a missing javadoc for any method, class, variable, etc., will be
GREATLY appreciated as this will help to improve the James project.
. The standard Apache license header *MUST* be placed at the top of every file.
. Your change set *MUST* be covered by tests. We also strongly appreciate integration tests.
. We also  require the following best practice regarding maven and the *pom.xml*:

** Define your dependency versions in james-project pom.xml. This structurally ensures all projects get the same version,
and that there is no version clashes.
** Don't use _org.apache.james_ groupId for internal dependencies. Use _${james.groupId}_. If not, you break the policies
for automatic sorting, as well as make it more ambiguous. One exception is apache-mime4j-* artifacts which share the
james groupId despite living in a different repository.
** You should be ordering your dependencies. The sort order of tags and dependencies in the pom is automatically enforced at build time. By default the build
will fail if violations are detected.

The pom file ordering can be quickly checked using :
```
mvn validate
```
If you get an error and want the tool to fix it for you, you can use :
```
mvn validate -PsortPom
```
The `sortPom` profile can be used on all maven phases. Make sure to review the changes made by the tool, it is known to
sometimes remove whitespaces which may not be desirable.

=== Code patches

While we definitely prefer receiving contributions under the form of xref:#_how_to_contribute_some_code[Github pull requests],
in order to still be vendor neutral on the contribution process, we do accept submission of patches, in a process described
below.

Patches should be attached to the corresponding JIRA issue.

Always use diff -u to generate patches, so we can apply them using 'patch'.

Make sure the patch only contains what is intended, your checkout could be outdated.

Make sure it conforms to the code standards, otherwise it may be ignored. It is OK to make a single patch covering
several files, but please only one issue at a time.

Briefly outline the reason for your patch, the solution your patch implements, why a patch is needed and why your code
will solve the problem. Note any bug numbers your patch addresses.

The reason for these rules is so that committers can easily see what you are trying to achieve, it is their
responsibility to manage the code and review submissions, if you make it easy for them to see what you are doing your
patch is more likely to be committed quickly.
