InMemoryLedger.java 2.08 KB
package com.xly.service;

import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * 测试替身:内存版事件日志。append 与 Redis rightPush 同为「整条原子追加」,
 * 用于验证投影逻辑与「任意并发写者只追加、绝无整包读改写」的设计性质。
 */
class InMemoryLedger extends LedgerService {

    private final List<String> raw = Collections.synchronizedList(new ArrayList<>());
    private final ObjectMapper mapper = new ObjectMapper();

    InMemoryLedger() {
        super(null, new ObjectMapper());
    }

    @Override
    public void append(String convId, String type, Map<String, Object> data) {
        Map<String, Object> 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<Map<String, Object>> events(String convId) {
        return events(convId, 0);
    }

    @Override
    public List<Map<String, Object>> events(String convId, int lastN) {
        List<String> snapshot;
        synchronized (raw) {
            snapshot = new ArrayList<>(raw);
        }
        int from = lastN <= 0 ? 0 : Math.max(0, snapshot.size() - lastN);
        List<Map<String, Object>> out = new ArrayList<>();
        for (int i = from; i < snapshot.size(); i++) {
            try {
                @SuppressWarnings("unchecked")
                Map<String, Object> 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();
    }
}