<!--
    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.
//-->
<FindBugsFilter>
  <!-- circe-checksum -->
  <Match>
    <!-- imported code -->
    <Class name="~com\.scurrilous\.circe.*" />
  </Match>
  <!-- bookkeeper-common -->
  <Match>
    <Class name="org.apache.bookkeeper.common.util.OrderedScheduler"/>
    <Method name="submit" />
    <Bug pattern="NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE"/>
  </Match>
  <!-- bookkeeper-proto -->
  <Match>
    <!-- generated code, we can't be held responsible for findbugs in it //-->
    <Class name="~org\.apache\.bookkeeper\.proto\.DataFormats.*" />
  </Match>
  <Match>
    <!-- generated code, we can't be held responsible for findbugs in it //-->
    <Class name="~org\.apache\.bookkeeper\.proto\.BookkeeperProtocol.*" />
  </Match>
  <Match>
    <!-- generated code, we can't be held responsible for findbugs in it //-->
    <Class name="~org\.apache\.bookkeeper\.bookie\.storage\.ldb\.DbLedgerStorageDataFormats.*" />
  </Match>
  <Match>
    <!-- generated code, we can't be held responsible for findbugs in it //-->
    <Class name="~org\.apache\.bookkeeper\.tests\.generated.*" />
  </Match>
  <Match>
    <!-- generated code -->
    <Class name="~org\.apache\.bookkeeper\.client\.generated.*"/>
  </Match>
  <Match>
    <!-- it is safe to store external bytes reference here. since we are using
         bytes from a slab. //-->
    <Class name="org.apache.bookkeeper.bookie.EntryKeyValue" />
    <Bug pattern="EI_EXPOSE_REP2" />
  </Match>
  <Match>
    <!-- it is safe to store external bytes reference here. since we are using
         bytes from a slab. //-->
    <Class name="org.apache.bookkeeper.bookie.EntryKeyValue" />
    <Method name="getBuffer" />
    <Bug pattern="EI_EXPOSE_REP" />
  </Match>
  <Match>
    <!-- https://github.com/spotbugs/spotbugs/issues/259 -->
    <Class name="org.apache.bookkeeper.bookie.InterleavedLedgerStorage" />
    <Method name="getLastAddConfirmed" />
    <Bug pattern="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE" />
  </Match>
  <Match>
    <Class name="org.apache.bookkeeper.auth.AuthToken" />
    <Method name="getData" />
    <Bug pattern="EI_EXPOSE_REP" />
  </Match>
  <Match>
    <Class name="org.apache.bookkeeper.client.LedgerEntry" />
    <Bug pattern="NM_SAME_SIMPLE_NAME_AS_INTERFACE" />
  </Match>
  <Match>
    <Class name="org.apache.bookkeeper.client.LedgerMetadata" />
    <Bug pattern="NM_SAME_SIMPLE_NAME_AS_INTERFACE" />
  </Match>
  <Match>
    <Class name="org.apache.bookkeeper.client.BookKeeper" />
    <Bug pattern="NM_SAME_SIMPLE_NAME_AS_INTERFACE" />
  </Match>
  <Match>
    <Class name="org.apache.bookkeeper.common.concurrent.FutureUtils"/>
    <Bug pattern="NP_NULL_PARAM_DEREF_NONVIRTUAL" />
  </Match>
  <Match>
    <Class name="org.apache.bookkeeper.common.concurrent.FutureUtils$1"/>
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <Match>
    <Class name="org.apache.bookkeeper.common.concurrent.FutureUtils"/>
    <Method name="Void" />
    <Bug pattern="NM_METHOD_NAMING_CONVENTION" />
  </Match>
  <Match>
    <Class name="org.apache.bookkeeper.util.MathUtils"/>
    <Bug pattern="NM_SAME_SIMPLE_NAME_AS_SUPERCLASS" />
  </Match>
  <Match>
    <Class name="org.apache.bookkeeper.util.SafeRunnable"/>
    <Bug pattern="NM_SAME_SIMPLE_NAME_AS_INTERFACE" />
  </Match>
  <And>
    <Bug category="MT_CORRECTNESS"/>
    <Class name="~org.apache.bookkeeper.util.collections\.[^.]+"/>
  </And>
  <And>
    <Class name="org.apache.bookkeeper.client.BKException" />
    <Bug pattern="NM_SAME_SIMPLE_NAME_AS_SUPERCLASS"/>
  </And>
  <And>
    <Class name="org.apache.bookkeeper.client.BKException$Code" />
    <Bug pattern="NM_SAME_SIMPLE_NAME_AS_INTERFACE"/>
  </And>

  <!-- microbenchmarks -->
  <!-- jmh generated code -->
  <Match>
    <Class name="~org\.apache\.bookkeeper\.proto\.generated.*" />
  </Match>
  <Match>
    <Class name="~org\.apache\.bookkeeper\.proto\.checksum\.generated.*" />
  </Match>
  <Match>
    <Class name="~org\.apache\.bookkeeper\.stats\.generated.*" />
  </Match>
  <Match>
    <Class name="~org\.apache\.bookkeeper\.stats\.codahale\.generated.*" />
  </Match>
  <Match>
    <Class name="~org\.apache\.bookkeeper\.common\.generated.*" />
  </Match>

  <!-- modules under stream/ -->

  <!-- common -->
  <Match>
    <Class name="org.apache.bookkeeper.common.hash.MurmurHash" />
    <Method name="hash64"/>
    <Bug pattern="SF_SWITCH_NO_DEFAULT"/>
  </Match>

  <!-- proto -->
  <Match>
    <Class name="~org.apache.bookkeeper.stream.coder.protobuf.test.*" />
  </Match>
  <Match>
    <Class name="~org.apache.bookkeeper.stream.proto.*" />
  </Match>

  <!-- statelib -->
  <Match>
    <Class name="~org.apache.bookkeeper.proto.statestore.*" />
  </Match>
</FindBugsFilter>
