<!--
   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>
    <Class name="org.apache.carbondata.core.index.IndexInputFormat"/>
    <Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED"/>
  </Match>
  <Match>
    <Class name="org.apache.carbondata.core.indexstore.UnsafeMemoryDMStore"/>
    <Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED"/>
  </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>
  <Match>
    <Class name="org.apache.carbondata.core.index.Segment"/>
    <Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED"/>
  </Match>
  <Match>
    <Class name="org.apache.carbondata.core.index.IndexFilter"/>
    <Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED"/>
  </Match>
  <Match>
    <Class name="org.apache.carbondata.core.index.IndexFilter"/>
    <Bug pattern="SE_BAD_FIELD"/>
  </Match>
  <Match>
    <Class name="org.apache.carbondata.events.OperationContext"/>
    <Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED"/>
  </Match>
  <Match> <Class name="~org.apache.spark.sql.secondaryindex.Jobs.BlockletIndexInputFormat"/> <Field name="indexExprWrapper"/> <Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED"/> </Match>
  <Match> <Class name="~org.apache.spark.sql.secondaryindex.Jobs.BlockletIndexInputFormat"/> <Field name="validSegments"/> <Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED"/> </Match>
</FindBugsFilter>