刘光辉
2 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package jnpf.bizcommon.audit.service.support;
 
import com.alibaba.fastjson.JSON;
import jnpf.audit.diff.AuditFieldDiff;
 
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
 
/** Removes fields hidden by the published form from persisted field diffs only. */
public final class AuditHiddenFieldDiffFilter {
 
    private AuditHiddenFieldDiffFilter() {
    }
 
    @SuppressWarnings("unchecked")
    public static String filter(String json, Map<String, AuditFieldDiff.FieldMeta> metadata) {
        if (json == null || json.trim().isEmpty()) {
            return json;
        }
        Object parsed;
        try {
            parsed = JSON.parse(json);
        } catch (RuntimeException ex) {
            return null;
        }
        if (!(parsed instanceof List)) {
            return null;
        }
        List<Object> visible = new ArrayList<>();
        for (Object raw : (List<?>) parsed) {
            if (!(raw instanceof Map)) {
                continue;
            }
            Map<String, Object> item = new LinkedHashMap<>((Map<String, Object>) raw);
            String field = string(item.get("field"));
            if (hidden(metadata, field)) {
                continue;
            }
            Object childFields = item.get("chidField");
            Object childData = item.get("chidData");
            if (childFields instanceof List && childData instanceof List) {
                List<Object> fields = new ArrayList<>();
                List<String> hiddenProps = new ArrayList<>();
                for (Object rawChild : (List<?>) childFields) {
                    if (!(rawChild instanceof Map)) {
                        continue;
                    }
                    String prop = string(((Map<?, ?>) rawChild).get("prop"));
                    if (hidden(metadata, prop)) {
                        hiddenProps.add(prop);
                    } else {
                        fields.add(rawChild);
                    }
                }
                if (fields.isEmpty()) {
                    continue;
                }
                List<Object> rows = new ArrayList<>();
                for (Object rawRow : (List<?>) childData) {
                    if (!(rawRow instanceof Map)) {
                        continue;
                    }
                    Map<String, Object> row = new LinkedHashMap<>((Map<String, Object>) rawRow);
                    for (String prop : hiddenProps) {
                        row.remove(prop);
                        row.remove("jnpf_old_" + prop);
                    }
                    boolean hasVisibleValue = false;
                    for (Object rawField : fields) {
                        String prop = string(((Map<?, ?>) rawField).get("prop"));
                        if (prop != null && (row.containsKey(prop)
                                || row.containsKey("jnpf_old_" + prop))) {
                            hasVisibleValue = true;
                            break;
                        }
                    }
                    if (hasVisibleValue) {
                        rows.add(row);
                    }
                }
                if (rows.isEmpty()) {
                    continue;
                }
                item.put("chidField", fields);
                item.put("chidData", rows);
            }
            visible.add(item);
        }
        return JSON.toJSONString(visible);
    }
 
    private static boolean hidden(Map<String, AuditFieldDiff.FieldMeta> metadata, String field) {
        if (metadata == null || field == null) {
            return false;
        }
        AuditFieldDiff.FieldMeta meta = metadata.get(field.toLowerCase(Locale.ROOT));
        return meta != null && Boolean.TRUE.equals(meta.hidden());
    }
 
    private static String string(Object value) {
        return value == null ? null : String.valueOf(value);
    }
}