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<String, DeviceAdapterFactory> factories = new HashMap<>();
|
private final Map<String, RegisteredAdapter> adapters = new HashMap<>();
|
|
public DeviceAdapterRegistry(List<DeviceAdapterFactory> 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)
|
{
|
}
|
}
|