<?xml version="1.0"?>

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

<!--

This file is part of Cadmium.
Copyright (C) 2007-2010 Xavier Clerc.

Cadmium is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

Cadmium is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

-->

<module name="Checker">

  <module name="SuppressionFilter">
    <property name="file" value="checkstyle_suppr.xml"/>
  </module>

  <module name="TreeWalker">
    <!-- ANNOTATIONS -->
    <module name="AnnotationUseStyle"/>
    <module name="MissingDeprecated"/>
    <module name="MissingOverride"/>
    <module name="PackageAnnotation"/>
    <module name="SuppressWarnings"/>

    <!-- BLOCKS CHECKS -->
    <module name="EmptyBlock">
      <property name="option" value="text"/>
    </module>
    <module name="LeftCurly">
      <property name="option" value="eol"/>
      <property name="maxLineLength" value="100"/>
    </module>
    <module name="NeedBraces"/>
    <module name="RightCurly">
      <property name="option" value="same"/>
    </module>
    <module name="AvoidNestedBlocks">
      <property name="allowInSwitchCase" value="false"/>
    </module>

    <!-- CLASS DESIGN -->
    <module name="VisibilityModifier">
      <property name="packageAllowed" value="false"/>
      <property name="protectedAllowed" value="false"/>
      <property name="publicMemberPattern" value="^serialVersionUID$"/>
    </module>
    <module name="FinalClass"/>
    <module name="InterfaceIsType">
      <property name="allowMarkerInterfaces" value="true"/>
    </module>
    <module name="HideUtilityClassConstructor"/>
    <module name="DesignForExtension"/>
    <module name="MutableException"/>
    <module name="ThrowsCount">
      <property name="max" value="3"/>
    </module>

    <!-- CODING -->
    <module name="CovariantEquals"/>
    <module name="DoubleCheckedLocking"/>
    <module name="EmptyStatement"/>
    <module name="EqualsHashCode"/>
    <module name="FinalLocalVariable">
      <property name="tokens" value="PARAMETER_DEF,VARIABLE_DEF"/>
    </module>
    <module name="HiddenField">
      <property name="ignoreConstructorParameter" value="false"/>
      <property name="ignoreSetter" value="false"/>
      <property name="ignoreAbstractMethods" value="false"/>
    </module>
    <module name="IllegalInstantiation">
      <property name="classes" value="java.lang.Boolean"/>
    </module>
    <module name="IllegalToken">
      <property name="tokens" value="LITERAL_NATIVE"/>
    </module>
    <module name="IllegalTokenText">
      <property name="tokens" value="NUM_INT,NUM_LONG"/>
      <property name="format" value="^0[^lx]"/>
      <property name="ignoreCase" value="true"/>
      <property name="message" value="No leading zeroes in integer literal (except hexadecimal one)"/>
    </module>
    <module name="InnerAssignment"/>
    <!-- deactivated because interpreter code contains a lot of ad hoc constants
    <module name="MagicNumber">
      <property name="tokens" value="NUM_DOUBLE,NUM_FLOAT,NUM_INT,NUM_LONG"/>
      <property name="ignoreNumbers" value="-1,0,1,2,3,4,5"/>
    </module>
    -->
    <module name="MissingSwitchDefault"/>
    <module name="ModifiedControlVariable"/>
    <module name="RedundantThrows">
      <property name="allowUnchecked" value="true"/>
      <property name="allowSubclasses" value="false"/>
    </module>
    <module name="SimplifyBooleanExpression"/>
    <module name="SimplifyBooleanReturn"/>
    <module name="StringLiteralEquality"/>
    <module name="NestedIfDepth">
      <property name="max" value="2"/>
    </module>
    <module name="NestedTryDepth">
      <property name="max" value="1"/>
    </module>
    <module name="SuperClone"/>
    <module name="SuperFinalize"/>
    <module name="IllegalCatch">
      <property name="illegalClassNames" value="java.lang.Error,java.lang.Exception,java.lang.RuntimeException"/>
    </module>
    <module name="IllegalThrows">
      <property name="illegalClassNames" value="java.lang.Throwable,java.lang.Error,java.lang.Exception,java.lang.RuntimeException"/>
    </module>
    <module name="PackageDeclaration"/>
    <module name="JUnitTestCase"/>
    <module name="ReturnCount">
      <property name="max" value="4"/>
    </module>
    <module name="IllegalType"/>
    <module name="DeclarationOrder"/>
    <module name="ParameterAssignment"/>
    <module name="ExplicitInitialization"/>
    <module name="DefaultComesLast"/>
    <module name="MissingCtor"/>
    <module name="FallThrough"/>
    <module name="MultipleStringLiterals">
      <property name="allowedDuplicates" value="5"/>
      <property name="ignoreStringsRegexp" value="null .*"/>
    </module>
    <module name="MultipleVariableDeclarations"/>
    <module name="RequireThis">
      <property name="checkFields" value="true"/>
      <property name="checkMethods" value="false"/>
    </module>
    <module name="UnnecessaryParentheses"/>

    <!-- IMPORTS -->
    <module name="AvoidStarImport"/>
    <module name="AvoidStaticImport"/>
    <module name="IllegalImport"/>
    <module name="RedundantImport"/>
    <module name="UnusedImports"/>
    <module name="ImportOrder">
      <property name="option" value="under"/>
      <property name="groups" value="java,javax,com,net,org,junit,fr"/>
      <property name="ordered" value="true"/>
      <property name="separated" value="true"/>
      <property name="caseSensitive" value="true"/>
    </module>

    <!-- JAVADOC  -->
    <module name="JavadocType">
      <property name="scope" value="private"/>
      <property name="authorFormat" value="Xavier Clerc"/>
      <property name="versionFormat" value="([0-9]\.)+[0-9]"/>
      <property name="allowMissingParamTags" value="false"/>
      <property name="tokens" value="INTERFACE_DEF,CLASS_DEF"/>
    </module>
    <module name="JavadocMethod">
      <property name="scope" value="private"/>
      <property name="allowUndeclaredRTE" value="false"/>
      <property name="allowThrowsTagsForSubclasses" value="false"/>
      <property name="allowMissingParamTags" value="false"/>
      <property name="allowMissingThrowsTags" value="false"/>
      <property name="allowMissingReturnTag" value="false"/>
      <property name="allowMissingJavadoc" value="false"/>
      <property name="allowMissingPropertyJavadoc" value="false"/>
      <property name="tokens" value="METHOD_DEF,CTOR_DEF"/>
    </module>
    <module name="JavadocVariable">
      <property name="scope" value="private"/>
    </module>
    <module name="JavadocStyle">
      <property name="scope" value="private"/>
      <property name="checkFirstSentence" value="true"/>
      <property name="checkEmptyJavadoc" value="true"/>
      <property name="checkHtml" value="true"/>
      <property name="tokens" value="INTERFACE_DEF,CLASS_DEF,METHOD_DEF,CTOR_DEF,VARIABLE_DEF"/>
    </module>

    <!-- METRICS -->
    <module name="BooleanExpressionComplexity"/>
    <module name="ClassDataAbstractionCoupling"/>
    <module name="ClassFanOutComplexity"/>
    <module name="CyclomaticComplexity"/>
    <module name="NPathComplexity"/>
    <module name="JavaNCSS"/>

    <!-- MISCELLANEOUS -->
    <module name="TodoComment">
      <property name="format" value="XXX"/>
    </module>
    <module name="UncommentedMain">
      <property name="excludedClasses" value=".*\.Main$"/>
    </module>
    <module name="UpperEll"/>
    <module name="ArrayTypeStyle"/>
    <module name="FinalParameters">
      <property name="tokens" value="METHOD_DEF,CTOR_DEF,LITERAL_CATCH"/>
    </module>
    <!-- deactivated because Emacs rules are different
    <module name="Indentation"/>
    -->

    <!-- MODIFIERS -->
    <module name="ModifierOrder"/>
    <module name="RedundantModifier"/>

    <!-- NAMING CONVENTIONS -->
    <module name="AbstractClassName"/>
    <module name="ClassTypeParameterName"/>
    <module name="ConstantName"/>
    <module name="LocalFinalVariableName"/>
    <module name="LocalVariableName"/>
    <module name="MemberName"/>
    <module name="MethodName">
      <property name="format" value="^[a-z][a-zA-Z0-9_]*$"/>
    </module>
    <module name="MethodTypeParameterName"/>
    <module name="PackageName"/>
    <module name="ParameterName"/>
    <module name="StaticVariableName"/>
    <module name="TypeName"/>

    <!-- SIZE VIOLATIONS -->
    <module name="ExecutableStatementCount">
      <property name="max" value="48"/>
      <property name="tokens" value="CTOR_DEF,METHOD_DEF,INSTANCE_INIT,STATIC_INIT"/>
    </module>
    <module name="LineLength">
      <property name="max" value="128"/>
    </module>
    <module name="MethodLength">
      <property name="max" value="150"/>
      <property name="countEmpty" value="true"/>
      <property name="tokens" value="METHOD_DEF,CTOR_DEF"/>
    </module>
    <module name="AnonInnerLength">
      <property name="max" value="20"/>
    </module>
    <module name="ParameterNumber">
      <property name="max" value="7"/>
      <property name="tokens" value="METHOD_DEF,CTOR_DEF"/>
    </module>
    <module name="OuterTypeNumber">
      <property name="max" value="1"/>
    </module>

    <!-- WHITESPACE -->
    <module name="GenericWhitespace"/>
    <module name="EmptyForInitializerPad"/>
    <module name="EmptyForIteratorPad"/>
    <module name="MethodParamPad"/>
    <module name="NoWhitespaceAfter"/>
    <module name="NoWhitespaceBefore"/>
    <module name="OperatorWrap"/>
    <module name="ParenPad"/>
    <module name="TypecastParenPad"/>
    <module name="WhitespaceAfter"/>
    <module name="WhitespaceAround"/>
  </module>

  <!-- DUPLICATE CODE -->
  <module name="StrictDuplicateCode">
      <property name="min" value="12"/>
  </module>

  <!-- HEADER -->
  <module name="Header">
    <property name="headerFile" value="reports/header.java"/>
  </module>

  <!-- JAVADOC  -->
  <module name="JavadocPackage"/>

  <!-- MISCELLANEOUS -->
  <module name="NewlineAtEndOfFile"/>
  <module name="Translation"/>

  <!-- SIZE VIOLATIONS -->
  <module name="FileLength">
    <property name="max" value="1000"/>
  </module>

  <!-- WHITESPACE -->
  <module name="FileTabCharacter"/>

  <!-- CUSTOM CHECKS -->
  <module name="RegexpSingleline">
    <property name="format" value="System\.(.*)\.print"/>
    <property name="message" value="System.out / System.err output is for debug"/>
  </module>
  <module name="RegexpSingleline">
    <property name="format" value="\s$"/>
    <property name="message" value="Trailing whitespace at end of line"/>
  </module>

</module>
