<?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.
-->

<!--
  This file contains some false positive bugs detected by findbugs. Their
  false positive nature has been analyzed individually and they have been
  put here to instruct findbugs it must ignore them.
-->
<FindBugsFilter>

  <!-- https://github.com/spotbugs/spotbugs/issues/1504 -->
  <Match>
    <Class name="org.apache.commons.lang3.ArrayUtils" />
    <Method name="shuffle" />
    <Bug pattern="DMI_RANDOM_USED_ONLY_ONCE" />
  </Match>

  <!-- https://github.com/spotbugs/spotbugs/issues/1504 -->
  <Match>
    <Class name="org.apache.commons.lang3.RandomStringUtils" />
    <Method name="random" />
    <Bug pattern="DMI_RANDOM_USED_ONLY_ONCE" />
  </Match>

  <Match>
    <Class name="org.apache.commons.lang3.ArrayUtils" />
    <Method name="addFirst" />
    <Bug pattern="NP_LOAD_OF_KNOWN_NULL_VALUE" />
  </Match>

  <!-- Reason: Optimization to use == -->
  <Match>
    <Class name="org.apache.commons.lang3.BooleanUtils" />
    <Or>
      <Method name="toBoolean" />
      <Method name="toBooleanObject" />
    </Or>
    <Bug pattern="ES_COMPARING_PARAMETER_STRING_WITH_EQ" />
  </Match>
  <Match>
    <Class name="org.apache.commons.lang3.BooleanUtils" />
    <Method name="toBoolean" />
    <Bug pattern="RC_REF_COMPARISON_BAD_PRACTICE_BOOLEAN" />
  </Match>

  <!-- Reason: Behavior documented in javadoc -->
  <Match>
    <Class name="org.apache.commons.lang3.BooleanUtils" />
    <Or>
      <Method name="negate" />
      <Method name="toBooleanObject" />
    </Or>
    <Bug pattern="NP_BOOLEAN_RETURN_NULL" />
  </Match>

  <!-- Reason: base class cannot be changed and field is properly checked against null so behavior is OK -->
  <Match>
    <Class name="org.apache.commons.lang3.text.ExtendedMessageFormat" />
    <Method name="applyPattern" />
    <Bug pattern="UR_UNINIT_READ_CALLED_FROM_SUPER_CONSTRUCTOR" />
  </Match>

  <!-- Reason: Optimization to use == -->
  <Match>
    <Class name="org.apache.commons.lang3.StringUtils" />
    <Or>
      <Method name="indexOfDifference"/>
      <Method name="compare" params="java.lang.String,java.lang.String,boolean"/>
      <Method name="compareIgnoreCase" params="java.lang.String,java.lang.String,boolean"/>
    </Or>
    <Bug pattern="ES_COMPARING_PARAMETER_STRING_WITH_EQ" />
  </Match>

  <!-- Reason: Very much intended to do a fall through on the switch -->
  <Match>
    <Class name="org.apache.commons.lang3.math.NumberUtils" />
    <Method name="createNumber"/>
    <Bug pattern="SF_SWITCH_FALLTHROUGH" />
  </Match>

  <!-- Reason: Very much intended to do a fall through on the switch -->
  <Match>
    <Class name="org.apache.commons.lang3.time.DateUtils" />
    <Method name="getFragment"/>
    <Bug pattern="SF_SWITCH_FALLTHROUGH" />
  </Match>

  <!-- Reason: toProperString is lazily loaded -->
  <Match>
    <Class name="org.apache.commons.lang3.math.Fraction" />
    <Field name="toProperString" />
    <Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED" />
  </Match>

  <!-- Reason: It does call super.clone(), but via a subsequent method -->
  <Match>
    <Class name="org.apache.commons.lang3.text.StrTokenizer" />
    <Method name="clone"/>
    <Bug pattern="CN_IDIOM_NO_SUPER_CALL" />
  </Match>

  <!-- Reason: FindBugs 2.0.2 used in maven-findbugs-plugin 2.5.2 seems to have problems with detection of default cases
   in switch statements. All the excluded methods have switch statements that conatin a default case. -->
  <Match>
    <Class name="org.apache.commons.lang3.math.NumberUtils"/>
    <Method name="createNumber" />
    <Bug pattern="SF_SWITCH_NO_DEFAULT" />
  </Match>
  <!-- Reason: FindBugs does not correctly recognize default branches in switch statements without break statements.
   See, e.g., the report at https://sourceforge.net/p/findbugs/bugs/1298 -->
  <Match>
    <Class name="org.apache.commons.lang3.time.FastDateParser"/>
    <Or>
      <Method name="getStrategy" />
      <Method name="simpleQuote" params="java.lang.StringBuilder, java.lang.String"/>
    </Or>
    <Bug pattern="SF_SWITCH_NO_DEFAULT" />
  </Match>

  <!-- Reason: FindBugs cannot correctly recognize default branches in switch statements without break statements.
   See, e.g., the report at https://sourceforge.net/p/findbugs/bugs/1298 -->
  <Match>
    <Class name="org.apache.commons.lang3.time.FastDatePrinter"/>
    <Method name="appendFullDigits" params="java.lang.Appendable, int, int"/>
    <Bug pattern="SF_SWITCH_NO_DEFAULT" />
  </Match>

  <!-- Reason: The fallthrough on the swich statement is intentional -->
  <Match>
    <Class name="org.apache.commons.lang3.time.FastDatePrinter"/>
    <Method name="appendFullDigits" params="java.lang.Appendable, int, int"/>
    <Bug pattern="SF_SWITCH_FALLTHROUGH" />
  </Match>

  <!-- Reason: Internal class that is used only as a key for an internal FormatCache. For this reason we can
   be sure, that equals will never be called with null or types other than MultipartKey.
  -->
  <Match>
    <Class name="org.apache.commons.lang3.time.FormatCache$MultipartKey" />
    <Method name="equals" />
    <Bug pattern="BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS" />
  </Match>
  <Match>
    <Class name="org.apache.commons.lang3.time.FormatCache$MultipartKey" />
    <Method name="equals" />
    <Bug pattern="NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT" />
  </Match>
  
  <!-- Reason: toString() can return null! -->
  <Match>
    <Class name="org.apache.commons.lang3.compare.ObjectToStringComparator" />
    <Method name="compare" />
    <Bug pattern="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE" />
  </Match>

  <!-- Reason: requireNonNull is supposed to take a nullable parameter,
       whatever Spotbugs thinks of it. -->
  <Match>
    <Class name="org.apache.commons.lang3.function.Objects" />
    <Method name="requireNonNull" />
    <Bug pattern="NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE" />
  </Match>
</FindBugsFilter>
