<?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 spotbugs. Their
  false positive nature has been analyzed individually and they have been
  put here to instruct spotbugs it must ignore them.
-->
<FindBugsFilter
    xmlns="https://github.com/spotbugs/filter/3.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://github.com/spotbugs/filter/3.0.0 https://raw.githubusercontent.com/spotbugs/spotbugs/3.1.0/spotbugs/etc/findbugsfilter.xsd">

  <Match>
    <Class name="~.*\.jmh\..*generated\..*"/>
  </Match>

  <Match>
    <!-- Direct access to an internal array is required for the benchmark. -->
    <Class name="org.apache.commons.rng.examples.jmh.ConstructionPerformance$Sources"/>
    <BugPattern name="EI_EXPOSE_REP"/>
  </Match>

  <Match>
    <!-- The EnumMap allows a null key so it must be checked for null. -->
    <Class name="org.apache.commons.rng.simple.ThreadLocalRandomSource"/>
    <Method name="current"/>
    <BugPattern name="RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE"/>
  </Match>

  <!-- False positives for NPE checks. -->
  <Match>
    <Class name="org.apache.commons.rng.examples.stress.StressTestCommand"/>
    <Method name="createStressTestData"/>
    <BugPattern name="RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE"/>
  </Match>
  <Match>
    <Class name="org.apache.commons.rng.examples.stress.StressTestCommand$StressTestTask"/>
    <Method name="write"/>
    <BugPattern name="RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE"/>
  </Match>
  <Match>
    <Class name="org.apache.commons.rng.examples.stress.RngDataOutput"/>
    <Method name="close"/>
    <BugPattern name="RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE"/>
  </Match>
  <Match>
    <Class name="org.apache.commons.rng.examples.stress.ResultsCommand"/>
    <Method name="readFileContents"/>
    <BugPattern name="RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE"/>
  </Match>

  <Match>
    <!-- Benchmark state classes can expose internal representations.
         Unwritten fields can be used for baseline values. -->
    <Class name="~org.apache.commons.rng.examples.jmh..*(Benchmark|Performance).*"/>
    <Or>
      <BugPattern name="EI_EXPOSE_REP"/>
      <BugPattern name="UWF_UNWRITTEN_FIELD"/>
    </Or>
  </Match>

  <Match>
    <Class name="org.apache.commons.rng.examples.sampling.ProbabilityDensityApproximationCommand"/>
    <Method name="call"/>
    <BugPattern name="DLS_DEAD_LOCAL_STORE"/>
  </Match>

  <Match>
    <Or>
      <Class name="org.apache.commons.rng.examples.sampling.ProbabilityDensityApproximationCommand"/>
      <Class name="org.apache.commons.rng.examples.stress.ExamplesStressApplication"/>
    </Or>
    <BugPattern name="DM_EXIT"/>
  </Match>

  <Match>
    <!-- This is required to ensure the uniform deviate has exclusive lower bounds. -->
    <Or>
      <Class name="org.apache.commons.rng.sampling.distribution.StableSampler$BaseStableSampler"/>
      <Class name="org.apache.commons.rng.examples.jmh.sampling.distribution.StableSamplerPerformance$StableRandomGenerator"/>
    </Or>
    <Or>
      <Method name="getPhi"/>
      <Method name="getPhiBy2"/>
    </Or>
    <BugPattern name="FE_FLOATING_POINT_EQUALITY"/>
  </Match>
  <Match>
    <!-- This is required to ensure the uniform deviate has exclusive lower bounds. -->
    <Class name="~.*\.StableSamplerPerformance\$UniformRandomSource.*"/>
    <BugPattern name="FE_FLOATING_POINT_EQUALITY"/>
  </Match>

  <!-- False positives for range checks. The return value matches the argument. -->
  <Match>
    <Or>
      <Class name="org.apache.commons.rng.core.source32.IntProvider"/>
      <Class name="org.apache.commons.rng.core.source64.LongProvider"/>
    </Or>
    <Method name="nextBytes"/>
    <BugPattern name="RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT"/>
  </Match>

  <Match>
    <!-- This intentionally stores an externally mutable object. -->
    <Class name="org.apache.commons.rng.simple.JDKRandomWrapper"/>
    <BugPattern name="EI_EXPOSE_REP2"/>
  </Match>

  <Match>
    <!-- This intentionally creates a single-use SecureRandom to generate a seed. -->
    <Class name="org.apache.commons.rng.simple.internal.SeedFactory"/>
    <BugPattern name="DMI_RANDOM_USED_ONLY_ONCE"/>
  </Match>

  <!-- Use of floating-point loop counters is intentional. -->
  <Match>
    <Class name="org.apache.commons.rng.sampling.distribution.AhrensDieterExponentialSampler"/>
    <Method name="sample"/>
    <BugPattern name="FL_FLOATS_AS_LOOP_COUNTERS"/>
  </Match>
  <Match>
    <Class name="org.apache.commons.rng.sampling.distribution.MarsagliaTsangWangDiscreteSampler$Poisson"/>
    <Or>
      <Method name="createPoissonDistributionFromX0"/>
      <Method name="createPoissonDistributionFromXMode"/>
    </Or>
    <BugPattern name="FL_FLOATS_AS_LOOP_COUNTERS"/>
  </Match>
  <Match>
    <Class name="org.apache.commons.rng.examples.sampling.UniformSamplingVisualCheckCommand"/>
    <Method name="call"/>
    <BugPattern name="FL_FLOATS_AS_LOOP_COUNTERS"/>
  </Match>

</FindBugsFilter>
