<!--
Licensed 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>
  <!-- Warnings triggered in thrift-generated code. -->
  <Match>
    <Or>
      <Package name="org.apache.aurora.gen" />
      <Package name="org.apache.aurora.gen.comm" />
      <Package name="org.apache.aurora.gen.storage" />
      <Package name="org.apache.aurora.gen.test" />
      <Package name="org.apache.aurora.benchmark.generated" />
      <Package name="org.openjdk.jmh.infra.generated" />
      <!-- Un-namespaced structs used by the executor. -->
      <Class name="ProcessState" />
      <Class name="ProcessStatus" />
      <Class name="RunnerHeader" />
      <Class name="RunnerState" />
      <Class name="TaskStatus" />
    </Or>
    <Or>
      <Bug pattern="BC_IMPOSSIBLE_CAST" />
      <Bug pattern="CN_IDIOM" />
      <Bug pattern="DLS_DEAD_LOCAL_STORE" />
      <Bug pattern="NM_CLASS_NAMING_CONVENTION" />
      <Bug pattern="UUF_UNUSED_FIELD" />
    </Or>
  </Match>

  <!-- Warnings triggered for mybatis shim classes. -->
  <Match>
    <Package name="org.apache.aurora.scheduler.storage.db.views" />
    <Or>
      <!-- The shim classes trip these warnings since we have no code that explicitly sets fields,
           but mybatis reflects and sets them for us.
       -->
      <Bug pattern="NP_UNWRITTEN_FIELD" />
      <Bug pattern="UWF_UNWRITTEN_FIELD" />
    </Or>
  </Match>

  <!-- We don't make use of Java serialization and this can prevent, for example, declaring an
       HttpServlet as an anonymous inner class for testing. -->
  <Match>
    <Bug pattern="SE_BAD_FIELD" />
  </Match>

  <!-- We must maintain reflexivity with WildcardPermission's equals, so we cannot override
       it even though we add fields in our subclass. We cannot use delegation because
       WildcardPermission's implies method checks that its argument is an instance of
       WildcardPermission. -->
  <Match>
    <Or>
      <Class name="org.apache.aurora.scheduler.spi.Permissions$JobScopedRpcPermission" />
      <Class name="org.apache.aurora.scheduler.spi.Permissions$UnscopedRpcPermission" />
    </Or>
    <Bug pattern="EQ_DOESNT_OVERRIDE_EQUALS" />
  </Match>

  <!-- Method is intentionally only callable by EventBus. -->
  <Match>
    <Class name="org.apache.aurora.scheduler.events.PubsubEventModule$1" />
    <Bug pattern="UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS" />
  </Match>

  <!-- Technical debt. -->
  <Match>
    <Class name="org.apache.aurora.scheduler.log.mesos.MesosLog$LogStream" />
    <Bug pattern="IS2_INCONSISTENT_SYNC" />
  </Match>
  <Match>
    <Class name="org.apache.aurora.scheduler.http.Utilization" />
    <Bug pattern="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE" />
  </Match>
  <Match>
    <Class name="~org\.apache\.aurora.*$" />
    <Bug pattern="NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE" />
  </Match>
  <Match>
    <Or>
      <Class name="org.apache.aurora.scheduler.storage.backup.StorageBackup$StorageBackupImpl" />
      <Class name="org.apache.aurora.scheduler.storage.backup.StorageBackupTest" />
    </Or>
    <Bug pattern="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE" />
  </Match>
  <Match>
    <Or>
      <Class name="org.apache.aurora.scheduler.app.SchedulerIT$IntPosition" />
      <Class name="org.apache.aurora.scheduler.log.mesos.MesosLog$LogStream$LogPosition" />
      <Class name="org.apache.aurora.scheduler.log.testing.FileLog$FileStream$CounterPosition" />
    </Or>
    <Bug pattern="EQ_COMPARETO_USE_OBJECT_EQUALS" />
  </Match>
  <Match>
    <Or>
      <Class name="org.apache.aurora.scheduler.cron.testing.AbstractCronIT" />
      <Class name="org.apache.aurora.scheduler.log.mesos.MesosLogTest" />
      <Class name="org.apache.aurora.scheduler.thrift.ThriftIT" />
      <Class name="org.apache.aurora.scheduler.thrift.ThriftIT$1" />
    </Or>
    <Bug pattern="DM_DEFAULT_ENCODING" />
  </Match>

  <Match>
    <!-- False positives on a check introduced in findbugs 3.0.1 -->
    <Or>
      <Class name="org.apache.aurora.scheduler.storage.db.DbStorage$3" />
      <Class name="org.apache.aurora.scheduler.http.api.security.AuthorizeHeaderTokenTest" />
    </Or>
    <Bug pattern="RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT" />
  </Match>
</FindBugsFilter>
