<!--
    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\.thrift.*" />
  </Match>
  <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>
</FindBugsFilter>
