<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ 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.3//EN"
    "http://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">

    <property name="localeLanguage" value="en"/>

    <module name="FileTabCharacter">
        <property name="eachLine" value="true"/>
    </module>

    <module name="RegexpSingleline">
        <property name="format" value="System\.out\.println"/>
        <property name="message" value="Prohibit invoking System.out.println in source code !"/>
    </module>

    <module name="RegexpSingleline">
        <property name="format" value="^\s*\*\s*@author"/>
        <property name="minimum" value="0"/>
        <property name="maximum" value="0"/>
        <property name="message" value="ASF project doesn't allow @author copyright."/>
    </module>

    <module name="RegexpSingleline">
        <property name="format"
                  value=".*[\u3400-\u4DB5\u4E00-\u9FA5\u9FA6-\u9FBB\uF900-\uFA2D\uFA30-\uFA6A\uFA70-\uFAD9\uFF00-\uFFEF\u2E80-\u2EFF\u3000-\u303F\u31C0-\u31EF]+.*"/>
        <property name="message" value="Not allow chinese character !"/>
    </module>

    <module name="FileLength">
        <property name="max" value="3000"/>
    </module>

    <module name="TreeWalker">

        <module name="UnusedImports"/>
        <module name="RedundantImport"/>
        <module name="AvoidStarImport"/>

        <module name="NonEmptyAtclauseDescription"/>

        <!--Checks that classes that override equals() also override hashCode()-->
        <module name="EqualsHashCode"/>
        <!--Checks for over-complicated boolean expressions. Currently finds code like if (topic == true), topic || true, !false, etc.-->
        <module name="SimplifyBooleanExpression"/>
        <module name="OneStatementPerLine"/>
        <module name="UnnecessaryParentheses"/>
        <!--Checks for over-complicated boolean return statements. For example the following code-->
        <module name="SimplifyBooleanReturn"/>

        <!--Check that the default is after all the cases in producerGroup switch statement-->
        <module name="DefaultComesLast"/>
        <!--Detects empty statements (standalone ";" semicolon)-->
        <module name="EmptyStatement"/>
        <!--Checks that long constants are defined with an upper ell-->
        <module name="UpperEll"/>
        <module name="ConstantName">
            <property name="format" value="(^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$)"/>
        </module>
        <!--Checks that local, non-final variable names conform to producerGroup format specified by the format property-->
        <module name="LocalVariableName"/>
        <!--Validates identifiers for local, final variables, including catch parameters-->
        <module name="LocalFinalVariableName"/>
        <!--Validates identifiers for non-static fields-->
        <module name="MemberName"/>
        <!--Validates identifiers for class type parameters-->
        <module name="ClassTypeParameterName">
            <property name="format" value="(^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$)"/>
        </module>
        <!--Validates identifiers for method type parameters-->
        <module name="MethodTypeParameterName">
            <property name="format" value="(^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$)"/>
        </module>
        <module name="PackageName">
            <property name="format" value="^(org|test)\.apache\.skywalking(\.[a-zA-Z][a-zA-Z0-9]*)+$"/>
        </module>
        <module name="ParameterName"/>
        <module name="StaticVariableName">
            <property name="format" value="(^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$)"/>
        </module>
        <module name="TypeName">
            <property name="format" value="(^[A-Z][a-zA-Z0-9]*$)|(^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$)"/>
        </module>
        <module name="MissingOverride"/>

        <!--whitespace-->
        <module name="GenericWhitespace"/>
        <module name="WhitespaceAfter"/>
        <module name="WhitespaceAround"/>
        <module name="MethodParamPad"/>
        <module name="ParenPad"/>
        <module name="TypecastParenPad"/>
        <module name="EmptyLineSeparator">
            <property name="allowNoEmptyLineBetweenFields" value="true"/>
            <property name="allowMultipleEmptyLines" value="false"/>
            <property name="allowMultipleEmptyLinesInsideClassMembers" value="false"/>
        </module>
    </module>
</module>
