package com.battery.device.discovery;
|
|
import java.time.Instant;
|
import java.util.LinkedHashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
/** 测试使用的候选存储,实现与 Redis 适配器相同的逻辑过期语义。 */
|
public final class InMemoryDeviceDiscoveryCandidateStore implements DeviceDiscoveryCandidateStore
|
{
|
private final Map<String, CabinetCandidate> cabinets = new LinkedHashMap<>();
|
private final Map<String, CollectorCandidate> collectors = new LinkedHashMap<>();
|
|
@Override
|
public synchronized void recordCabinets(List<CabinetCandidate> candidates)
|
{
|
candidates.forEach(item -> cabinets.put(item.deviceCode(), item));
|
}
|
|
@Override
|
public synchronized void replaceCollectors(String adapterCode, List<CollectorCandidate> candidates)
|
{
|
collectors.values().removeIf(item -> item.adapterCode().equals(adapterCode));
|
candidates.forEach(item -> collectors.put(item.deviceCode(), item));
|
}
|
|
@Override
|
public synchronized void removeAdapter(String adapterCode)
|
{
|
cabinets.values().removeIf(item -> item.adapterCode().equals(adapterCode));
|
collectors.values().removeIf(item -> item.adapterCode().equals(adapterCode));
|
}
|
|
@Override
|
public synchronized CandidateSnapshot snapshot(Instant now)
|
{
|
cabinets.values().removeIf(item -> !item.expiresAt().isAfter(now));
|
collectors.values().removeIf(item -> !item.expiresAt().isAfter(now));
|
return new CandidateSnapshot(List.copyOf(cabinets.values()), List.copyOf(collectors.values()));
|
}
|
}
|