<!--
    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>
  <Match>
    <!-- generated code, we can't be held responsible for findbugs in it //-->
    <Class name="~org\.apache\.distributedlog\.tests\.generated.*" />
  </Match>
  <Match>
    <!-- generated code, we can't be held responsible for findbugs in it //-->
    <Class name="~org\.apache\.distributedlog\.thrift.*" />
  </Match>
  <!-- distributedlog-benchmark -->
  <Match>
    <!-- generated code, we can't be held responsible for findbugs in it //-->
    <Class name="~org\.apache\.distributedlog\.benchmark\.thrift.*" />
  </Match>
  <!-- distributedlog-common -->
  <Match>
    <Class name="org.apache.distributedlog.common.concurrent.FutureUtils"/>
    <Bug pattern="NP_NULL_PARAM_DEREF_NONVIRTUAL" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.common.concurrent.FutureUtils$2"/>
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.common.concurrent.FutureUtils"/>
    <Method name="Void" />
    <Bug pattern="NM_METHOD_NAMING_CONVENTION" />
  </Match>
  <!-- distributedlog-core -->
  <Match>
    <!-- it is safe to store external bytes reference here. //-->
    <Class name="org.apache.distributedlog.Entry$Builder" />
    <Method name="setData" />
    <Bug pattern="EI_EXPOSE_REP2" />
  </Match>
  <Match>
    <!-- it is safe to store external bytes reference here. //-->
    <Class name="org.apache.distributedlog.Entry" />
    <Method name="getRawData" />
    <Bug pattern="EI_EXPOSE_REP" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.BKAsyncLogReader" />
    <Method name="run" />
    <Bug pattern="JLM_JSR166_UTILCONCURRENT_MONITORENTER" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.BKLogReadHandler$1" />
    <Method name="onSuccess" />
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.BookKeeperClient$2" />
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.ReadUtils" />
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.ReadUtils$2" />
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.auditor.DLAuditor$2" />
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.auditor.DLAuditor$8" />
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.bk.SimpleLedgerAllocator$4" />
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.bk.SimpleLedgerAllocator$4$1" />
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.bk.SimpleLedgerAllocator$5" />
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.impl.acl.ZKAccessControl$4" />
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.impl.acl.ZKAccessControlManager$1" />
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.impl.acl.ZKAccessControlManager$1$1" />
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.impl.metadata.ZKLogStreamMetadataStore$1$1" />
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.lock.ZKSessionLock" />
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.lock.ZKSessionLock$12" />
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.lock.ZKSessionLock$13$1" />
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.util.Utils" />
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <Match>
    <Class name="org.apache.distributedlog.util.Utils$6" />
    <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
  </Match>
  <!-- distributedlog-protocol -->
  <Match>
    <!-- it is safe to store external bytes reference here. //-->
    <Class name="org.apache.distributedlog.LogRecord" />
    <Bug pattern="EI_EXPOSE_REP2" />
  </Match>
  <Match>
    <!-- it is safe to store external bytes reference here. //-->
    <Class name="org.apache.distributedlog.LogRecord" />
    <Method name="getPayload" />
    <Bug pattern="EI_EXPOSE_REP" />
  </Match>
  <!-- distributedlog-proxy-server -->
  <Match>
    <!-- generated code, we can't be held responsible for findbugs in it //-->
    <Class name="~org\.apache\.distributedlog\.service\.placement\.thrift.*" />
  </Match>
  <Match>
    <!-- it is safe to cast exception here. //-->
    <Class name="org.apache.distributedlog.service.DistributedLogServiceImpl$Stream$2" />
    <Method name="onFailure" />
    <Bug pattern="BC_UNCONFIRMED_CAST" />
  </Match>
  <Match>
    <!-- it is safe to cast exception here. //-->
    <Class name="org.apache.distributedlog.service.stream.BulkWriteOp" />
    <Method name="isDefiniteFailure" />
    <Bug pattern="BC_IMPOSSIBLE_INSTANCEOF" />
  </Match>
  <!-- distributedlog-messaging -->
  <Match>
    <!-- generated code, we can't be held responsible for findbugs in it //-->
    <Class name="~.*\.TransformedRecord" />
  </Match>
  <Match>
    <!-- it is safe to store external bytes reference here. //-->
    <Class name="org.apache.distributedlog.messaging.PartitionedMultiWriter" />
    <Bug pattern="EI_EXPOSE_REP2" />
  </Match>
  <Match>
    <!-- it is safe to store external bytes reference here. //-->
    <Class name="org.apache.distributedlog.messaging.RRMultiWriter" />
    <Bug pattern="EI_EXPOSE_REP2" />
  </Match>
</FindBugsFilter>
