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

<module name="Checker">

  <!-- Settings -->
  <property name="charset" value="UTF-8"/>
  <property name="severity" value="error"/>
  <property name="fileExtensions" value="java, properties, xml"/>

  <module name="TreeWalker">

    <!-- Annotation Checks -->
    <!-- See https://checkstyle.sourceforge.io/config_annotation.html -->
    <module name="com.puppycrawl.tools.checkstyle.checks.annotation.AnnotationLocationCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.annotation.PackageAnnotationCheck"/>

    <!-- Blocks Checks -->
    <!-- See https://checkstyle.sourceforge.io/config_blocks.html -->
    <module name="com.puppycrawl.tools.checkstyle.checks.blocks.AvoidNestedBlocksCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.blocks.EmptyBlockCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.blocks.EmptyCatchBlockCheck">
      <property name="exceptionVariableName" value="expected|ignored"/>
    </module>
    <module name="com.puppycrawl.tools.checkstyle.checks.blocks.LeftCurlyCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.blocks.NeedBracesCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.blocks.RightCurlyCheck"/>

    <!-- Coding Checks -->
    <!-- See https://checkstyle.sourceforge.io/config_coding.html -->
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.AvoidNoArgumentSuperConstructorCallCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.CovariantEqualsCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.DeclarationOrderCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.DefaultComesLastCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.EmptyStatementCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.EqualsAvoidNullCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.EqualsHashCodeCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.ExplicitInitializationCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.FallThroughCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.InnerAssignmentCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.IllegalInstantiationCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.IllegalTokenTextCheck">
      <property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
      <property name="format"
          value="\\u00(08|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="Avoid using corresponding octal or Unicode escape."/>
    </module>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.MagicNumberCheck">
      <property name="ignoreHashCodeMethod" value="true"/>
      <property name="ignoreAnnotation" value="true"/>
      <property name="ignoreFieldDeclaration" value="true"/>
    </module>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.MissingSwitchDefaultCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.MultipleVariableDeclarationsCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.NoCloneCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.NoFinalizerCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.OneStatementPerLineCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.PackageDeclarationCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.RequireThisCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.SimplifyBooleanExpressionCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.SimplifyBooleanReturnCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.StringLiteralEqualityCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.SuperCloneCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.SuperFinalizeCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.UnnecessaryParenthesesCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.UnnecessarySemicolonAfterOuterTypeDeclarationCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.UnnecessarySemicolonAfterTypeMemberDeclarationCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.UnnecessarySemicolonInEnumerationCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.coding.UnnecessarySemicolonInTryWithResourcesCheck"/>

    <!-- Design Checks -->
    <!-- See https://checkstyle.sourceforge.io/config_design.html -->
    <module name="com.puppycrawl.tools.checkstyle.checks.design.InnerTypeLastCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.design.InterfaceIsTypeCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.design.MutableExceptionCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.design.OneTopLevelClassCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.design.VisibilityModifierCheck">
      <property name="protectedAllowed" value="true"/>
    </module>

    <!-- Imports Checks -->
    <!-- See https://checkstyle.sourceforge.io/config_imports.html -->
    <module name="com.puppycrawl.tools.checkstyle.checks.imports.AvoidStarImportCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.imports.IllegalImportCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.imports.RedundantImportCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.imports.UnusedImportsCheck"/>

    <!-- Indentation Checks -->
    <!-- See https://checkstyle.sourceforge.io/config_misc.html -->
    <module name="com.puppycrawl.tools.checkstyle.checks.indentation.CommentsIndentationCheck"/>
    <!--    <module name="com.puppycrawl.tools.checkstyle.checks.indentation.IndentationCheck">-->
    <!--      <property name="basicOffset" value="2"/>-->
    <!--      <property name="braceAdjustment" value="0"/>-->
    <!--      <property name="caseIndent" value="2"/>-->
    <!--      <property name="throwsIndent" value="4"/>-->
    <!--      <property name="lineWrappingIndentation" value="4"/>-->
    <!--      <property name="arrayInitIndent" value="2"/>-->
    <!--    </module>-->

    <!-- Modifier Checks -->
    <!-- See https://checkstyle.sourceforge.io/config_modifier.html -->
    <module name="com.puppycrawl.tools.checkstyle.checks.modifier.ModifierOrderCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.modifier.RedundantModifierCheck"/>

    <!-- Naming Checks -->
    <!-- See https://checkstyle.sourceforge.io/config_naming.html -->
    <module name="com.puppycrawl.tools.checkstyle.checks.naming.AbstractClassNameCheck">
      <property name="ignoreName" value="true"/>
    </module>
    <module name="com.puppycrawl.tools.checkstyle.checks.naming.CatchParameterNameCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.naming.ClassTypeParameterNameCheck">
      <property name="format" value="^[A-Z]*$"/>
    </module>
    <module name="com.puppycrawl.tools.checkstyle.checks.naming.ConstantNameCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.naming.InterfaceTypeParameterNameCheck">
      <property name="format" value="^[A-Z]*$"/>
    </module>
    <module name="com.puppycrawl.tools.checkstyle.checks.naming.LambdaParameterNameCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.naming.LocalFinalVariableNameCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.naming.LocalVariableNameCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.naming.MemberNameCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.naming.MethodNameCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.naming.MethodTypeParameterNameCheck">
      <property name="format" value="^[A-Z]*$"/>
    </module>
    <module name="com.puppycrawl.tools.checkstyle.checks.naming.PackageNameCheck">
      <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
    </module>
    <module name="com.puppycrawl.tools.checkstyle.checks.naming.ParameterNameCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.naming.StaticVariableNameCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.naming.TypeNameCheck"/>

    <!-- Size Checks -->
    <!-- See https://checkstyle.sourceforge.io/config_sizes.html -->
    <module name="com.puppycrawl.tools.checkstyle.checks.sizes.MethodLengthCheck">
      <property name="tokens" value="METHOD_DEF"/>
      <property name="max" value="40"/>
      <property name="countEmpty" value="false"/>
    </module>

    <!-- Whitespace Checks -->
    <!-- See https://checkstyle.sourceforge.io/config_whitespace.html -->
    <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.EmptyForIteratorPadCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.EmptyLineSeparatorCheck">
      <property name="allowMultipleEmptyLines" value="false"/>
      <property name="allowMultipleEmptyLinesInsideClassMembers" value="false"/>
    </module>
    <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.GenericWhitespaceCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.MethodParamPadCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.NoLineWrapCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.NoWhitespaceAfterCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.NoWhitespaceBeforeCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.ParenPadCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.SeparatorWrapCheck">
      <property name="id" value="SeparatorWrapDotCheck"/>
      <property name="tokens" value="DOT"/>
      <property name="option" value="nl"/>
    </module>
    <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.SeparatorWrapCheck">
      <property name="id" value="SeparatorWrapCommaCheck"/>
      <property name="tokens" value="COMMA"/>
      <property name="option" value="EOL"/>
    </module>
    <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.SingleSpaceSeparatorCheck">
      <property name="validateComments" value="false"/>
    </module>
    <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.TypecastParenPadCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAfterCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAroundCheck"/>

    <!-- Miscellaneous Checks -->
    <!-- See http://checkstyle.sf.net/config_misc.html -->
    <module name="com.puppycrawl.tools.checkstyle.checks.ArrayTypeStyleCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.OuterTypeFilenameCheck"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.UpperEllCheck"/>

    <!-- Suppress Checks -->
    <!-- Required by SuppressWarningsFilter below -->
    <!-- Make the @SuppressWarnings annotations available to Checkstyle -->
    <module name="com.puppycrawl.tools.checkstyle.filters.SuppressionCommentFilter"/>
    <module name="com.puppycrawl.tools.checkstyle.checks.SuppressWarningsHolder">
      <metadata name="skip" value="true"/>
    </module>

    <!-- Custom SH Checks -->
    <module name="es.startuphero.checkstyle.checks.annotation.ForbiddenAnnotationCheck">
      <property name="forbiddenAnnotations"
          value="com.clovify.lyso.core.annotation.LysoRepository"/>
    </module>
    <module name="es.startuphero.checkstyle.checks.annotation.ForbiddenAnnotationKeyCheck">
      <property name="annotationForbiddenKeysMap" value="javax.persistence.Column:unique"/>
    </module>
    <module name="es.startuphero.checkstyle.checks.naming.GeneratedPrimaryKeyNameCheck">
      <property name="typeAnnotation" value="javax.persistence.Entity"/>
      <property name="abstractTypeAnnotation" value="javax.persistence.MappedSuperclass"/>
      <property name="idAnnotation" value="javax.persistence.Id"/>
      <property name="generatedValueAnnotation" value="javax.persistence.GeneratedValue"/>
      <property name="suggestedGeneratedPrimaryKeyName" value="id"/>
    </module>
    <module name="es.startuphero.checkstyle.checks.design.LogDataTableCheck">
      <property name="typeAnnotation" value="javax.persistence.Entity"/>
      <property name="abstractTypeAnnotation" value="javax.persistence.MappedSuperclass"/>
      <property name="columnAnnotation" value="javax.persistence.Column"/>
      <property name="limitLength" value="255"/>
    </module>
    <module name="es.startuphero.checkstyle.checks.modifier.MissingAbstractModifierCheck">
      <property name="abstractTypeAnnotation" value="javax.persistence.MappedSuperclass"/>
    </module>
    <module name="es.startuphero.checkstyle.checks.method.MissingEqualsHashCodeCheck">
      <property name="typeAnnotation" value="javax.persistence.Entity"/>
      <property name="abstractTypeAnnotation" value="javax.persistence.MappedSuperclass"/>
      <property name="idAnnotation" value="javax.persistence.Id"/>
    </module>
    <module name="es.startuphero.checkstyle.checks.method.MissingGetterCheck">
      <property name="typeAnnotation" value="javax.persistence.Entity"/>
      <property name="abstractTypeAnnotation" value="javax.persistence.MappedSuperclass"/>
    </module>
    <module name="es.startuphero.checkstyle.checks.method.MissingSetterCheck">
      <property name="typeAnnotation" value="javax.persistence.Entity"/>
      <property name="abstractTypeAnnotation" value="javax.persistence.MappedSuperclass"/>
    </module>
    <module name="es.startuphero.checkstyle.checks.method.MissingToStringCheck">
      <property name="typeAnnotation" value="javax.persistence.Entity"/>
      <property name="abstractTypeAnnotation" value="javax.persistence.MappedSuperclass"/>
    </module>
    <module name="es.startuphero.checkstyle.checks.variable.MissingVariableCheck">
      <property name="typeAnnotation" value="javax.persistence.Entity"/>
      <property name="abstractTypeAnnotation" value="javax.persistence.MappedSuperclass"/>
      <property name="mandatoryVariables" value="createdAt"/>
    </module>
    <module name="es.startuphero.checkstyle.checks.naming.TableIdentifierNameCheck">
      <property name="id" value="IndexNameCheck"/>
      <property name="tableAnnotation" value="javax.persistence.Table"/>
      <property name="identifierAnnotation" value="javax.persistence.Index"/>
      <property name="key" value="indexes"/>
      <property name="keyName" value="name"/>
      <property name="keyColumns" value="columnList"/>
      <property name="suggestedSuffix" value="index"/>
      <property name="maxLength" value="64"/>
      <property name="regex" value="^[a-z0-9_]*$"/>
    </module>
    <module name="es.startuphero.checkstyle.checks.naming.TableIdentifierNameCheck">
      <property name="id" value="UniqueConstraintNameCheck"/>
      <property name="tableAnnotation" value="javax.persistence.Table"/>
      <property name="identifierAnnotation" value="javax.persistence.UniqueConstraint"/>
      <property name="key" value="uniqueConstraints"/>
      <property name="keyName" value="name"/>
      <property name="keyColumns" value="columnNames"/>
      <property name="suggestedSuffix" value="uk"/>
      <property name="maxLength" value="64"/>
      <property name="regex" value="^[a-z0-9_]*$"/>
    </module>
    <module name="es.startuphero.checkstyle.checks.annotation.VariableAnnotationKeyValueCheck">
      <property name="typeAnnotation" value="javax.persistence.Entity"/>
      <property name="abstractTypeAnnotation" value="javax.persistence.MappedSuperclass"/>
      <property name="variableAnnotationKeyValueTable"
          value="createdAt:javax.persistence.Column:nullable:false, lastUpdatedAt:javax.persistence.Column:nullable:false"/>
    </module>
    <module name="es.startuphero.checkstyle.checks.coding.VariableDeclarationOrderCheck">
      <property name="variableName" value="LOGGER"/>
      <property name="declarationOrder" value="1"/>
    </module>
    <module name="es.startuphero.checkstyle.checks.naming.VariableNameCheck">
      <property name="typeAnnotation" value="javax.persistence.Entity"/>
    </module>
    <module name="es.startuphero.checkstyle.checks.annotation.ColumnDefaultCheck">
      <property name="typeAnnotation" value="javax.persistence.Entity"/>
      <property name="abstractTypeAnnotation" value="javax.persistence.MappedSuperclass"/>
      <property name="columnAnnotation" value="javax.persistence.Column"/>
      <property name="columnDefaultAnnotation" value="org.hibernate.annotations.ColumnDefault"/>
      <property name="excludedColumnDefaultAnnotationValueRegex"
          value="^.*?(\bCURRENT_TIMESTAMP\b|\bNOW\b|\bLOCALTIME\b|\bLOCALTIMESTAMP\b).*$"/>
    </module>

  </module>

  <!-- Regexp Checks -->
  <!-- See https://checkstyle.sourceforge.io/config_regexp.html -->
  <module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineCheck">
    <property name="id" value="RegexpSinglelineTrailingSpaceCheck"/>
    <property name="format" value="\s+$"/>
    <property name="minimum" value="0"/>
    <property name="maximum" value="0"/>
    <property name="message" value="Line has trailing spaces."/>
  </module>

  <!-- Space after 'for' and 'if' -->
  <module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineCheck">
    <property name="id" value="RegexpSinglelineParenthesisCheck"/>
    <property name="format" value="^\s*(for|if)\b[^ ]"/>
    <property name="message" value="Space needed before opening parenthesis."/>
  </module>

  <!-- For each spacing -->
  <module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineCheck">
    <property name="id" value="RegexpSinglelineEnhancedForLoopCheck"/>
    <property name="format" value="^\s*for \(.*?([^ ]:|:[^ ])"/>
    <property name="message" value="Space needed around ':' character."/>
  </module>

  <!-- Javadoc author check -->
  <module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineCheck">
    <property name="fileExtensions" value="java"/>
    <property name="format" value="^\s*\*\s*@author"/>
    <property name="minimum" value="1"/>
    <property name="maximum" value="10"/>
    <property name="message" value="Javadoc has illegal ''@author'' tag."/>
  </module>

  <!-- System.out.print check -->
  <module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineCheck">
    <property name="fileExtensions" value="java"/>
    <property name="format" value="System\.out\.print"/>
    <property name="message" value="Using System.out.print is forbidden. Please log."/>
  </module>

  <!-- System.err.print check -->
  <module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineCheck">
    <property name="fileExtensions" value="java"/>
    <property name="format" value="System\.err\.print"/>
    <property name="message" value="Using System.err.print is forbidden. Please log."/>
  </module>

  <!-- Exception printStackTrace check -->
  <module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineCheck">
    <property name="fileExtensions" value="java"/>
    <property name="format" value="\.printStackTrace\(\)"/>
    <property name="message" value="Using e.printStackTrace() is forbidden. Rethrow, log or handle the exception."/>
  </module>

  <!-- Size Checks -->
  <!-- See https://checkstyle.sourceforge.io/config_sizes.html -->
  <module name="com.puppycrawl.tools.checkstyle.checks.sizes.FileLengthCheck">
    <property name="fileExtensions" value="java"/>
    <property name="max" value="1500"/>
  </module>
  <module name="com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck">
    <property name="fileExtensions" value="java"/>
    <property name="max" value="120"/>
    <property name="ignorePattern"
        value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
  </module>

  <!-- Whitespace Checks -->
  <!-- See https://checkstyle.sourceforge.io/config_whitespace.html -->
  <module name="com.puppycrawl.tools.checkstyle.checks.whitespace.FileTabCharacterCheck">
    <property name="eachLine" value="true"/>
  </module>

  <!-- Properties Checks -->
  <!-- See https://checkstyle.sourceforge.io/config_misc.html#Translation -->
  <module name="com.puppycrawl.tools.checkstyle.checks.TranslationCheck"/>
  <module name="com.puppycrawl.tools.checkstyle.checks.UniquePropertiesCheck"/>

  <!-- Filters -->
  <!-- Allow turning checks off in the code using @SuppressWarnings annotation -->
  <!-- See http://checkstyle.sourceforge.net/config_filters.html -->
  <!-- Filter out Checkstyle warnings that have been suppressed with the @SuppressWarnings annotation -->
  <module name="com.puppycrawl.tools.checkstyle.filters.SuppressionSingleFilter">
    <property name="checks" value="MagicNumber"/>
    <property name="files" value=".*[\\/]src[\\/](test|it)[\\/]"/>
  </module>
  <module name="com.puppycrawl.tools.checkstyle.filters.SuppressionSingleFilter">
    <property name="checks" value="MethodLength"/>
    <property name="files" value=".*[\\/]src[\\/](test|it)[\\/]"/>
  </module>
  <module name="com.puppycrawl.tools.checkstyle.filters.SuppressWarningsFilter">
    <metadata name="skip" value="true"/>
  </module>
  <module name="com.puppycrawl.tools.checkstyle.filters.SuppressWithPlainTextCommentFilter"/>

</module>