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

  <Match>
    <Source name="~.*Test\.java" />
  </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"/>
    <Method name="getDataInputStream"/>
    <Bug pattern="OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE"/>
  </Match>
  <Match>
    <Class name="org.apache.carbondata.core.datastore.impl.FileReaderImpl"/>
    <Method name="getDataInputStream"/>
    <Bug pattern="OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE"/>
  </Match>
  <Match>
    <Class name="org.apache.carbondata.core.constants.CarbonCommonConstants"/>
    <Bug pattern="MS_MUTABLE_ARRAY"/>
  </Match>
  <Match>
    <Class name="org.apache.carbondata.core.scan.expression.ExpressionResult"/>
    <Method name="getBoolean"/>
    <Bug pattern="NP_BOOLEAN_RETURN_NULL"/>
  </Match>
  <Match>
    <Class name="org.apache.carbondata.core.metadata.schema.table.column.CarbonImplicitDimension"/>
    <Method name="equals"/>
    <Bug pattern="EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC"/>
  </Match>
  <Match>
    <Class name="org.apache.carbondata.core.statusmanager.LoadMetadataDetails"/>
    <Method name="getTimeStamp"/>
    <Bug pattern="STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE"/>
  </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>
    <Class name="org.apache.carbondata.core.scan.aggregator.impl.BitSet"/>
    <Or>
    <Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED"/>
    </Or>
  </Match>
  <Match>
    <Bug pattern="SIC_INNER_SHOULD_BE_STATIC_ANON"/>
  </Match>
  <Match>
    <Bug pattern="DP_DO_INSIDE_DO_PRIVILEGED"/>
  </Match>
  <Match>
    <Bug pattern="UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR"/>
  </Match>
  <Match>
    <Bug pattern="JLM_JSR166_UTILCONCURRENT_MONITORENTER"/>
  </Match>
</FindBugsFilter>