package com.xly.service; import com.fasterxml.jackson.databind.ObjectMapper; import com.xly.agent.AgentIdentity; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * 测试替身:内存版事件账本。append 与生产(MySQL insert + Redis rightPush)同为「整条原子追加」, * 用于验证投影逻辑与「任意并发写者只追加、绝无整包读改写」的设计性质。 */ class InMemoryLedger extends LedgerService { private final List raw = Collections.synchronizedList(new ArrayList<>()); private final ObjectMapper mapper = new ObjectMapper(); InMemoryLedger() { super(null, new ObjectMapper(), null); } @Override public void append(String convId, String type, Map data, AgentIdentity who) { Map ev = new LinkedHashMap<>(); ev.put("t", 0L); ev.put("type", type); if (data != null) { ev.putAll(data); } try { raw.add(mapper.writeValueAsString(ev)); } catch (Exception e) { throw new RuntimeException(e); } } @Override public List> events(String convId) { return events(convId, 0); } @Override public List> events(String convId, int lastN) { List snapshot; synchronized (raw) { snapshot = new ArrayList<>(raw); } int from = lastN <= 0 ? 0 : Math.max(0, snapshot.size() - lastN); List> out = new ArrayList<>(); for (int i = from; i < snapshot.size(); i++) { try { @SuppressWarnings("unchecked") Map m = mapper.readValue(snapshot.get(i), Map.class); out.add(m); } catch (Exception ignore) { } } return out; } @Override public boolean exists(String convId) { return !raw.isEmpty(); } @Override public void delete(String convId) { raw.clear(); } int size() { return raw.size(); } }