using System.Text.Json; using System.Text.Json.Serialization; using Microsoft.Extensions.Logging; using ZB.MOM.WW.OtOpcUa.Core.Hosting; namespace ZB.MOM.WW.OtOpcUa.Driver.OpcUaClient; /// /// Registers the OPC UA Client driver with the . The driver's /// DriverConfig JSON deserialises directly into /// (the same shape reads), so no separate DTO is needed. /// Mirrors ModbusDriverFactoryExtensions / GalaxyDriverFactoryExtensions. /// public static class OpcUaClientDriverFactoryExtensions { /// Driver type name — matches DriverInstance.DriverType values. public const string DriverTypeName = "OpcUaClient"; // Match OpcUaClientDriverProbe exactly so factory + probe parse a config identically. // The JsonStringEnumConverter lets enum-valued knobs (SecurityMode / SecurityPolicy / // AuthType / TargetNamespaceKind) be authored as their string names — the natural form // for human-edited + AdminUI-emitted DriverConfig JSON. private static readonly JsonSerializerOptions JsonOptions = new() { PropertyNameCaseInsensitive = true, UnmappedMemberHandling = JsonUnmappedMemberHandling.Skip, Converters = { new JsonStringEnumConverter() }, }; /// Register the OpcUaClient factory with the driver registry. /// The driver factory registry to register with. /// Optional logger factory used to create per-instance loggers. public static void Register(DriverFactoryRegistry registry, ILoggerFactory? loggerFactory = null) { ArgumentNullException.ThrowIfNull(registry); registry.Register(DriverTypeName, (id, json) => CreateInstance(id, json, loggerFactory)); } /// Public for the Server-side bootstrapper + test consumers. /// The unique identifier for the driver instance. /// The JSON configuration string for the driver. /// Optional logger factory for the per-instance logger. /// A configured . public static OpcUaClientDriver CreateInstance( string driverInstanceId, string driverConfigJson, ILoggerFactory? loggerFactory = null) { ArgumentException.ThrowIfNullOrWhiteSpace(driverInstanceId); ArgumentException.ThrowIfNullOrWhiteSpace(driverConfigJson); var options = JsonSerializer.Deserialize(driverConfigJson, JsonOptions) ?? throw new InvalidOperationException( $"OpcUaClient driver config for '{driverInstanceId}' deserialised to null"); return new OpcUaClientDriver(options, driverInstanceId, loggerFactory?.CreateLogger()); } }