<!--
  ~ 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.
  -->
<scalastyle commentFilter="enabled">
 <name>Apache Druid Scalastyle configuration</name>
 <check level="warning" class="org.scalastyle.file.FileTabChecker" enabled="true"></check>
 <check level="warning" class="org.scalastyle.file.FileLengthChecker" enabled="true">
  <parameters>
   <parameter name="maxFileLength"><![CDATA[800]]></parameter>
  </parameters>
 </check>
 <check level="error" class="org.scalastyle.file.HeaderMatchesChecker" enabled="true">
  <parameters>
   <parameter name="header"><![CDATA[/*
 * 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.
 */]]></parameter>
  </parameters>
 </check>
 <check level="warning" class="org.scalastyle.scalariform.SpacesAfterPlusChecker" enabled="true"/>
 <check level="warning" class="org.scalastyle.file.WhitespaceEndOfLineChecker" enabled="true"/>
 <check level="warning" class="org.scalastyle.scalariform.SpacesBeforePlusChecker" enabled="true"/>
 <check level="warning" class="org.scalastyle.scalariform.SpaceAfterCommentStartChecker" enabled="true"/>
 <check level="warning" class="org.scalastyle.file.FileLineLengthChecker" enabled="true">
  <parameters>
   <parameter name="maxLineLength"><![CDATA[120]]></parameter>
   <parameter name="tabSize"><![CDATA[4]]></parameter>
  </parameters>
 </check>
 <check level="warning" class="org.scalastyle.scalariform.ClassNamesChecker" enabled="true">
  <parameters>
   <parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter>
  </parameters>
 </check>
 <check level="warning" class="org.scalastyle.scalariform.ObjectNamesChecker" enabled="true">
  <parameters>
   <parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter>
  </parameters>
 </check>
 <check level="warning" class="org.scalastyle.scalariform.PackageObjectNamesChecker" enabled="true">
  <parameters>
   <parameter name="regex"><![CDATA[^[a-z][A-Za-z]*$]]></parameter>
  </parameters>
 </check>
 <check level="warning" class="org.scalastyle.scalariform.EqualsHashCodeChecker" enabled="true"/>
 <check level="warning" class="org.scalastyle.scalariform.IllegalImportsChecker" enabled="true">
  <parameters>
   <parameter name="illegalImports"><![CDATA[sun._,java.awt._]]></parameter>
  </parameters>
 </check>
 <check level="warning" class="org.scalastyle.scalariform.ParameterNumberChecker" enabled="true">
  <parameters>
   <parameter name="maxParameters"><![CDATA[8]]></parameter>
  </parameters>
 </check>
 <check level="warning" class="org.scalastyle.scalariform.NoWhitespaceBeforeLeftBracketChecker" enabled="true"></check>
 <check level="warning" class="org.scalastyle.scalariform.NoWhitespaceAfterLeftBracketChecker" enabled="true"></check>
 <check level="warning" class="org.scalastyle.scalariform.ReturnChecker" enabled="true"></check>
 <check level="warning" class="org.scalastyle.scalariform.NullChecker" enabled="true"></check>
 <check level="warning" class="org.scalastyle.scalariform.NoCloneChecker" enabled="true"></check>
 <check level="warning" class="org.scalastyle.scalariform.NoFinalizeChecker" enabled="true"></check>
 <check level="warning" class="org.scalastyle.scalariform.CovariantEqualsChecker" enabled="true"></check>
 <check level="warning" class="org.scalastyle.scalariform.StructuralTypeChecker" enabled="true"></check>
 <check level="warning" class="org.scalastyle.scalariform.NumberOfTypesChecker" enabled="true">
  <parameters>
   <parameter name="maxTypes"><![CDATA[30]]></parameter>
  </parameters>
 </check>
 <check level="warning" class="org.scalastyle.scalariform.UppercaseLChecker" enabled="true"></check>
 <check level="warning" class="org.scalastyle.scalariform.SimplifyBooleanExpressionChecker" enabled="true"></check>
 <check level="warning" class="org.scalastyle.scalariform.IfBraceChecker" enabled="true">
  <parameters>
   <parameter name="singleLineAllowed"><![CDATA[true]]></parameter>
   <parameter name="doubleLineAllowed"><![CDATA[false]]></parameter>
  </parameters>
 </check>
 <check level="warning" class="org.scalastyle.scalariform.MethodLengthChecker" enabled="true">
  <parameters>
   <parameter name="maxLength"><![CDATA[50]]></parameter>
  </parameters>
 </check>
 <check level="warning" class="org.scalastyle.scalariform.MethodNamesChecker" enabled="true">
  <parameters>
   <parameter name="regex"><![CDATA[^[a-z][A-Za-z0-9]*$]]></parameter>
  </parameters>
 </check>
 <check level="warning" class="org.scalastyle.scalariform.NumberOfMethodsInTypeChecker" enabled="true">
  <parameters>
   <parameter name="maxMethods"><![CDATA[30]]></parameter>
  </parameters>
 </check>
 <check level="error" class="org.scalastyle.scalariform.PublicMethodsHaveTypeChecker" enabled="true"></check>
 <check level="warning" class="org.scalastyle.file.NewLineAtEofChecker" enabled="true"></check>
 <check level="warning" class="org.scalastyle.scalariform.RedundantIfChecker" enabled="true"></check>
 <check customId="println" level="error" class="org.scalastyle.scalariform.TokenChecker" enabled="true">
  <parameters>
   <parameter name="regex"><![CDATA[println]]></parameter>
  </parameters>
 </check>
 <check level="warning" class="org.scalastyle.scalariform.DeprecatedJavaChecker" enabled="true"></check>
 <check level="warning" class="org.scalastyle.scalariform.EmptyClassChecker" enabled="true"></check>
 <check level="warning" class="org.scalastyle.scalariform.ClassTypeParameterChecker" enabled="true">
  <parameters>
   <parameter name="regex"><![CDATA[^[A-Z_]$]]></parameter>
  </parameters>
 </check>
 <check level="error" class="org.scalastyle.scalariform.UnderscoreImportChecker" enabled="true"></check>
 <check level="warning" class="org.scalastyle.scalariform.LowercasePatternMatchChecker" enabled="true"></check>
 <check level="warning" class="org.scalastyle.scalariform.ImportGroupingChecker" enabled="true"></check>
</scalastyle>