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

  <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>
</FindBugsFilter>
