yeg
2026-09-29 b78295e8da96c3e5e76befeef9582ce5273dbb74
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.battery.device.neware;
 
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
 
/**
 * 厂商数据源上的语句审计:记录已转发到驱动的语句和被白名单挡下的语句。
 *
 * <p>它让"该数据源从未发出过非查询语句"成为可断言的事实,而不是纪律性约定;
 * 断言对应的测试见 {@code ReadOnlyVendorDataSourceTest}。
 */
public final class ReadOnlyStatementAudit
{
    private final List<String> forwardedStatements = new CopyOnWriteArrayList<>();
    private final List<String> rejectedStatements = new CopyOnWriteArrayList<>();
 
    void recordForwarded(String statement)
    {
        forwardedStatements.add(abbreviate(statement));
    }
 
    void recordRejected(String statement)
    {
        rejectedStatements.add(abbreviate(statement));
    }
 
    /** 已被转发到驱动的语句。 */
    public List<String> forwardedStatements()
    {
        return List.copyOf(forwardedStatements);
    }
 
    /** 被白名单挡下、从未到达驱动的语句。 */
    public List<String> rejectedStatements()
    {
        return List.copyOf(rejectedStatements);
    }
 
    private static String abbreviate(String statement)
    {
        if (statement == null) return "";
        String trimmed = statement.trim();
        return trimmed.length() <= 200 ? trimmed : trimmed.substring(0, 200);
    }
}