<?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.
-->
<ruleset name="commons-rng-customized"
    xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
  <description>
    This ruleset checks the code for discouraged programming constructs.
  </description>

  <rule ref="category/java/bestpractices.xml">
    <exclude name="UseVarargs" />
    <!-- Allow private inner classes to access outer class methods/fields. -->
    <exclude name="AccessorMethodGeneration" />
  </rule>
  <rule ref="category/java/codestyle.xml">
    <exclude name="MethodArgumentCouldBeFinal" />
    <exclude name="ShortVariable" />
    <exclude name="LongVariable" />
    <exclude name="CommentDefaultAccessModifier" />
    <exclude name="DefaultPackage" />
    <exclude name="CallSuperInConstructor" />
    <exclude name="AbstractNaming" />
    <exclude name="UselessParentheses" />
    <exclude name="AtLeastOneConstructor" />
    <exclude name="GenericsNaming" />
    <exclude name="OnlyOneReturn" />
    <exclude name="UseUnderscoresInNumericLiterals" />
    <exclude name="ShortClassName" />
  </rule>
  <rule ref="category/java/design.xml">
    <exclude name="TooManyMethods" />
    <exclude name="LawOfDemeter" />
    <exclude name="NcssCount" />
    <exclude name="LoosePackageCoupling" />
  </rule>
  <rule ref="category/java/documentation.xml">
    <exclude name="CommentSize" />
  </rule>
  <rule ref="category/java/errorprone.xml">
    <exclude name="BeanMembersShouldSerialize" />
    <!-- This rule is known to be poor with Java 5 and later:
      https://github.com/pmd/pmd/issues/873 -->
    <exclude name="DataflowAnomalyAnalysis" />
  </rule>
  <rule ref="category/java/multithreading.xml">
    <!-- <exclude name="..." /> -->
  </rule>
  <rule ref="category/java/performance.xml">
    <!-- <exclude name="..." /> -->
  </rule>

  <!-- Rule customisations. -->

  <rule ref="category/java/codestyle.xml/ShortMethodName">
    <properties>
      <!-- TODO: Current regex effectively disables this rule. -->
      <property name="violationSuppressXPath" value="//ClassOrInterfaceType[matches(@Image, '^.*$')]"/>
    </properties>
  </rule>
  <rule ref="category/java/codestyle.xml/ClassNamingConventions">
    <properties>
      <property name="classPattern" value="[A-Z][a-zA-Z0-9]*" />
      <property name="abstractClassPattern" value="[A-Z][a-zA-Z0-9]*" />
      <property name="interfacePattern" value="[A-Z][a-zA-Z0-9]*" />
      <property name="enumPattern" value="[A-Z][a-zA-Z0-9]*" />
      <property name="annotationPattern" value="[A-Z][a-zA-Z0-9]*" />
      <property name="utilityClassPattern" value="[A-Z][a-zA-Z0-9]*" />
    </properties>
  </rule>

  <rule ref="category/java/design.xml/CyclomaticComplexity">
    <properties>
      <!-- Increase from default of 10 -->
      <property name="methodReportLevel" value="20"/>
    </properties>
  </rule>
  <rule ref="category/java/design.xml/ExcessivePublicCount">
    <properties>
      <property name="violationSuppressXPath"
        value="//ClassOrInterfaceType[@Image='Complex'
               or @Image='Fraction'
               or @Image='BigFraction']"/>
    </properties>
  </rule>
  <rule ref="category/java/design.xml/ExcessiveClassLength">
    <properties>
      <property name="violationSuppressXPath"
        value="//ClassOrInterfaceType[@Image='Complex'
               or @Image='Fraction'
               or @Image='BigFraction']"/>
    </properties>
  </rule>
  <rule ref="category/java/design.xml/GodClass">
    <properties>
      <property name="violationSuppressXPath"
        value="//ClassOrInterfaceType[@Image='Fraction'
               or @Image='BigFraction']"/>
    </properties>
  </rule>

  <rule ref="category/java/errorprone.xml/AvoidLiteralsInIfCondition">
    <properties>
      <property name="ignoreMagicNumbers" value="-1,0,1" />
      <property name="violationSuppressXPath"
        value="//ClassOrInterfaceType[@Image='LogGamma'
               or @Image='LogGammaSum'
               or @Image='InverseErf'
               or @Image='InvGamma1pm1']"/>
    </properties>
  </rule>

  <rule ref="category/java/errorprone.xml/AvoidFieldNameMatchingMethodName">
    <properties>
      <property name="violationSuppressXPath"
        value="//ClassOrInterfaceType[@Image='Complex'
               or @Image='Fraction'
               or @Image='BigFraction']"/>
    </properties>
  </rule>

  <!-- Long methods are based on reference implementations. -->
  <rule ref="category/java/design.xml/ExcessiveMethodLength">
    <properties>
      <property name="violationSuppressXPath"
        value="//ClassOrInterfaceType[@Image='Complex'
               or @Image='BigFraction']"/>
    </properties>
  </rule>

  <!-- Complex parse deliberately catches and re-throws a new NumberFormatException
       to include the full input string in the exception message. -->
  <rule ref="category/java/design.xml/AvoidThrowingNewInstanceOfSameException">
    <properties>
      <property name="violationSuppressXPath"
        value="//ClassOrInterfaceType[@Image='Complex']"/>
    </properties>
  </rule>
  <rule ref="category/java/bestpractices.xml/PreserveStackTrace">
    <properties>
      <property name="violationSuppressXPath"
        value="//ClassOrInterfaceType[@Image='Complex']"/>
    </properties>
  </rule>

</ruleset>
