package com.ruoyi.device.bts; import java.time.Instant; import java.util.List; import java.util.Map; import java.util.Set; import com.ruoyi.device.api.DeviceAdapter; import com.ruoyi.device.model.AdapterCapabilities; import com.ruoyi.device.model.ChannelIdentity; import com.ruoyi.device.model.DetectedChannel; import com.ruoyi.device.model.HistoryAvailability; import com.ruoyi.device.model.HistoryPage; import com.ruoyi.device.model.RealtimeSnapshot; public final class BtsDeviceAdapter implements DeviceAdapter { private final String adapterCode; private final BtsTransport transport; private final BtsXmlCodec codec; private final AdapterCapabilities capabilities; public BtsDeviceAdapter(String adapterCode, BtsTransport transport, BtsXmlCodec codec) { this(adapterCode, transport, codec, AdapterCapabilities.observeOnly()); } public BtsDeviceAdapter(String adapterCode, BtsTransport transport, BtsXmlCodec codec, AdapterCapabilities capabilities) { this.adapterCode = adapterCode; this.transport = transport; this.codec = codec; this.capabilities = capabilities; } @Override public String adapterCode() { return adapterCode; } @Override public AdapterCapabilities capabilities() { return capabilities; } @Override public List discoverChannels() { return codec.parseDeviceInfo(transport.exchange(codec.getDeviceInfoRequest())); } @Override public Map inquire(Set channels) { if (channels == null || channels.isEmpty()) return Map.of(); return codec.parseSnapshots(transport.exchange(codec.inquireRequest(channels, false)), Instant.now()); } @Override public List inquireHistory(Set channels) { if (!capabilities.historyDownload()) throw new UnsupportedOperationException("History download is not supported"); if (channels == null || channels.isEmpty()) return List.of(); return codec.parseHistoryAvailability(transport.exchange(codec.inquireHistoryRequest(channels))); } @Override public HistoryPage downloadHistory(ChannelIdentity channel, String btsTestId, long startPosition, int limit) { if (!capabilities.historyDownload()) throw new UnsupportedOperationException("History download is not supported"); return codec.parseHistory(transport.exchange(codec.downloadRequest(channel, btsTestId, startPosition, limit)), channel, btsTestId, startPosition); } @Override public void close() { transport.close(); } }