<!--
   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>
    <Package name="org.apache.carbondata.format"/>
  </Match>

  <Match>
    <Source name="~.*\.scala" />
  </Match>

  <!-- This method creates stream but the caller methods are responsible for closing the stream -->
  <Match>
    <Class name="org.apache.carbondata.core.datastore.impl.FileFactory"/>
    <Or>
      <Method name="getDataInputStream"/>
    </Or>
    <Bug pattern="OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE"/>
  </Match>

  <Match>
    <Class name="org.apache.carbondata.core.scan.aggregator.impl.BitSet"/>
    <Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED"/>
  </Match>

  <Match>
    <Class name="org.apache.carbondata.core.scan.expression.ExpressionResult"/>
    <Or>
      <Method name="getBoolean"/>
    </Or>
    <Bug pattern="NP_BOOLEAN_RETURN_NULL"/>
  </Match>

  <Match>
    <Class name="org.apache.carbondata.processing.csvreaderstep.BlockDataHandler"/>
    <Or>
      <Method name="readOneRow"/>
    </Or>
    <Bug pattern="NP_GUARANTEED_DEREF"/>
  </Match>

  <Match>
    <!--
    A mutable static field could be changed by malicious code or by accident. The field could be
    made package protected to avoid this vulnerability.

    We have a set of stuff like:
    public static final byte [] SKIP_ARRAY = new byte [ ] {'S', 'K', 'I', 'P'};

    Warning is not wrong, but difficult to avoid...
    !-->
    <Bug pattern="MS_PKGPROTECT"/>
  </Match>
  <Match>
    <Bug pattern="MS_OOI_PKGPROTECT"/>
  </Match>


  <Match>
    <!--
    Returning a reference to a mutable object value stored in one of the object's fields exposes
    the internal representation of the object.  If instances are accessed by untrusted code,
    and unchecked changes to the mutable object would compromise security or other important
    properties, you will need to do something different. Returning a new copy of the object is
    better approach in many situations.

    We have getters on our internal fields. Questionable, but out of findbugs scope. Returning a
    copy is not practical in most cases.
    !-->
    <Bug pattern="EI_EXPOSE_REP"/>
  </Match>
  <Match>
    <Bug pattern="EI_EXPOSE_REP2"/>
  </Match>


  <Match>
    <!--
    This class implements the Comparator interface. You should consider whether or not it should
    also implement the Serializable interface. If a comparator is used to construct an ordered
    collection such as a TreeMap, then the TreeMap will be serializable only if the comparator
    is also serializable. As most comparators have little or no state, making them serializable
    is generally easy and good defensive programming.
    !-->
    <Bug pattern="SE_COMPARATOR_SHOULD_BE_SERIALIZABLE"/>
  </Match>

  <Match>

    <!--
    This method performs synchronization an object that is an instance of a class from
    the java.util.concurrent package (or its subclasses). Instances of these classes have their own
    concurrency control mechanisms that are orthogonal to the synchronization provided by the Java
    keyword synchronized. For example, synchronizing on an AtomicBoolean will not prevent other
    threads from modifying the AtomicBoolean.

    Such code may be correct, but should be carefully reviewed and documented, and may confuse people
    who have to maintain the code at a later date.

    We do that all the time to save lock objects.
    !-->
    <Bug pattern="JLM_JSR166_UTILCONCURRENT_MONITORENTER"/>
  </Match>

  <Match>
    <!--
    Found a call to a method which will perform a byte to String (or String to byte) conversion,
    and will assume that the default platform encoding is suitable. This will cause the
    application behaviour to vary between platforms. Use an alternative API and specify a
    charset name or Charset object explicitly.
    !-->
    <Bug pattern="DM_DEFAULT_ENCODING"/>
  </Match>

  <Match>
    <!--
     Invoking System.exit shuts down the entire Java virtual machine. This should only been
     done when it is appropriate. Such calls make it hard or impossible for your code to be
     invoked by other code. Consider throwing a RuntimeException instead.

     It's so bad that the reviews will catch all the wrong cases.
    !-->
    <Bug pattern="DM_EXIT"/>
  </Match>

  <Match>
    <!--
     This method returns a value that is not checked. The return value should be checked since
     it can indicate an unusual or unexpected function execution. For example, the
     File.delete() method returns false if the file could not be successfully deleted
     (rather than throwing an Exception). If you don't check the result, you won't notice
     if the method invocation signals unexpected behavior by returning an atypical return
     value.

     It's so bad that the reviews will catch all the wrong cases.
    !-->
    <Bug pattern="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE"/>
  </Match>
  <Match>
    <Bug pattern="RV_RETURN_VALUE_IGNORED_INFERRED"/>
  </Match>


  <Match>
    <!--
     This method contains a redundant check of a known non-null value against the constant null.

     Most of the time we're securing ourselves, does no much harm.
    !-->
    <Bug pattern="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE"/>
  </Match>

  <Match>
    <!--
    A final static field references an array and can be accessed by malicious code or by
    accident from another package. This code can freely modify the contents of the array.

     We've got this all over the place... Cloning the array by security is not a general
     solution from a performance point of view
    !-->
    <Bug pattern="MS_MUTABLE_ARRAY"/>
  </Match>

</FindBugsFilter>