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

  <!-- Reason: References to System.out/err == -->
  <Match>
    <Class name="org.apache.commons.compress.archivers.Lister" />
    <Or>
      <Method name="main" />
      <Method name="usage" />
    </Or>
    <Bug pattern="NP_ALWAYS_NULL" />
  </Match>
  <Match>
    <Class name="org.apache.commons.compress.archivers.zip.ZipFile" />
    <Method name="finalize" />
    <Bug pattern="NP_ALWAYS_NULL" />
  </Match>
  <Match>
    <Class name="org.apache.commons.compress.archivers.dump.DumpArchiveUtil" />
    <Method name="dumpBlock" />
    <Bug pattern="NP_ALWAYS_NULL" />
  </Match>

  <!-- Reason: fallthrough is intended -->
  <Match>
    <Class name="org.apache.commons.compress.archivers.zip.ExtraFieldUtils" />
    <Method name="parse" />
    <Bug pattern="SF_SWITCH_FALLTHROUGH" />
  </Match>

  <!-- Reason: fields unused as documented -->
  <Match>
    <Class name="org.apache.commons.compress.archivers.jar.JarArchiveEntry" />
    <Or>
      <Field name="certificates"/>
      <Field name="manifestAttributes"/>
    </Or>
    <Bug pattern="UWF_NULL_FIELD" />
  </Match>
  <Match>
    <Class name="org.apache.commons.compress.archivers.dump.DumpArchiveEntry" />
    <Field name="summary"/>
    <Bug pattern="UWF_NULL_FIELD" />
  </Match>
  <Match>
    <Class name="org.apache.commons.compress.archivers.sevenz.Folder" />
    <Or>
      <Field name="totalInputStreams"/>
    </Or>
    <Bug pattern="URF_UNREAD_FIELD" />
  </Match>

  <!-- Reason: exception in close swallowed in order to re-throw original in caller -->
  <Match>
    <Class name="org.apache.commons.compress.utils.IOUtils" />
    <Method name="closeQuietly" />
    <Bug pattern="DE_MIGHT_IGNORE" />
  </Match>

  <!-- Reason: skip(Long.MAX_VALUE) called to drain stream completely,
       the class overrides skip to ensure it reads the full amount
       until EOF is reached -->
  <Match>
    <Class name="org.apache.commons.compress.archivers.zip.ZipArchiveInputStream" />
    <Method name="closeEntry" />
    <Bug pattern="SR_NOT_CHECKED" />
  </Match>
  <Match>
    <Class name="org.apache.commons.compress.archivers.tar.TarArchiveInputStream" />
    <Method name="getNextTarEntry" />
    <Bug pattern="SR_NOT_CHECKED" />
  </Match>

  <!-- Reason: trying to delete a temporary file that has deleteOnExit set
       anyway -->
  <Match>
    <Class name="org.apache.commons.compress.compressors.pack200.Pack200Utils" />
    <Method name="normalize" />
    <Bug pattern="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE" />
  </Match>
  <Match>
    <Class name="org.apache.commons.compress.compressors.pack200.TempFileCachingStreamBridge$1" />
    <Method name="close" />
    <Bug pattern="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE" />
  </Match>

  <!-- Reason: It is the Pack200*Stream that's going to close it. -->
  <Match>
    <Class name="org.apache.commons.compress.compressors.pack200.TempFileCachingStreamBridge$1" />
    <Method name="&lt;init&gt;" />
    <Bug pattern="OBL_UNSATISFIED_OBLIGATION" />
  </Match>

  <!-- Reason: the contract is to use default encoding (unless told otherwise) -->
  <Match>
    <Class name="org.apache.commons.compress.archivers.arj.ArjArchiveInputStream" />
    <Method name="readString" />
    <Bug pattern="DM_DEFAULT_ENCODING" />
  </Match>
  <Match>
    <Class name="org.apache.commons.compress.archivers.zip.AsiExtraField" />
    <Or>
      <Method name="getLocalFileDataData" />
      <Method name="getLocalFileDataLength" />
      <Method name="parseFromLocalFileData" />
    </Or>
    <Bug pattern="DM_DEFAULT_ENCODING" />
  </Match>
  <Match>
    <Class name="org.apache.commons.compress.archivers.zip.FallbackZipEncoding" />
    <Or>
      <Method name="decode" />
      <Method name="encode" />
    </Or>
    <Bug pattern="DM_DEFAULT_ENCODING" />
  </Match>

  <!-- Reason: default encoding is good enough for exception message -->
  <Match>
    <Class name="org.apache.commons.compress.archivers.tar.TarUtils" />
    <Method name="exceptionMessage" />
    <Bug pattern="DM_DEFAULT_ENCODING" />
  </Match>

  <!-- Reason: unrolled loop, all possible cases are covered -->
  <Match>
    <Class name="org.apache.commons.compress.compressors.snappy.PureJavaCrc32C" />
    <Method name="update" />
    <Bug pattern="SF_SWITCH_NO_DEFAULT" />
  </Match>

  <!-- Reason: class only adds unused always-null fields and superclass' equals is sufficient -->
  <Match>
    <Class name="org.apache.commons.compress.archivers.jar.JarArchiveEntry" />
    <Method name="equals" />
    <Bug pattern="EQ_DOESNT_OVERRIDE_EQUALS" />
  </Match>
  
  <!-- Reason: failure to delete a file that may not exist. And we really don't care that much either -->
  <Match>
    <Class name="org.apache.commons.compress.parallel.FileBasedScatterGatherBackingStore" />
    <Method name="close" />
    <Bug pattern="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE" />
  </Match>

  <!-- Reason: nested code can throw IllegalArgumentException if
       stream is not a TAR stream -->
  <Match>
    <Class name="org.apache.commons.compress.archivers.ArchiveStreamFactory" />
    <Method name="createArchiveInputStream" />
    <Bug pattern="REC_CATCH_EXCEPTION" />
  </Match>
  
</FindBugsFilter>
