<?xml version="1.0"?>
<!--
  ~ 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.
  -->

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

<!--
  Checkstyle configuration that checks the OpenWebBeans coding conventions.
-->

<module name="Checker">

    <!-- Checks that a package.html file exists for each package.     -->
    <!-- See http://checkstyle.sf.net/config_javadoc.html#PackageHtml -->
    <!-- module name="PackageHtml"/ -->

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

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

    <!-- 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"/>
    </module>

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

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

    <!-- allow usage of CHECKSTYLE:OFF and CHECKSTYLE:ON -->
    <module name="SuppressionCommentFilter"/>


    <module name="TreeWalker">

        <module name="FileContentsHolder"/>

        <property name="cacheFile" value="${checkstyle.cache.file}"/>

        <!-- Checks for Javadoc comments.                     -->
        <!-- See http://checkstyle.sf.net/config_javadoc.html -->
        <!-- module name="JavadocMethod"/ -->
        <!-- module name="JavadocType"/ -->
        <!-- module name="JavadocVariable"/ -->


        <!-- Checks for Naming Conventions.                  -->
        <!-- See http://checkstyle.sf.net/config_naming.html -->
        <module name="MemberName">
          <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
        </module>

        <module name="ConstantName">
          <!-- Normal rules, except that:
             -  * any name can start with an underscore.
             -  * "log" is allowed; this is a traditional name for log objects
             -  * names ending with "ThreadLocal" are allowed so that threadlocal vars don't have to be
             -    all-caps. They are static final, but are not really constants. Yes, type prefixes
             -    on variable names sucks ("hungarian notation") but checkstyle doesn't allow 
             -    name rules to vary by the type of the constant, and no other alternative seems
             -    any better.
             -->
          <property name="format" 
             value="^((log)|(logger)|([a-z][a-zA-Z]*ThreadLocal)|([A-Z][A-Z0-9]*(_[A-Z0-9]+)*))$"/>
        </module>

        <module name="LocalVariableName"/>
        <module name="MethodName"/>
        <module name="PackageName"/>
        <module name="LocalFinalVariableName"/>
        <module name="ParameterName"/>
        <module name="StaticVariableName"/>
        <module name="TypeName"/>

        <!-- Checks for imports                              -->
        <!-- See http://checkstyle.sf.net/config_import.html -->
        <module name="AvoidStarImport">
            <property name="excludes" value="java.io,java.net,java.util,jakarta.enterprise.inject.spi,jakarta.enterprise.context"/>
        </module>
        <module name="IllegalImport"/>
        <module name="RedundantImport"/>
        <module name="UnusedImports"/>


        <module name="LineLength">
          <property name="max" value="150" />
          <property name="ignorePattern" value="@version|@see"/>
        </module>
        <module name="MethodLength">
          <property name="max" value="200" />
        </module>
        <module name="ParameterNumber">
          <property name="max" value="10" />
        </module>


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

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

        <!-- Checks for common coding problems               -->
        <!-- See http://checkstyle.sf.net/config_coding.html -->
        <module name="EmptyStatement"/>
        <module name="EqualsHashCode"/>
        <module name="InnerAssignment"/>
        <module name="DefaultComesLast"/>
        <module name="MissingSwitchDefault"/>
        <module name="FallThrough"/>
        <module name="MultipleVariableDeclarations"/>

        <!-- Checks for class design                         -->
        <!-- See http://checkstyle.sf.net/config_design.html -->
        <!-- module name="DesignForExtension"/ -->
        <module name="com.puppycrawl.tools.checkstyle.checks.design.DesignForExtensionCheck">
            <property name="severity" value="ignore"/>
        </module>
        
        <!-- module name="FinalClass"/ -->
        <!-- module name="HideUtilityClassConstructor"/ -->
        <!-- module name="InterfaceIsType"/ -->
        <!-- module name="VisibilityModifier"/ -->
        <module name="com.puppycrawl.tools.checkstyle.checks.design.VisibilityModifierCheck">
            <property name="packageAllowed" value="false"/>
            <property name="protectedAllowed" value="true"/>
            <property name="publicMemberPattern" value="^serialVersionUID"/>
            <property name="severity" value="warning"/>
        </module>


        <!-- Miscellaneous other checks.                   -->
        <!-- See http://checkstyle.sf.net/config_misc.html -->
        <!-- module name="ArrayTypeStyle"/ -->
        <!-- module name="FinalParameters"/ -->
        <!-- Line with Trailing Spaces (disabled as it's to noisy)
        <module name="GenericIllegalRegexp">
            <property name="format" value="\s+$"/>
            <property name="message" value="Line has trailing spaces."/>
        </module>
          -->
        <module name="UpperEll"/>

        <module name="WhitespaceAround">
            <property name="tokens" value=""/>
        </module>
        <module name="StringLiteralEquality"/>
        <module name="NoFinalizer"/>
        <module name="MissingOverride"/>
        <module name="HideUtilityClassConstructor"/>
        <module name="EqualsAvoidNull"/>
        <module name="DeclarationOrder"/>
        <!--module name="MultipleStringLiterals"/-->
        <module name="OneStatementPerLine"/>
        <module name="Indentation"/>
        <module name="ModifierOrder"/>
        <module name="RedundantModifier"/>
    </module>

</module>

