<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
          "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
          "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">

<!-- Checkstyle configuration for Vaadin that is based on the the sun coding
    conventions from:
    - the Java Language Specification at http://java.sun.com/docs/books/jls/second_edition/html/index.html
    - the Sun Code Conventions at http://java.sun.com/docs/codeconv/
    - the Javadoc guidelines at http://java.sun.com/j2se/javadoc/writingdoccomments/index.html
    - the JDK Api documentation http://java.sun.com/j2se/docs/api/index.html
    - some best practices Vaadin specific changes:
    - Removed DoubleCheckedLocking because it doesn't work in CheckStyle 5.6
    -> http://www.smartics.eu/bugzilla/show_bug.cgi?id=593
    - Modified HiddenField Check to allow field shadowing on Constructor, Setter
    and Abstract Method parameters.
    - Modified StaticVariableName Check format for PUBLIC variables from ^[a-z][a-zA-Z0-9]*$
    to ^[A-Z_]*$ . Others (protected, package and private) still have ^[a-z][a-zA-Z0-9]*$
    - Modified the severity of the following Checks from error to info:
    • JavadocPackage (checks for package-info.java)
    - Modified the severity of the following Checks from error to warning and the scope from private to protected:
    • JavadocType (class and interface declarations)
    • JavadocMethod (method declarations)
    • JavadocVariable (variable declarations)
    • JavadocStyle (Javadocs are "well formed")
    - Modified the severity of the following Checks from error to warning because not so critical:
    • LineLenght (the default value is 80 which is also used in formatter, but
    i.e. member declarations are not wrapped onto next line)
    • RedundantModifier (i.e. using public in interface method declarations)
    • RedundantThrows (causes unnecessary fails when can't get class information)
    • MethodLength (default maxLength is 150)
    • ParameterNumber (default maxLength is 7)
    • EmptyBlock (if-else statements have some blocks if x -> no action)
    • UpperEll (should use L instead of l with long)
    • TodoComment (not serious)
    • WhitespaceAroundCheck (expects whitespace around some operators)
    NOTE other checks are also warning but should be error.
    - Modified the severity of the following Checks from error to ignore:
    • FinalParameters (method parameters can be modified)
    • VisibilityModifier (i.e. in state classes public members are allowed)
    • DesignForExtension (this design is not used)
    • FileLength (bad design to have files with over 2000 lines? see VScrollTable)
    • MagicNumber (MagicNumbers like error codes are used, but could just ignore
    this in some classes)
    • AvoidInlineConditionals ( you like these ? ignore : error ) -->

<module name="Checker">
    <!-- If you set the basedir property below, then all reported file names 
        will be relative to the specified directory. See http://checkstyle.sourceforge.net/5.x/config.html#Checker 
        <property name="basedir" value="${basedir}"/> -->

    <!-- Checks that a package-info.java file exists for each package. -->
    <!-- See http://checkstyle.sf.net/config_javadoc.html#JavadocPackage -->
<!--
    <module name="JavadocPackage">
        <property name="severity" value="info" />
    </module>
-->

    <!-- Checks whether files end with a new line. -->
    <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -->
    <module name="NewlineAtEndOfFile">
        <property name="severity" value="warning" />
    </module>

    <!-- Checks that property files contain the same keys. -->
    <!-- See http://checkstyle.sf.net/config_misc.html#Translation -->
    <module name="Translation">
        <property name="severity" value="warning" />
    </module>

    <!-- Checks for Size Violations. -->
    <!-- See http://checkstyle.sf.net/config_sizes.html -->
    <module name="FileLength">
        <property name="severity" value="ignore" />
    </module>

    <!-- Checks for whitespace -->
    <!-- See http://checkstyle.sf.net/config_whitespace.html -->
    <module name="FileTabCharacter">
        <property name="severity" value="warning" />
    </module>

    <!-- Checks for Headers -->
    <!-- See http://checkstyle.sf.net/config_header.html -->
    <module name="Header">
        <property name="headerFile" value="${checkstyle.header.file}" />
        <property name="fileExtensions" value="java" />
        <!-- ignore empty lines that may or may not have trailing white-space -->
        <property name="ignoreLines" value="3, 7, 9"/>
    </module>

    <module name="TreeWalker">
        <property name="severity" value="warning" />

        <!-- Custom checks to check serializable, neither is working because 
            checkstyle can't load the classes. <module name="com.vaadin.checks.CheckClassesSerializable"/> 
            <module name="com.vaadin.checks.IsSerializableClassCheck"/> -->

        <!-- Checks for Javadoc comments. -->
        <!-- See http://checkstyle.sf.net/config_javadoc.html -->
        <module name="JavadocMethod">
            <property name="severity" value="warning" />
            <property name="scope" value="protected" />
        </module>
        <module name="JavadocType">
            <property name="severity" value="warning" />
            <property name="scope" value="protected" />
                    </module>
        <module name="JavadocVariable">
            <property name="severity" value="warning" />
            <property name="scope" value="protected" />
        </module>
        <module name="JavadocStyle">
            <property name="severity" value="warning" />
            <property name="scope" value="protected" />
        </module>

        <!-- Checks for Naming Conventions. -->
        <!-- See http://checkstyle.sf.net/config_naming.html -->
        <module name="ConstantName" />
        <module name="LocalFinalVariableName" />
        <module name="LocalVariableName" />
        <module name="MemberName" />
        <module name="MethodName" />
        <module name="PackageName" />
        <module name="ParameterName" />
        <module name="StaticVariableName">
            <property name="applyToPublic" value="false" />
        </module>
        <module name="StaticVariableName">
            <property name="applyToPublic" value="true" />
            <property name="applyToProtected" value="false" />
            <property name="applyToPackage" value="false" />
            <property name="applyToPrivate" value="false" />
            <property name="format" value="^[A-Z_]*$" />
        </module>
        <module name="TypeName" />


        <!-- Checks for imports -->
        <!-- See http://checkstyle.sf.net/config_import.html -->
        <module name="AvoidStarImport" />
        <module name="IllegalImport" /> <!-- defaults to sun.* packages -->
        <module name="RedundantImport" />
        <module name="UnusedImports" />
<!--
        <module name="ImportControl">
            <property name="file" value="${checkstyle.importControl.file}" />
            <property name="severity" value="error" />
        </module>
-->

        <!-- Checks for Size Violations. -->
        <!-- See http://checkstyle.sf.net/config_sizes.html -->
        <!--
        <module name="LineLength">
            <property name="severity" value="warning" />
        </module>
        -->
        <module name="MethodLength">
            <property name="severity" value="warning" />
        </module>
        <module name="ParameterNumber">
            <property name="severity" value="warning" />
        </module>


        <!-- Checks for whitespace -->
        <!-- See http://checkstyle.sf.net/config_whitespace.html -->
        <module name="EmptyForIteratorPad" />
        <module name="GenericWhitespace" />
        <module name="MethodParamPad" />
        <module name="NoWhitespaceAfter">
            <property name="tokens" value="BNOT,DEC,DOT,INC,LNOT,UNARY_MINUS,UNARY_PLUS"/>
        </module>
        <module name="NoWhitespaceBefore" />
        <module name="OperatorWrap" />
        <module name="ParenPad" />
        <module name="TypecastParenPad" />
        <module name="WhitespaceAfter" />
        <module name="WhitespaceAround" />
        <!-- Check for trailing white space in Java code -->
        <module name="RegexpSinglelineJava">
            <!-- Ensure no whitespace at the end of line, excluding comments -->
            <property name="format" value="\s+$" />
            <property name="minimum" value="0" />
            <property name="maximum" value="0" />
            <property name="message"
                value="Java code has trailing white space." />
            <property name="severity" value="warning" />
            <property name="ignoreComments" value="true" />
        </module>

        <!-- Modifier Checks -->
        <!-- See http://checkstyle.sf.net/config_modifiers.html -->
        <module name="ModifierOrder" />
        <!--
        <module name="RedundantModifier">
            <property name="severity" value="warning" />
        </module>
        -->


        <!-- Checks for blocks. You know, those {}'s -->
        <!-- See http://checkstyle.sf.net/config_blocks.html -->
        <module name="AvoidNestedBlocks" />
        <module name="EmptyBlock">
            <property name="severity" value="warning" />
        </module>
        <module name="LeftCurly" />
        <module name="NeedBraces" />
        <module name="RightCurly" />


        <!-- Checks for common coding problems -->
        <!-- See http://checkstyle.sf.net/config_coding.html -->
        <module name="AvoidInlineConditionals">
            <property name="severity" value="ignore" />
        </module>
        <module name="EmptyStatement" />
        <module name="EqualsHashCode" />
        <!--
        <module name="HiddenField">
            <property name="ignoreConstructorParameter" value="true" />
            <property name="ignoreSetter" value="true" />
            <property name="ignoreAbstractMethods" value="true" />
        </module>
        -->
        <module name="IllegalInstantiation" />
        <module name="InnerAssignment" />
        <module name="MagicNumber">
            <property name="severity" value="ignore" />
        </module>
        <module name="MissingSwitchDefault" />
        <module name="SimplifyBooleanExpression" />
        <module name="SimplifyBooleanReturn" />

        <!-- Checks for class design -->
        <!-- See http://checkstyle.sf.net/config_design.html -->
        <module name="DesignForExtension">
            <property name="severity" value="ignore" />
        </module>
        <module name="HideUtilityClassConstructor" />
        <module name="InterfaceIsType" />
        <module name="VisibilityModifier">
            <property name="severity" value="ignore" />
        </module>


        <!-- Miscellaneous other checks. -->
        <!-- See http://checkstyle.sf.net/config_misc.html -->
        <module name="ArrayTypeStyle" />
        <module name="FinalParameters">
            <property name="severity" value="ignore" />
        </module>
        <module name="TodoComment">
            <property name="severity" value="warning" />
        </module>
        <module name="UpperEll">
            <property name="severity" value="warning" />
        </module>

        <!-- Check for System.err/out.println -->
        <module name="RegexpSinglelineJava">
            <property name="format" value="System\.out\.println" />
        </module>
        <module name="RegexpSinglelineJava">
            <property name="format" value="System\.err\.println" />
        </module>
        
    </module>

    <module name="SuppressionFilter">
        <property name="file" value="${config_loc}/suppressions.xml" />
    </module>

</module>