<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<ruleset name="PMD.rul" 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 was created from PMD.rul</description>
  <exclude-pattern>(.*/)?(PatriciaST|PatriciaSET|SegmentTree|FenwickTree).java</exclude-pattern>
  <exclude-pattern>(.*/)?(IndexFibonacci|IndexBinomial|IndexMultiway|Multiway|Binomial|Fibonacci)MinPQ.java</exclude-pattern>
  <exclude-pattern>(.*/)?\.workspace/.*</exclude-pattern>
  <exclude-pattern>(.*/)?\.output/.*</exclude-pattern>
  <exclude-pattern>(.*/)?old/.*</exclude-pattern>
  <exclude-pattern>(.*/)?save/.*</exclude-pattern>
  <exclude-pattern>(.*/)?Eps(Document|Graphics2D).java</exclude-pattern>

  <rule ref="rulesets/java/basic.xml" >
    <exclude name="AvoidUsingHardCodedIP"/>
    <exclude name="CollapsibleIfStatements"/>  <!-- too many false positives -->
    <exclude name="OverrideBothEqualsAndHashcode"/>  <!-- defer to Checkstyle and Findbugs -->
  </rule>

<!--  <rule ref="rulesets/java/braces.xml"/> -->

  <rule ref="rulesets/java/clone.xml"/>

  <rule ref="rulesets/java/comments.xml">
    <exclude name="CommentSize"/>
    <exclude name="CommentRequired"/>
    <exclude name="CommentDefaultAccessModifier"/>
  </rule>

  <rule ref="rulesets/java/controversial.xml">
    <exclude name="AtLeastOneConstructor"/>
    <exclude name="UnnecessaryConstructor"/>
    <exclude name="OnlyOneReturn"/>
    <exclude name="AvoidFinalLocalVariable"/>
    <exclude name="DataflowAnomalyAnalysis"/>
    <exclude name="AvoidLiteralsInIfCondition"/>
    <exclude name="NullAssignment"/>
    <exclude name="OneDeclarationPerLine"/>
    <exclude name="AvoidUsingShortType"/>
<!--    <exclude name="AssignmentInOperand"/>  -->   <!-- probably want to add for COS 126 -->
    <exclude name="UnnecessaryParentheses"/>  <!-- defer to Checkstyle if we want to flag -->
    <exclude name="DefaultPackage"/>          <!-- for COS 126, will be picked up by API checker -->
  </rule>

  <rule ref="rulesets/java/design.xml">
    <exclude name="GodClass"/>
    <exclude name="UseVarargs"/>
    <exclude name="ClassWithOnlyPrivateConstructorsShouldBeFinal"/>
    <exclude name="ConstructorCallsOverridableMethod"/>
    <exclude name="CompareObjectsWithEquals"/>
    <exclude name="LogicInversion"/>
    <exclude name="AccessorClassGeneration"/>
    <exclude name="AccessorMethodGeneration"/>
    <exclude name="UncommentedEmptyConstructor"/>
    <exclude name="UseUtilityClass"/>
    <exclude name="PositionLiteralsFirstInComparisons"/>
    <exclude name="PositionLiteralsFirstInCaseInsensitiveComparisons"/>
    <exclude name="UnnecessaryLocalBeforeReturn"/>
    <exclude name="SimplifyBooleanReturns"/>          <!-- too many false positives -->
    <exclude name="ConfusingTernary"/>                <!-- too many false positives -->
    <exclude name="ImmutableField"/>                  <!-- flags mutable variables too -->
    <exclude name="AvoidReassigningParameters"/>      <!-- defer to Checkstyle -->
    <exclude name="SwitchStmtsShouldHaveDefault"/>    <!-- defer to Checkstyle, if desired -->
  </rule>

  <rule ref="rulesets/java/empty.xml">
  </rule>

  <rule ref="rulesets/java/empty.xml/EmptyCatchBlock">
    <properties>
        <property name="allowCommentedBlocks" value="true"/>
    </properties>
  </rule>



  <rule ref="rulesets/java/finalizers.xml"/>

  <rule ref="rulesets/java/imports.xml">
    <exclude name="UnusedImports"/>   <!-- defer to Checkstyle -->
  </rule>

  <rule ref="rulesets/java/j2ee.xml/DoNotUseThreads"
        message="Do not use threads in this course."/>

  <rule ref="rulesets/java/j2ee.xml/DoNotCallSystemExit"
        message="Do not call ''System.exit()'' in this course."/>

<!--  <rule ref="rulesets/java/j2ee.xml"/> -->

<!--  <rule ref="rulesets/java/javabeans.xml"/> -->
  <rule ref="rulesets/java/junit.xml"/>
<!--  <rule ref="rulesets/java/logging-jakarta-commons.xml"/> -->
<!--  <rule ref="rulesets/java/logging-java.xml"/> -->

  <rule ref="rulesets/java/naming.xml">
    <exclude name="ShortVariable"/>
    <exclude name="ShortMethodName"/>
    <exclude name="ShortClassName"/>
    <exclude name="MethodNamingConventions"/>
    <exclude name="ClassNamingConventions"/>
    <exclude name="GenericsNaming"/>
    <exclude name="VariableNamingConventions"/>
    <exclude name="AvoidFieldNameMatchingMethodName"/>
    <exclude name="AvoidFieldNameMatchingTypeName"/>
    <exclude name="NoPackage"/>
    <exclude name="SuspiciousConstantFieldName"/>         <!-- defer to Checkstyle -->
    <exclude name="MethodWithSameNameAsEnclosingClass"/>  <!-- defer to Checkstyle -->
  </rule>

  <rule ref="rulesets/java/naming.xml/LongVariable">
    <properties>
        <property name="minimum" value="35"/>
    </properties>
  </rule>

  <rule ref="rulesets/java/optimizations.xml">
    <exclude name="LocalVariableCouldBeFinal"/>
    <exclude name="MethodArgumentCouldBeFinal"/>
    <exclude name="AvoidInstantiatingObjectsInLoops"/>
    <exclude name="RedundantFieldInitializer"/>
    <exclude name="PrematureDeclaration"/>
    <exclude name="AddEmptyString"/>
    <exclude name="AvoidArrayLoops"/>
    <exclude name="UseArrayListInsteadOfVector"/>       <!-- for our Vector data type -->
    <exclude name="UseStringBufferForStringAppends"/>   <!-- exclude for COS 126 LFSR -->
  </rule>

  <rule ref="rulesets/java/strictexception.xml">
    <exclude name="AvoidThrowingRawExceptionTypes"/>    <!-- for COS 126 RingBuffer -->
  </rule>


  <rule ref="rulesets/java/strings.xml">
    <exclude name="AvoidDuplicateLiterals"/>
    <exclude name="StringInstantiation"/>                  <!-- defer to Findbugs -->
    <exclude name="StringToString"/>                       <!-- defer to Findbugs -->
    <exclude name="InefficientStringBuffering"/>
    <exclude name="AppendCharacterWithChar"/>
    <exclude name="ConsecutiveAppendsShouldReuse"/>
    <exclude name="ConsecutiveLiteralAppends"/>
    <exclude name="InefficientEmptyStringCheck"/>
    <exclude name="InsufficientStringBufferDeclaration"/>
  </rule>

  <rule ref="rulesets/java/sunsecure.xml"/>

  <rule ref="rulesets/java/typeresolution.xml">
    <exclude name="LooseCoupling"/>
    <exclude name="UnusedImports"/>  <!-- defer to Checkstyle -->
  </rule>

  <rule ref="rulesets/java/unnecessary.xml">
    <exclude name="UnnecessaryFinalModifier"/>
    <exclude name="UnnecessaryReturn"/>
    <exclude name="UselessParentheses"/>
  </rule>

  <rule ref="rulesets/java/unusedcode.xml"/>

</ruleset>
