<?xml version="1.0"?>
<!--
  ~ QQQ - Low-code Application Framework for Engineers.
  ~ Copyright (C) 2021-2022.  Kingsrook, LLC
  ~ 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
  ~ contact@kingsrook.com
  ~ https://github.com/Kingsrook/
  ~
  ~ This program is free software: you can redistribute it and/or modify
  ~ it under the terms of the GNU Affero General Public License as
  ~ published by the Free Software Foundation, either version 3 of the
  ~ License, or (at your option) any later version.
  ~
  ~ This program 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 Affero General Public License for more details.
  ~
  ~ You should have received a copy of the GNU Affero General Public License
  ~ along with this program.  If not, see <https://www.gnu.org/licenses/>.
  -->

<!DOCTYPE module PUBLIC
        "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
        "http://checkstyle.sourceforge.net/dtds/configuration_1_3.dtd">
<!--
   See reference at https://checkstyle.sourceforge.io/checks.html
-->
<module name = "Checker">
   <property name="charset" value="UTF-8"/>

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

   <property name="fileExtensions" value="java, properties, xml"/>
   <!-- Checks for whitespace                        -->
   <!-- See http://checkstyle.sf.net/config_whitespace.html -->
   <module name="FileTabCharacter">
      <property name="eachLine" value="true"/>
   </module>

   <!--
   <module name="LineLength">
      <property name="max" value="100"/>
      <property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
   </module>
   -->

   <module name="TreeWalker">
      <module name="SuppressWarningsHolder"/>
      <module name="OuterTypeFilename"/>
      <module name="IllegalTokenText">
         <property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
         <property name="format" value="\\u00(09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
         <property name="message" value="Consider using special escape sequence instead of octal value or Unicode escaped value."/>
      </module>
      <module name="AvoidEscapedUnicodeCharacters">
         <property name="allowEscapesForControlCharacters" value="true"/>
         <property name="allowByTailComment" value="true"/>
         <property name="allowNonPrintableEscapes" value="true"/>
      </module>
      <module name="AvoidStarImport"/>
      <module name="OneTopLevelClass"/>
      <module name="NoLineWrap"/>
      <module name="EmptyBlock">
         <property name="option" value="TEXT"/>
         <property name="tokens" value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
      </module>
      <module name="NeedBraces"/>
      <module name="LeftCurly">
         <property name="option" value="nl"/>
      </module>
      <module name="RightCurly">
         <property name="option" value="alone"/>
      </module>
      <!--
      <module name="WhitespaceAround">
         <property name="allowEmptyConstructors" value="true"/>
         <property name="allowEmptyMethods" value="true"/>
         <property name="allowEmptyTypes" value="true"/>
         <property name="allowEmptyLoops" value="true"/>
         <message key="ws.notFollowed"
          value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/>
          <message key="ws.notPreceded"
          value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
      </module>
      -->
      <module name="OneStatementPerLine"/>
      <module name="MultipleVariableDeclarations"/>
      <module name="ArrayTypeStyle"/>
      <module name="MissingSwitchDefault"/>
      <module name="FallThrough"/>
      <module name="UpperEll"/>
      <module name="ModifierOrder"/>
      <module name="EmptyLineSeparator">
         <property name="allowNoEmptyLineBetweenFields" value="true"/>
      </module>
      <module name="SeparatorWrap">
         <property name="id" value="SeparatorWrapDot"/>
         <property name="tokens" value="DOT"/>
         <property name="option" value="nl"/>
      </module>
      <module name="SeparatorWrap">
         <property name="id" value="SeparatorWrapComma"/>
         <property name="tokens" value="COMMA"/>
         <property name="option" value="EOL"/>
      </module>
      <module name="SeparatorWrap">
         <!-- ELLIPSIS is EOL until https://github.com/google/styleguide/issues/258 -->
         <property name="id" value="SeparatorWrapEllipsis"/>
         <property name="tokens" value="ELLIPSIS"/>
         <property name="option" value="EOL"/>
      </module>
      <module name="SeparatorWrap">
         <!-- ARRAY_DECLARATOR is EOL until https://github.com/google/styleguide/issues/259 -->
         <property name="id" value="SeparatorWrapArrayDeclarator"/>
         <property name="tokens" value="ARRAY_DECLARATOR"/>
         <property name="option" value="EOL"/>
      </module>
      <module name="SeparatorWrap">
         <property name="id" value="SeparatorWrapMethodRef"/>
         <property name="tokens" value="METHOD_REF"/>
         <property name="option" value="nl"/>
      </module>
      <module name="PackageName">
         <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
         <message key="name.invalidPattern"
          value="Package name ''{0}'' must match pattern ''{1}''."/>
      </module>
      <module name="TypeName">
         <message key="name.invalidPattern"
          value="Type name ''{0}'' must match pattern ''{1}''."/>
      </module>
      <module name="MemberName">
         <property name="format" value="^[_a-zA-Z]([a-z0-9A-Z][a-zA-Z0-9]*)?$"/>
         <message key="name.invalidPattern" value="Member name ''{0}'' must match pattern ''{1}''."/>
      </module>
      <module name="ParameterName">
         <property name="format" value="^[a-zA-Z]([a-z0-9A-Z][a-zA-Z0-9]*)?$"/>
         <message key="name.invalidPattern" value="Parameter name ''{0}'' must match pattern ''{1}''."/>
      </module>
      <module name="CatchParameterName">
         <property name="format" value="^[a-zA-Z]([a-z0-9A-Z][a-zA-Z0-9]*)?$"/>
         <message key="name.invalidPattern" value="Catch parameter name ''{0}'' must match pattern ''{1}''."/>
      </module>
      <module name="LocalVariableName">
         <property name="tokens" value="VARIABLE_DEF"/>
         <property name="format" value="^[a-zA-Z]([a-z0-9A-Z][a-zA-Z0-9]*)?$"/>
         <message key="name.invalidPattern" value="Local variable name ''{0}'' must match pattern ''{1}''."/>
      </module>
      <module name="ClassTypeParameterName">
         <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][_A-Z0-9]*$)"/>
         <message key="name.invalidPattern" value="Class type name ''{0}'' must match pattern ''{1}''."/>
      </module>
      <module name="MethodTypeParameterName">
         <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][_A-Z0-9]*$)"/>
         <message key="name.invalidPattern" value="Method type name ''{0}'' must match pattern ''{1}''."/>
      </module>
      <module name="InterfaceTypeParameterName">
         <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][_A-Z0-9]*$)"/>
         <message key="name.invalidPattern" value="Interface type name ''{0}'' must match pattern ''{1}''."/>
      </module>
      <module name="NoFinalizer"/>
      <module name="GenericWhitespace">
         <message key="ws.followed" value="GenericWhitespace ''{0}'' is followed by whitespace."/>
         <message key="ws.preceded" value="GenericWhitespace ''{0}'' is preceded with whitespace."/>
         <message key="ws.illegalFollow" value="GenericWhitespace ''{0}'' should followed by whitespace."/>
         <message key="ws.notPreceded" value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
      </module>
      <module name="Indentation">
         <property name="basicOffset" value="3"/>
         <property name="braceAdjustment" value="0"/>
         <property name="caseIndent" value="3"/>
         <property name="throwsIndent" value="6"/>
         <property name="lineWrappingIndentation" value="3"/>
         <property name="arrayInitIndent" value="6"/>
      </module>
      <!--
      <module name="AbbreviationAsWordInName">
         <property name="ignoreFinal" value="false"/>
         <property name="allowedAbbreviationLength" value="1"/>
      </module>
      <module name="OverloadMethodsDeclarationOrder"/>
      <module name="VariableDeclarationUsageDistance"/>
      <module name="CustomImportOrder">
         <property name="sortImportsInGroupAlphabetically" value="true"/>
         <property name="separateLineBetweenGroups" value="true"/>
         <property name="customImportOrderRules" value="STATIC###THIRD_PARTY_PACKAGE"/>
      </module>
      -->
      <module name="CustomImportOrder">
         <property name="customImportOrderRules" value="SPECIAL_IMPORTS###STANDARD_JAVA_PACKAGE###THIRD_PARTY_PACKAGE###STATIC"/>
         <property name="specialImportsRegExp" value="^javax\."/>
         <property name="standardPackageRegExp" value="^java\."/>
         <property name="sortImportsInGroupAlphabetically" value="true"/>
         <property name="separateLineBetweenGroups" value="false"/>
      </module>
      <module name="MethodParamPad"/>
      <module name="NoWhitespaceBefore">
         <property name="tokens" value="COMMA, SEMI, POST_INC, POST_DEC, DOT, ELLIPSIS, METHOD_REF"/>
         <property name="allowLineBreaks" value="true"/>
      </module>
      <module name="ParenPad"/>
      <module name="OperatorWrap">
         <property name="option" value="NL"/>
         <property name="tokens" value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR, LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR, METHOD_REF "/>
      </module>
      <module name="AnnotationLocation">
         <property name="id" value="AnnotationLocationMostCases"/>
         <property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/>
      </module>
      <module name="AnnotationLocation">
         <property name="id" value="AnnotationLocationVariables"/>
         <property name="tokens" value="VARIABLE_DEF"/>
         <property name="allowSamelineMultipleAnnotations" value="true"/>
      </module>
      <module name="NonEmptyAtclauseDescription"/>
      <!-- <module name="JavadocTagContinuationIndentation"/> -->
      <!--
      <module name="SummaryJavadoc">
         <property name="forbiddenSummaryFragments" value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )"/>
      </module>
      -->
      <!-- <module name="JavadocParagraph"/> -->
      <module name="AtclauseOrder">
         <property name="tagOrder" value="@param, @return, @throws, @deprecated"/>
         <property name="target" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
      </module>
      <module name="JavadocMethod">
         <property name="allowMissingParamTags" value="true"/>
         <property name="allowMissingReturnTag" value="true"/>
         <property name="allowedAnnotations" value="Override, Test"/>
      </module>
      <module name="MissingJavadocMethod">
         <property name="scope" value="private"/>
      </module>
      <module name="MethodName">
         <property name="format" value="^[a-z][a-zA-Z0-9_]*$"/>
         <message key="name.invalidPattern"
          value="Method name ''{0}'' must match pattern ''{1}''."/>
      </module>
      <module name="SingleLineJavadoc">
         <property name="ignoreInlineTags" value="false"/>
      </module>

      <module name="MagicNumber">
         <property name="severity" value="info"/>
         <property name="tokens" value="NUM_DOUBLE, NUM_FLOAT, NUM_INT"/>
         <property name="ignoreNumbers" value="0, 1, 2, 3, 4, 5, 6, 7, 8"/>
         <property name="ignoreFieldDeclaration" value="true"/>
         <property name="ignoreAnnotation" value="true"/>
      </module>

      <module name="EmptyCatchBlock">
         <property name="exceptionVariableName" value="expected"/>
      </module>
      <module name="CommentsIndentation"/>

      <!-- this would be nice, but requires the the @inheritDoc javadoc tag... -->
      <module name="MissingOverride"/>

   </module>
   <module name="Header">
     <property name="headerFile" value="checkstyle/license.txt"/>
     <property name="fileExtensions" value="java"/>
   </module>
   <module name="SuppressWarningsFilter"/>
</module>
