package com.ruoyi.device.registry; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; import com.ruoyi.device.api.DeviceAdapter; /** 管理启用设备适配器的运行时实例及其会话生命周期。 */ public final class DeviceAdapterRegistry implements AutoCloseable { private final Map factories = new HashMap<>(); private final Map adapters = new HashMap<>(); public DeviceAdapterRegistry(List factories) { Objects.requireNonNull(factories, "factories").forEach(factory -> { String type = normalizeType(factory.adapterType()); if (this.factories.put(type, factory) != null) throw new IllegalArgumentException("Duplicate device adapter factory: " + type); }); } /** 按持久化配置注册、替换或移除运行时实例。 */ public synchronized void synchronize(AdapterInstanceConfig config) { Objects.requireNonNull(config, "config"); if (!config.enabled()) { remove(config.adapterCode()); return; } RegisteredAdapter current = adapters.get(config.adapterCode()); if (current != null && current.config().equals(config)) return; DeviceAdapterFactory factory = factories.get(normalizeType(config.adapterType())); if (factory == null) throw new AdapterRegistryException("Unsupported device adapter type: " + config.adapterType()); DeviceAdapter replacement = factory.create(config); RegisteredAdapter previous = adapters.put(config.adapterCode(), new RegisteredAdapter(config, replacement)); if (previous != null) previous.adapter().close(); } /** 返回已启用适配器;未注册时给出可识别失败。 */ public synchronized DeviceAdapter require(String adapterCode) { RegisteredAdapter registered = adapters.get(adapterCode); if (registered == null) throw new AdapterRegistryException("Device adapter is not enabled: " + adapterCode); return registered.adapter(); } public synchronized boolean contains(String adapterCode) { return adapters.containsKey(adapterCode); } @Override public synchronized void close() { adapters.values().forEach(registered -> registered.adapter().close()); adapters.clear(); } private void remove(String adapterCode) { RegisteredAdapter previous = adapters.remove(adapterCode); if (previous != null) previous.adapter().close(); } private static String normalizeType(String value) { return Objects.requireNonNull(value, "adapterType").trim().toUpperCase(Locale.ROOT); } private record RegisteredAdapter(AdapterInstanceConfig config, DeviceAdapter adapter) { } }