<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
    <!-- 排除自动生成文件 -->
    <Match>
        <Package name="~.*\._gen.*"/>
    </Match>
    <Match>
        <Class name="~.*_.*"/>
    </Match>
    <!-- 排除 Errors/Configs/Constants -->
    <Match>
        <Class name="~.*Errors"/>
    </Match>
    <Match>
        <Class name="~.*Configs"/>
    </Match>
    <Match>
        <Class name="~.*Constants"/>
    </Match>
    <!-- 排除 ANTLR 生成的解析器 -->
    <Match>
        <Package name="~.*\.parse\.antlr.*"/>
    </Match>

    <!-- 以下规则与 Nop 平台架构设计冲突,全局排除 -->

    <!-- EI_EXPOSE_REP/EI_EXPOSE_REP2: getter/setter 返回/接收可变对象是项目标准模式。
         Nop 平台的配置对象、数据传输对象广泛采用直接暴露内部可变引用的设计,
         配合 IoC 容器生命周期管理,不构成安全风险。 -->
    <Match>
        <Bug pattern="EI_EXPOSE_REP,EI_EXPOSE_REP2,EI_EXPOSE_STATIC_REP2"/>
    </Match>
    <Match>
        <Bug pattern="MS_EXPOSE_REP"/>
    </Match>

    <!-- CT_CONSTRUCTOR_THROW: 项目在构造函数中执行参数验证并抛异常是标准验证模式,
         这些类不由不可信代码直接实例化。 -->
    <Match>
        <Bug pattern="CT_CONSTRUCTOR_THROW"/>
    </Match>

    <!-- AT_STALE_THREAD_WRITE_OF_PRIMITIVE / AT_NONATOMIC_64BIT_PRIMITIVE /
         AT_NONATOMIC_OPERATIONS_ON_SHARED_VARIABLE: NopIoc 容器管理对象生命周期,
         setter 注入在初始化阶段单线程执行,运行期不修改,无需 volatile/atomic。
         已知设计权衡,不加 volatile 以保持代码简洁。 -->
    <Match>
        <Bug pattern="AT_STALE_THREAD_WRITE_OF_PRIMITIVE,AT_NONATOMIC_64BIT_PRIMITIVE,AT_NONATOMIC_OPERATIONS_ON_SHARED_VARIABLE"/>
    </Match>

    <!-- PA_PUBLIC_PRIMITIVE_ATTRIBUTE: Nop 平台广泛使用 public 字段,
         这是 NopIoC 注入模式的要求(不支持 private 字段注入)。 -->
    <Match>
        <Bug pattern="PA_PUBLIC_PRIMITIVE_ATTRIBUTE"/>
    </Match>

    <!-- MS_SHOULD_BE_FINAL / MS_PKGPROTECT: 部分 static 字段需要可变性(如注册表、缓存)。
         可变 static 字段是框架层有意设计。 -->
    <Match>
        <Bug pattern="MS_SHOULD_BE_FINAL,MS_PKGPROTECT"/>
    </Match>

    <!-- SING_SINGLETON_HAS_NONPRIVATE_CONSTRUCTOR: Nop 平台的单例对象不要求私有构造函数,
         许多单例通过 IoC 容器管理或使用默认构造函数是设计选择。 -->
    <Match>
        <Bug pattern="SING_SINGLETON_HAS_NONPRIVATE_CONSTRUCTOR"/>
    </Match>

    <!-- NP_BOOLEAN_RETURN_NULL: Boolean(包装类型)方法返回 null 是有意为之,
         用于区分 Boolean(三值逻辑:true/false/null)和 boolean(原始类型,仅 true/false)。
         null 表示"未设置"或"未知"是项目中的标准用法。 -->
    <Match>
        <Bug pattern="NP_BOOLEAN_RETURN_NULL"/>
    </Match>

    <!-- ===== 以下为项目设计选择,非 bug,全局排除 ===== -->

    <!-- HSM_HIDING_METHOD: 子类方法隐藏父类静态方法是有意设计。 -->
    <Match>
        <Bug pattern="HSM_HIDING_METHOD"/>
    </Match>

    <!-- SE_*: Nop 平台不依赖 Java 序列化机制,所有序列化相关警告不适用。 -->
    <Match>
        <Bug pattern="SE_BAD_FIELD,SE_COMPARATOR_SHOULD_BE_SERIALIZABLE,SE_TRANSIENT_FIELD_NOT_RESTORED,SE_BAD_FIELD_STORE"/>
    </Match>

    <!-- CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE: 项目的 clone 模式不要求实现 Cloneable 接口。 -->
    <Match>
        <Bug pattern="CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE"/>
    </Match>

    <!-- MS_MUTABLE_ARRAY: 框架层有意暴露 public static 可变数组作为常量表。 -->
    <Match>
        <Bug pattern="MS_MUTABLE_ARRAY"/>
    </Match>

    <!-- NP_LOAD_OF_KNOWN_NULL_VALUE: null 判断后的加载通常有保护逻辑,非 bug。 -->
    <Match>
        <Bug pattern="NP_LOAD_OF_KNOWN_NULL_VALUE"/>
    </Match>

    <!-- LI_LAZY_INIT_STATIC: static 延迟初始化在 IoC 容器管理场景下安全。 -->
    <Match>
        <Bug pattern="LI_LAZY_INIT_STATIC"/>
    </Match>

    <!-- DM_DEFAULT_ENCODING: 使用平台默认编码是有意为之,框架自行处理编码。 -->
    <Match>
        <Bug pattern="DM_DEFAULT_ENCODING"/>
    </Match>

    <!-- SF_SWITCH_NO_DEFAULT: switch 无 default 分支是有意不处理未知情况。 -->
    <Match>
        <Bug pattern="SF_SWITCH_NO_DEFAULT"/>
    </Match>

    <!-- RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE: 冗余 null 检查不影响正确性。 -->
    <Match>
        <Bug pattern="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE"/>
    </Match>

    <!-- DLS_DEAD_LOCAL_STORE: 死局部变量赋值可清理但非 bug。 -->
    <Match>
        <Bug pattern="DLS_DEAD_LOCAL_STORE"/>
    </Match>

    <!-- UC_USELESS_OBJECT: 创建了对象但未使用,可清理但非 bug。 -->
    <Match>
        <Bug pattern="UC_USELESS_OBJECT"/>
    </Match>

    <!-- RV_RETURN_VALUE_IGNORED_BAD_PRACTICE: 非资源关闭类的返回值忽略是设计选择。
         资源泄漏由 OBL_UNSATISFIED_OBLIGATION 单独检测。 -->
    <Match>
        <Bug pattern="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE"/>
    </Match>

    <!-- JLM_JSR166_UTILCONCURRENT_MONITORENTER: 对 concurrent 对象加 synchronized,
         项目中有意为之的同步模式。 -->
    <Match>
        <Bug pattern="JLM_JSR166_UTILCONCURRENT_MONITORENTER"/>
    </Match>

    <!-- URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD: 未读取的 public/protected 字段可能被外部使用。 -->
    <Match>
        <Bug pattern="URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD"/>
    </Match>

    <!-- REFLC_REFLECTION_MAY_INCREASE_ACCESSIBILITY_OF_CLASS: 框架层反射访问是有意设计。 -->
    <Match>
        <Bug pattern="REFLC_REFLECTION_MAY_INCREASE_ACCESSIBILITY_OF_CLASS"/>
    </Match>

    <!-- RR_NOT_CHECKED: InputStream.read() 返回值未检查,框架层有保护。 -->
    <Match>
        <Bug pattern="RR_NOT_CHECKED"/>
    </Match>

    <!-- ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT: 无符号右移的模式是有意为之。 -->
    <Match>
        <Bug pattern="ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT"/>
    </Match>

    <!-- SING_SINGLETON_IMPLEMENTS_SERIALIZABLE: 单例实现 Serializable 是 IoC 容器要求。 -->
    <Match>
        <Bug pattern="SING_SINGLETON_IMPLEMENTS_SERIALIZABLE"/>
    </Match>

    <!-- EQ_COMPARETO_USE_OBJECT_EQUALS: compareTo 使用 Object.equals 是设计选择。 -->
    <Match>
        <Bug pattern="EQ_COMPARETO_USE_OBJECT_EQUALS"/>
    </Match>

    <!-- IS2_INCONSISTENT_SYNC: 不一致的同步在 IoC 管理的对象中是已知的。 -->
    <Match>
        <Bug pattern="IS2_INCONSISTENT_SYNC"/>
    </Match>
</FindBugsFilter>