diff --git a/opc-ua-sdk/sdk-client/src/main/java/org/eclipse/milo/opcua/sdk/client/DataTypeCodecSessionInitializer.java b/opc-ua-sdk/sdk-client/src/main/java/org/eclipse/milo/opcua/sdk/client/DataTypeCodecSessionInitializer.java index 79d13d710..8c073036c 100644 --- a/opc-ua-sdk/sdk-client/src/main/java/org/eclipse/milo/opcua/sdk/client/DataTypeCodecSessionInitializer.java +++ b/opc-ua-sdk/sdk-client/src/main/java/org/eclipse/milo/opcua/sdk/client/DataTypeCodecSessionInitializer.java @@ -18,6 +18,7 @@ import org.eclipse.milo.opcua.sdk.core.types.DynamicStructCodec; import org.eclipse.milo.opcua.stack.client.UaStackClient; import org.eclipse.milo.opcua.stack.core.NodeIds; +import org.eclipse.milo.opcua.stack.core.encoding.DataTypeCodec; import org.eclipse.milo.opcua.stack.core.types.structured.DataTypeDefinition; import org.eclipse.milo.opcua.stack.core.types.structured.StructureDefinition; import org.eclipse.milo.opcua.stack.core.util.Tree; @@ -30,6 +31,25 @@ public class DataTypeCodecSessionInitializer implements SessionFsm.SessionInitia private static final Logger LOGGER = LoggerFactory.getLogger(DataTypeCodecSessionInitializer.class); + private final CodecFactory codecFactory; + + /** + * Create a {@link DataTypeCodecSessionInitializer} that with the default {@link CodecFactory} + * that uses {@link DynamicStructCodec}. + */ + public DataTypeCodecSessionInitializer() { + this(DynamicStructCodec::new); + } + + /** + * Create a {@link DataTypeCodecSessionInitializer} with a custom {@link CodecFactory}. + * + * @param codecFactory the custom {@link CodecFactory} that will create {@link DataTypeCodec}s. + */ + public DataTypeCodecSessionInitializer(CodecFactory codecFactory) { + this.codecFactory = codecFactory; + } + @Override public CompletableFuture initialize(UaStackClient stackClient, OpcUaSession session) { String treeKey = DataTypeTreeSessionInitializer.SESSION_ATTRIBUTE_KEY; @@ -51,7 +71,7 @@ public CompletableFuture initialize(UaStackClient stackClient, OpcUaSessio } } - private static void registerCodecs(UaStackClient stackClient, DataTypeTree dataTypeTree) { + private void registerCodecs(UaStackClient stackClient, DataTypeTree dataTypeTree) { Tree structureNode = dataTypeTree.getTreeNode(NodeIds.Structure); if (structureNode != null) { @@ -66,7 +86,7 @@ private static void registerCodecs(UaStackClient stackClient, DataTypeTree dataT stackClient.getDynamicDataTypeManager().registerType( dataType.getNodeId(), - new DynamicStructCodec(dataTypeTree, dataType), + codecFactory.create(dataType, dataTypeTree), dataType.getBinaryEncodingId(), dataType.getXmlEncodingId(), dataType.getJsonEncodingId() @@ -79,4 +99,17 @@ private static void registerCodecs(UaStackClient stackClient, DataTypeTree dataT } } + public interface CodecFactory { + + /** + * Create a {@link DataTypeCodec} instance for {@code dataType}. + * + * @param dataType the {@link DataType} to create the codec for. + * @param dataTypeTree the {@link DataTypeTree}. + * @return a {@link DataTypeCodec} for {@code dataType}. + */ + DataTypeCodec create(DataType dataType, DataTypeTree dataTypeTree); + + } + } diff --git a/opc-ua-sdk/sdk-core/src/main/java/org/eclipse/milo/opcua/sdk/core/types/DynamicStructCodec.java b/opc-ua-sdk/sdk-core/src/main/java/org/eclipse/milo/opcua/sdk/core/types/DynamicStructCodec.java index adfacf278..e8a04e2ed 100644 --- a/opc-ua-sdk/sdk-core/src/main/java/org/eclipse/milo/opcua/sdk/core/types/DynamicStructCodec.java +++ b/opc-ua-sdk/sdk-core/src/main/java/org/eclipse/milo/opcua/sdk/core/types/DynamicStructCodec.java @@ -56,7 +56,7 @@ public class DynamicStructCodec extends GenericDataTypeCodec { private final DataType dataType; private final StructureDefinition structureDefinition; - public DynamicStructCodec(DataTypeTree dataTypeTree, DataType dataType) { + public DynamicStructCodec(DataType dataType, DataTypeTree dataTypeTree) { this.dataType = dataType; this.structureDefinition = (StructureDefinition) dataType.getDataTypeDefinition();