package jnpf.bizcommon.audit.service.listener; import com.alibaba.fastjson.JSON; import jnpf.audit.diff.AuditFieldDiff; import java.util.Collections; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; /** Regression checks for database-before/database-after Layer 0 diffs. */ public final class AuditL0PartialSnapshotProbe { private AuditL0PartialSnapshotProbe() { } public static void main(String[] args) { Map before = row( "yangpin_mingcheng", "旧名称", "beizhu", "待清空", "biz_sign", "old-sign", "f_version", "0", "child_table", "old-child"); Map after = row( "yangpin_mingcheng", "红细胞", "jieshou_shuliang", "6", "biz_sign", "new-sign", "f_version", "1", "child_table", "new-child"); Set masked = new LinkedHashSet(Collections.singletonList("biz_sign")); Set childFields = new LinkedHashSet(Collections.singletonList("child_table")); String diff = AuditVisualLogListener.databaseBoundaryDiff( before, after, masked, Collections.emptyMap(), childFields); List> items = parse(diff); check("changed field", item(items, "yangpin_mingcheng", "旧名称", "红细胞", 1)); check("new field is addition", item(items, "jieshou_shuliang", "", "6", 0)); check("missing after field is clear", item(items, "beizhu", "待清空", "", 1)); check("masked field compared without leaking values", item(items, "biz_sign", AuditFieldDiff.MASKED, AuditFieldDiff.MASKED, 1)); check("technical field excluded", find(items, "f_version") == null); check("child field excluded", find(items, "child_table") == null); String unchanged = AuditVisualLogListener.databaseBoundaryDiff( row("name", "same"), row("name", "same"), Collections.emptySet(), Collections.emptyMap(), Collections.emptySet()); check("unchanged row", parse(unchanged).isEmpty()); } @SuppressWarnings("unchecked") private static List> parse(String json) { return (List>) (List) JSON.parseArray(json, Map.class); } private static boolean item(List> items, String field, String oldData, String newData, int type) { Map item = find(items, field); return item != null && oldData.equals(String.valueOf(item.get("oldData"))) && newData.equals(String.valueOf(item.get("newData"))) && type == ((Number) item.get("type")).intValue(); } private static Map find(List> items, String field) { for (Map item : items) { if (field.equals(item.get("field"))) { return item; } } return null; } private static Map row(Object... values) { Map row = new LinkedHashMap(); for (int i = 0; i < values.length; i += 2) { row.put(String.valueOf(values[i]), values[i + 1]); } return row; } private static void check(String label, boolean condition) { if (!condition) { throw new AssertionError(label); } } }