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

  <!-- Reason: exception in close swallowed in order to re-throw original -->
  <Match>
    <Class name="org.apache.commons.compress.archivers.zip.ZipFile" />
    <Method name="&lt;init&gt;" />
    <Bug pattern="DE_MIGHT_IGNORE" />
  </Match>
  <Match>
    <Class name="org.apache.commons.compress.compressors.pack200.Pack200CompressorOutputStream" />
    <Method name="finish" />
    <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>

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

</FindBugsFilter>
