<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<!--
   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.
-->
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
        <meta name="Author" content="Malcolm Edgar"/>
        <meta name="description" lang="en" content="Apache Click Java web application framework"/>
        <meta name="keywords" lang="en" content="Apache Click, Click Framework, Java, JEE, J2EE, web application framework, open source"/>
        <title>Apache Click Contribute</title>
        <link rel="stylesheet" type="text/css" href="../../help.css"/>
        <style type="text/css">
            th { text-align: left; }
            td { vertical-align: top; white-space: nowrap; }
        </style>
    </head>
    <body>

        <h1>Contributing</h1>

        There are various ways to contribute:

        <ul>
            <li>
                Join the <a href="click-online.html#mailing-lists">mailing lists</a> and answer
                questions raised by users.
            </li>
            <li>
                Participate in discussions around new features, bugs and documentation.
            </li>
            <li>
                Report bugs and features on <a href="https://issues.apache.org/jira/browse/CLK">JIRA</a>.
            </li>
            <li>
                Contribute new controls, features and patches to <a href="https://issues.apache.org/jira/browse/CLK">JIRA</a>.
            </li>
        </ul>

        <h3>Click Extras</h3>
        Click Extras provides a place for people to contribute their own code to the
        Click project and have it package with the standard distribution. Contributed
        code will be subject to review and may require modifications before it is
        included in the Click distribution.
        <p/>

        <h3>Design</h3>
        One of the overriding design principles with Click is to keep it simple, this
        makes the code easier to understand and more reliable.
        <p/>
        Another guiding principle is YAGNI (You Ain't Going to Need It), or don't build
        it until you really really need it. Click is trying to provide an 80/20 rule framework
        where 80% of peoples needs are meet by a framework which is only 20% in size.
        <p/>
        When developing Click Extras contributions please follow these principles.

        <h3>Auto File Deployment</h3>
        To make preconfigured resources (templates, stylesheets, etc.) available to web applications
        Click automatically deploys configured classpath resources to the <tt class="blue">/click</tt>
        directory at startup (existing files will not be overwritten).
        <p/>
        To enable your controls to deploy resources on startup place the resources
        in the Click Extras JAR directory 'META-INF/resources/'. See the section
        <a href="../user-guide/html/ch04s03.html#deploying-custom-resources">Deploying Custom Resources</a>
        for more information on resource deployment.

        <h3>Coding Style and Practices</h3>

        Click follows the Sun conversions for Java code style. Other style convertions
        and practices include:
        <ul style="margin-top:0.75em;margin-bottom:0.75em;">
            <li>indents are 4 spaces wide and no tabs are used</li>
            <li>public and protected visibility members require Javadoc</li>
            <li>private and package visiblity members do not require Javadoc</li>
            <li>favour the use of unchecked <tt>RuntimeException</tt> and avoid creating new Exception classes</li>
            <li>check method parametes and throw <tt>IllegalArguementException</tt> if parameters are null or invalid</li>
            <li>avoid creating any more classes than you need to get the job done</li>
            <li>localize control messages in the classe's <tt>properties</tt> files</li>
            <li>use the <tt>Context.getLocale()</tt> method to obtain a users locale</li>
            <li>before checking in code run the Ant task: <tt>ant format-java</tt>
        </ul>


    </body>
</html>

