<?xml version="1.0"?>
<!DOCTYPE module PUBLIC "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN" "https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="com.puppycrawl.tools.checkstyle.Checker">
	<!-- Root Checks -->
	<module name="io.spring.javaformat.checkstyle.check.SpringHeaderCheck">
		<property name="fileExtensions" value="java"/>
		<property name="headerType" value="apache2"/>
		<property name="headerCopyrightPattern" value="20\d\d-20\d\d"/>
		<property name="packageInfoHeaderType" value="none"/>
	</module>

	<!-- 文件必须以新行结尾 -->
	<module name="com.puppycrawl.tools.checkstyle.checks.NewlineAtEndOfFileCheck"/>

	<!-- TreeWalker Checks -->
	<module name="com.puppycrawl.tools.checkstyle.TreeWalker">
		<!-- Annotations -->
		<module name="com.puppycrawl.tools.checkstyle.checks.annotation.AnnotationUseStyleCheck">
			<property name="elementStyle" value="compact" />
		</module>
		<module name="com.puppycrawl.tools.checkstyle.checks.annotation.MissingOverrideCheck" />
		<module name="com.puppycrawl.tools.checkstyle.checks.annotation.PackageAnnotationCheck" />
		<module name="com.puppycrawl.tools.checkstyle.checks.annotation.AnnotationLocationCheck">
			<property name="allowSamelineSingleParameterlessAnnotation"
					  value="false" />
		</module>

		<!-- Block Checks -->
		<module name="com.puppycrawl.tools.checkstyle.checks.blocks.EmptyBlockCheck">
			<property name="option" value="text" />
		</module>
		<module name="com.puppycrawl.tools.checkstyle.checks.blocks.LeftCurlyCheck" />
		<module name="com.puppycrawl.tools.checkstyle.checks.blocks.RightCurlyCheck">
			<property name="option" value="alone" />
		</module>
		<module name="com.puppycrawl.tools.checkstyle.checks.blocks.NeedBracesCheck" />
		<module name="com.puppycrawl.tools.checkstyle.checks.blocks.AvoidNestedBlocksCheck" />

		<!-- Class Design -->
		<module name="com.puppycrawl.tools.checkstyle.checks.design.FinalClassCheck" />
		<module name="com.puppycrawl.tools.checkstyle.checks.design.InterfaceIsTypeCheck" />
		<module name="com.puppycrawl.tools.checkstyle.checks.design.HideUtilityClassConstructorCheck" />
		<module name="com.puppycrawl.tools.checkstyle.checks.design.MutableExceptionCheck" />
		<module name="com.puppycrawl.tools.checkstyle.checks.design.InnerTypeLastCheck" />
		<module name="com.puppycrawl.tools.checkstyle.checks.design.OneTopLevelClassCheck" />

		<!-- Coding -->
		<module name="com.puppycrawl.tools.checkstyle.checks.coding.CovariantEqualsCheck" />
		<module name="com.puppycrawl.tools.checkstyle.checks.coding.EmptyStatementCheck" />
		<module name="com.puppycrawl.tools.checkstyle.checks.coding.EqualsHashCodeCheck" />
		<module name="com.puppycrawl.tools.checkstyle.checks.coding.InnerAssignmentCheck" />
		<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.NestedForDepthCheck">
			<property name="max" value="3" />
		</module>
		<module name="com.puppycrawl.tools.checkstyle.checks.coding.NestedIfDepthCheck">
			<property name="max" value="3" />
		</module>
		<module name="com.puppycrawl.tools.checkstyle.checks.coding.NestedTryDepthCheck">
			<property name="max" value="3" />
		</module>
		<module name="com.puppycrawl.tools.checkstyle.checks.coding.MultipleVariableDeclarationsCheck" />
		<module name="com.puppycrawl.tools.checkstyle.checks.coding.RequireThisCheck">
			<property name="checkMethods" value="false" />
			<property name="validateOnlyOverlapping" value="false" />
		</module>
		<module name="com.puppycrawl.tools.checkstyle.checks.coding.OneStatementPerLineCheck" />

		<!-- Imports -->
		<module name="com.puppycrawl.tools.checkstyle.checks.imports.AvoidStarImportCheck" />
		<module name="com.puppycrawl.tools.checkstyle.checks.imports.AvoidStaticImportCheck">
			<property name="excludes"
					  value="org.assertj.core.api.Assertions.*, org.junit.Assert.*, org.junit.Assume.*, org.junit.internal.matchers.ThrowableMessageMatcher.*, org.junit.jupiter.api.Assertions.*, org.hamcrest.CoreMatchers.*, org.hamcrest.Matchers.*, org.springframework.boot.configurationprocessor.ConfigurationMetadataMatchers.*, org.springframework.boot.configurationprocessor.TestCompiler.*, org.springframework.boot.test.autoconfigure.AutoConfigurationImportedCondition.*, org.mockito.Mockito.*, org.mockito.BDDMockito.*, org.mockito.Matchers.*, org.mockito.ArgumentMatchers.*, org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.*, org.springframework.restdocs.hypermedia.HypermediaDocumentation.*, org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*, org.springframework.test.web.servlet.result.MockMvcResultMatchers.*, org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders.*, org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*, org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*, org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo, org.springframework.test.web.client.match.MockRestRequestMatchers.*, org.springframework.test.web.client.response.MockRestResponseCreators.*, org.springframework.web.reactive.function.server.RequestPredicates.*, org.springframework.web.reactive.function.server.RouterFunctions.*, org.springframework.test.web.servlet.setup.MockMvcBuilders.*, io.swagger.v3.oas.annotations.media.Schema.RequiredMode.*, java.lang.annotation.ElementType.*, java.lang.annotation.RetentionPolicy.*, org.springframework.test.web.servlet.result.MockMvcResultHandlers.*, org.ballcat.springsecurity.oauth2.server.authorization.authentication.OAuth2AuthenticationProviderUtils.*" />
		</module>
		<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">
			<property name="processJavadoc" value="true" />
		</module>
		<module name="com.puppycrawl.tools.checkstyle.checks.imports.ImportOrderCheck">
			<property name="groups" value="java,/^javax?\./,*,io.spring" />
			<property name="ordered" value="true" />
			<property name="separated" value="true" />
			<property name="option" value="bottom" />
			<property name="sortStaticImportsAlphabetically" value="true" />
		</module>

		<!-- Javadoc Comments -->
<!--		<module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocTypeCheck">-->
<!--			<property name="scope" value="package"/>-->
<!--			<property name="authorFormat" value=".+\s.+"/>-->
<!--		</module>-->
<!--		<module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocMethodCheck" />-->
<!--		<module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocVariableCheck">-->
<!--			<property name="scope" value="public"/>-->
<!--		</module>-->
<!--		<module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocStyleCheck">-->
<!--			<property name="checkEmptyJavadoc" value="true"/>-->
<!--		</module>-->
<!--		<module name="com.puppycrawl.tools.checkstyle.checks.javadoc.NonEmptyAtclauseDescriptionCheck" />-->
<!--		<module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocTagContinuationIndentationCheck">-->
<!--			<property name="offset" value="0"/>-->
<!--		</module>-->
<!--		<module name="com.puppycrawl.tools.checkstyle.checks.javadoc.AtclauseOrderCheck">-->
<!--			<property name="target" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF"/>-->
<!--			<property name="tagOrder" value="@param, @author, @since, @see, @version, @serial, @deprecated"/>-->
<!--		</module>-->
<!--		<module name="com.puppycrawl.tools.checkstyle.checks.javadoc.AtclauseOrderCheck">-->
<!--			<property name="target" value="METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>-->
<!--			<property name="tagOrder" value="@param, @return, @throws, @since, @deprecated, @see"/>-->
<!--		</module>-->

		<!-- Miscellaneous -->
		<module name="com.puppycrawl.tools.checkstyle.checks.indentation.CommentsIndentationCheck">
			<property name="tokens" value="BLOCK_COMMENT_BEGIN"/>
		</module>
		<module name="com.puppycrawl.tools.checkstyle.checks.UpperEllCheck" />
		<module name="com.puppycrawl.tools.checkstyle.checks.ArrayTypeStyleCheck" />
		<module name="com.puppycrawl.tools.checkstyle.checks.OuterTypeFilenameCheck" />

		<!-- Modifiers -->
		<module name="com.puppycrawl.tools.checkstyle.checks.modifier.RedundantModifierCheck" />

		<!-- Regexp -->
		<module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineJavaCheck">
			<property name="format" value="^\t* +\t*\S" />
			<property name="message"
					  value="Line has leading space characters; indentation should be performed with tabs only." />
			<property name="ignoreComments" value="true" />
		</module>
		<module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineJavaCheck">
			<property name="maximum" value="0"/>
			<property name="format" value="org\.mockito\.Mockito\.(when|doThrow|doAnswer)" />
			<property name="message"
					  value="Please use BDDMockito imports." />
			<property name="ignoreComments" value="true" />
		</module>
		<module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineJavaCheck">
			<property name="maximum" value="0"/>
			<property name="format" value="org\.junit\.Assert\.assert" />
			<property name="message"
					  value="Please use AssertJ imports." />
			<property name="ignoreComments" value="true" />
		</module>
		<module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpCheck">
			<property name="format" value="[ \t]+$" />
			<property name="illegalPattern" value="true" />
			<property name="message" value="Trailing whitespace" />
		</module>

		<!-- Whitespace -->
		<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.NoWhitespaceAfterCheck" >
			<property name="tokens" value="BNOT, DEC, DOT, INC, LNOT, UNARY_MINUS, UNARY_PLUS, ARRAY_DECLARATOR"/>
		</module>
		<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.TypecastParenPadCheck" />
		<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAfterCheck" />
		<module name="com.puppycrawl.tools.checkstyle.checks.whitespace.WhitespaceAroundCheck" />
	</module>
</module>