/* ========================================================================
* Copyright (c) 2005-2025 The OPC Foundation, Inc. All rights reserved.
*
* OPC Foundation MIT License 1.00
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* The complete license agreement can be found here:
* http://opcfoundation.org/License/MIT/1.00/
* ======================================================================*/
namespace Opc.Ua.SourceGeneration
{
///
/// Template strings
///
internal static class NodeStateTemplates
{
///
/// Main file template for predefined nodes code generation
///
public static readonly TemplateString File = TemplateString.Parse(
$$"""
{{Tokens.CodeHeader}}
{{Tokens.ListOfImports}}
namespace {{Tokens.NamespacePrefix}}
{
{{Tokens.ListOfTypes}}
{{Tokens.ListOfTypeActivators}}
}
""");
///
/// Main file template for predefined nodes code generation
///
public static readonly TemplateString Extensions_File = TemplateString.Parse(
$$"""
{{Tokens.CodeHeader}}
{{Tokens.ListOfImports}}
namespace {{Tokens.NamespacePrefix}}
{
///
/// Extensions that add functionality from the {{Tokens.NamespaceUri}} namespace.
///
public static partial class {{Tokens.Namespace}}Extensions
{
///
/// Creates and returns all node states for the {{Tokens.NamespaceUri}} namespace.
///
/// The collection to add the node states to.
/// The system context to use for initialization.
/// Original collection with node states added.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{Tokens.Tool}}", "{{Tokens.Version}}")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute()]
public static global::Opc.Ua.NodeStateCollection Add{{Tokens.Namespace}}(
this global::Opc.Ua.NodeStateCollection nodes,
global::Opc.Ua.ISystemContext context)
{
{{Tokens.ListOfNodeStateInitializers}}
return nodes;
}
///
/// Adds all nodestate activators of the {{Tokens.NamespaceUri}}
/// namespace to a INodeStateFactoryBuilder.
///
/// The node state factory builder.
/// The builder passed as parameter for chaining.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{Tokens.Tool}}", "{{Tokens.Version}}")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute()]
public static global::Opc.Ua.INodeStateFactoryBuilder Add{{Tokens.Namespace}}(
this global::Opc.Ua.INodeStateFactoryBuilder builder)
{
{{Tokens.ListOfActivatorRegistrations}}
return builder;
}
{{Tokens.ListOfNodeStateInstanceFactories}}
{{Tokens.ListOfNodeStateTypeFactories}}
}
}
""");
///
/// Object Type node state
///
public static readonly TemplateString ObjectType_Class = TemplateString.Parse(
$$"""
///
/// The {{Tokens.ClassName}} ObjectType state.
///
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{Tokens.Tool}}", "{{Tokens.Version}}")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute()]
public partial class {{Tokens.ClassName}}State :
{{Tokens.BaseClassName}}State{{Tokens.BaseT}}
{
///
/// Initializes a new instance of the class.
///
public {{Tokens.ClassName}}State(global::Opc.Ua.NodeState? parent)
: base(parent)
{
}
{{Tokens.ListOfProperties}}
{{Tokens.ListOfNonMandatoryChildren}}
///
public override bool DeepEquals(global::Opc.Ua.NodeState node)
{
if (!(node is {{Tokens.ClassName}}State state) || !base.DeepEquals(state))
{
return false;
}
{{Tokens.ListOfEqualityComparers}}
return true;
}
///
public override int DeepGetHashCode()
{
int hashCode = base.DeepGetHashCode();
{{Tokens.ListOfChildHashes}}
return hashCode;
}
{{Tokens.ListOfChildOperations}}
///
protected override void CopyTo(global::Opc.Ua.NodeState target)
{
if (!(target is {{Tokens.ClassName}}State state))
{
return;
}
{{Tokens.ListOfChildCopies}}
base.CopyTo(target);
}
///
protected override global::Opc.Ua.NodeState CreateCopy()
{
return new {{Tokens.ClassName}}State(null);
}
///
protected override global::Opc.Ua.NodeId GetDefaultTypeDefinitionId(
global::Opc.Ua.NamespaceTable namespaceUris)
{
return global::Opc.Ua.NodeId.Create(
{{Tokens.NamespacePrefix}}.ObjectTypes.{{Tokens.TypeName}},
{{Tokens.NamespaceUri}},
namespaceUris);
}
///
protected override void Initialize(global::Opc.Ua.ISystemContext context)
{
base.Initialize(context);
Initialize(
context,
context.CreateInstanceOf{{Tokens.SymbolicId}}());
InitializeOptionalChildren(context);
}
///
protected override void Initialize(
global::Opc.Ua.ISystemContext context,
global::Opc.Ua.NodeState source)
{
InitializeOptionalChildren(context);
base.Initialize(context, source);
}
///
protected override void InitializeOptionalChildren(
global::Opc.Ua.ISystemContext context)
{
base.InitializeOptionalChildren(context);
{{Tokens.InitializeOptionalChildren}}
}
{{Tokens.ListOfFields}}
}
""");
///
/// Method type node state
///
public static readonly TemplateString MethodType_Class = TemplateString.Parse(
$$"""
///
/// The {{Tokens.ClassName}} MethodType.
///
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{Tokens.Tool}}", "{{Tokens.Version}}")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute()]
public partial class {{Tokens.ClassName}} : global::Opc.Ua.MethodState
{
///
/// Initializes a new instance of the class.
///
public {{Tokens.ClassName}}(global::Opc.Ua.NodeState? parent)
: base(parent)
{
}
///
public new static global::Opc.Ua.NodeState Construct(global::Opc.Ua.NodeState parent)
{
return new {{Tokens.ClassName}}(parent);
}
///
public {{Tokens.ClassName}}MethodCallHandler? OnCall;
///
public {{Tokens.ClassName}}MethodAsyncCallHandler? OnCallAsync;
{{Tokens.ListOfProperties}}
{{Tokens.ListOfNonMandatoryChildren}}
///
public override bool DeepEquals(global::Opc.Ua.NodeState node)
{
if (!(node is {{Tokens.ClassName}} state) || !base.DeepEquals(state))
{
return false;
}
{{Tokens.ListOfEqualityComparers}}
return true;
}
///
public override int DeepGetHashCode()
{
int hashCode = base.DeepGetHashCode();
{{Tokens.ListOfChildHashes}}
return hashCode;
}
{{Tokens.ListOfChildOperations}}
///
protected override void CopyTo(global::Opc.Ua.NodeState target)
{
if (!(target is {{Tokens.ClassName}} state))
{
return;
}
{{Tokens.ListOfChildCopies}}
base.CopyTo(target);
}
///
protected override global::Opc.Ua.NodeState CreateCopy()
{
return new {{Tokens.ClassName}}(null);
}
///
protected override void Initialize(global::Opc.Ua.ISystemContext context)
{
base.Initialize(context);
Initialize(
context,
context.CreateInstanceOf{{Tokens.SymbolicId}}());
InitializeOptionalChildren(context);
}
///
protected override void InitializeOptionalChildren(
global::Opc.Ua.ISystemContext context)
{
base.InitializeOptionalChildren(context);
{{Tokens.InitializeOptionalChildren}}
}
///
protected override global::Opc.Ua.ServiceResult? Call(
global::Opc.Ua.ISystemContext _context,
global::Opc.Ua.NodeId _objectId,
global::Opc.Ua.ArrayOf _inputArguments,
global::System.Collections.Generic.List _outputArguments)
{
if (OnCall == null)
{
return base.Call(_context, _objectId, _inputArguments, _outputArguments);
}
global::Opc.Ua.ServiceResult? _result = null;
{{Tokens.ListOfInputArguments}}
{{Tokens.ListOfOutputDeclarations}}
if (OnCall != null)
{
{{Tokens.OnCallImplementation}}
}
{{Tokens.ListOfOutputArguments}}
return _result;
}
///
protected override async global::System.Threading.Tasks.ValueTask CallAsync(
global::Opc.Ua.ISystemContext _context,
global::Opc.Ua.NodeId _objectId,
global::Opc.Ua.ArrayOf _inputArguments,
global::System.Collections.Generic.List _outputArguments,
global::System.Threading.CancellationToken cancellationToken = default)
{
if (OnCall == null && OnCallAsync == null)
{
return await base.CallAsync(
_context,
_objectId,
_inputArguments,
_outputArguments,
cancellationToken).ConfigureAwait(false);
}
{{Tokens.ClassName}}Result? _result = null;
{{Tokens.ListOfInputArguments}}
if (OnCallAsync != null)
{
{{Tokens.OnCallAsyncImplementation}}
}
else if (OnCall != null)
{
return Call(_context, _objectId, _inputArguments, _outputArguments);
}
{{Tokens.ListOfOutputArgumentsFromResult}}
return _result?.ServiceResult;
}
{{Tokens.ListOfFields}}
}
///
/// Represents the result of a {{Tokens.ClassName}} method call.
///
public partial class {{Tokens.ClassName}}Result
{
public global::Opc.Ua.ServiceResult ServiceResult { get; set; }
{{Tokens.ListOfResultProperties}}
}
///
/// Handles the {{Tokens.ClassName}} method call.
///
public delegate global::Opc.Ua.ServiceResult {{Tokens.ClassName}}MethodCallHandler(
{{Tokens.OnCallDeclaration}}
///
/// Handles the asynchronous {{Tokens.ClassName}} method call.
///
public delegate global::System.Threading.Tasks.ValueTask<{{Tokens.ClassName}}Result> {{Tokens.ClassName}}MethodAsyncCallHandler(
{{Tokens.OnCallAsyncDeclaration}}
""");
///
/// Variable type node state
///
public static readonly TemplateString VariableType_Class = TemplateString.Parse(
$$"""
///
/// The {{Tokens.ClassName}} VariableType state.
///
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{Tokens.Tool}}", "{{Tokens.Version}}")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute()]
public partial class {{Tokens.ClassName}}State :
{{Tokens.BaseClassName}}State{{Tokens.BaseT}}
{
///
/// Initializes a new instance of the class.
///
public {{Tokens.ClassName}}State(global::Opc.Ua.NodeState? parent) : base(parent)
{
}
{{Tokens.ListOfProperties}}
{{Tokens.ListOfNonMandatoryChildren}}
///
public override bool DeepEquals(global::Opc.Ua.NodeState node)
{
if (!(node is {{Tokens.ClassName}}State state) || !base.DeepEquals(state))
{
return false;
}
{{Tokens.ListOfEqualityComparers}}
return true;
}
///
public override int DeepGetHashCode()
{
int hashCode = base.DeepGetHashCode();
{{Tokens.ListOfChildHashes}}
return hashCode;
}
{{Tokens.ListOfChildOperations}}
///
protected override void CopyTo(global::Opc.Ua.NodeState target)
{
if (!(target is {{Tokens.ClassName}}State state))
{
return;
}
{{Tokens.ListOfChildCopies}}
base.CopyTo(target);
}
///
protected override global::Opc.Ua.NodeState CreateCopy()
{
return new {{Tokens.ClassName}}State(null);
}
///
protected override global::Opc.Ua.NodeId GetDefaultTypeDefinitionId(
global::Opc.Ua.NamespaceTable namespaceUris)
{
return global::Opc.Ua.NodeId.Create(
{{Tokens.NamespacePrefix}}.VariableTypes.{{Tokens.TypeName}},
{{Tokens.NamespaceUri}},
namespaceUris);
}
///
protected override global::Opc.Ua.NodeId GetDefaultDataTypeId(
global::Opc.Ua.NamespaceTable namespaceUris)
{
return global::Opc.Ua.NodeId.Create(
{{Tokens.DataTypeNamespacePrefix}}.DataTypes.{{Tokens.DataType}},
{{Tokens.DataTypeNamespaceUri}},
namespaceUris);
}
///
protected override int GetDefaultValueRank()
{
return {{Tokens.ValueRank}};
}
///
protected override void Initialize(global::Opc.Ua.ISystemContext context)
{
base.Initialize(context);
Initialize(
context,
context.CreateInstanceOf{{Tokens.SymbolicId}}());
// InitializeOptionalChildren(context);
}
///
protected override void Initialize(
global::Opc.Ua.ISystemContext context,
global::Opc.Ua.NodeState source)
{
InitializeOptionalChildren(context);
base.Initialize(context, source);
}
///
protected override void InitializeOptionalChildren(
global::Opc.Ua.ISystemContext context)
{
base.InitializeOptionalChildren(context);
{{Tokens.InitializeOptionalChildren}}
}
{{Tokens.ListOfFields}}
}
{{Tokens.TypedVariableType}}
{{Tokens.VariableTypeValue}}
""");
///
/// Factory methods for variable states with typed values
///
public static readonly TemplateString FactoriesForVariableTypeWithTypedValue = TemplateString.Parse(
$$"""
///
/// Creates a new instance of the {{Tokens.ClassName}}State class with a built-in value type
/// and associated TBuilder to extract the value from the Variant and create a new Variant
/// from it.
///
public static {{Tokens.ClassName}}State For(global::Opc.Ua.NodeState? parent)
where TBuilder : struct, global::Opc.Ua.IVariantBuilder
{
return new {{Tokens.ClassName}}State.Implementation(parent);
}
""");
///
/// Typed variable type node state
///
public static readonly TemplateString VariableTypeWithTypedValue_Class = TemplateString.Parse(
$$"""
///
/// The {{Tokens.ClassName}} VariableType state.
///
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{Tokens.Tool}}", "{{Tokens.Version}}")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute()]
public abstract class {{Tokens.ClassName}}State :
{{Tokens.ClassName}}State
{
///
/// Initializes a new instance of the class.
///
protected {{Tokens.ClassName}}State(global::Opc.Ua.NodeState? parent)
: base(parent)
{
}
///
/// Creates a new instance of the
/// class with a built-in value type and associated TBuilder to extract the
/// value from the Variant and create a new Variant from it.
///
/// The builder to use for T
public static {{Tokens.ClassName}}State With(
global::Opc.Ua.NodeState? parent = null)
where TBuilder : struct, global::Opc.Ua.IVariantBuilder
{
return new Implementation(parent);
}
///
public new abstract T Value { get; set; }
///
protected override void Initialize(global::Opc.Ua.ISystemContext context)
{
base.Initialize(context);
base.Initialize(context);
}
///
protected override void Initialize(
global::Opc.Ua.ISystemContext context,
global::Opc.Ua.NodeState source)
{
InitializeOptionalChildren(context);
base.Initialize(context, source);
}
///
/// Adds builder which extracts T from Variant or creates new Variant with type T
/// This is public so it can be overridden by classes outside of the namespace
///
/// The builder to use for T
public class Implementation : {{Tokens.ClassName}}State
where TBuilder : struct, global::Opc.Ua.IVariantBuilder
{
///
/// Initializes a new instance of the class.
///
public Implementation(global::Opc.Ua.NodeState? parent)
: base(parent)
{
m_builder = new TBuilder();
Value = default(T);
}
///
public override T Value
{
get => m_builder.GetValue(WrappedValue);
set => WrappedValue = m_builder.WithValue(value);
}
///
protected override global::Opc.Ua.NodeState CreateCopy()
{
return new Implementation(Parent);
}
private readonly TBuilder m_builder;
}
}
""");
///
/// Variable type value field methods
///
public static readonly TemplateString VariableType_ValueMethods = TemplateString.Parse(
$$"""
///
/// Handles the read of the {{Tokens.ChildName}} variable.
///
private global::Opc.Ua.ServiceResult OnRead_{{Tokens.ChildName}}(
global::Opc.Ua.ISystemContext context,
global::Opc.Ua.NodeState node,
global::Opc.Ua.NumericRange indexRange,
global::Opc.Ua.QualifiedName dataEncoding,
ref global::Opc.Ua.Variant value,
ref global::Opc.Ua.StatusCode statusCode,
ref global::Opc.Ua.DateTimeUtc timestamp)
{
lock (Lock)
{
DoBeforeReadProcessing(context, node);
var childVariable = m_variable?.{{Tokens.ChildPath}};
if (childVariable != null && global::Opc.Ua.StatusCode.IsBad(childVariable.StatusCode))
{
value = global::Opc.Ua.Variant.Null;
statusCode = childVariable.StatusCode;
return new global::Opc.Ua.ServiceResult(statusCode);
}
if (m_value != null)
{
value = global::Opc.Ua.Variant.{{Tokens.VariantFrom}}(({{Tokens.ChildDataType}})m_value.{{Tokens.ChildPath}});
}
var result = Read(context, node, indexRange, dataEncoding, ref value, ref statusCode, ref timestamp);
if (childVariable != null && global::Opc.Ua.ServiceResult.IsNotBad(result))
{
timestamp = childVariable.Timestamp;
if (statusCode != childVariable.StatusCode)
{
statusCode = childVariable.StatusCode;
result = new global::Opc.Ua.ServiceResult(statusCode);
}
}
return result;
}
}
///
/// Handles the write of the {{Tokens.ChildName}} variable.
///
private global::Opc.Ua.ServiceResult OnWrite_{{Tokens.ChildName}}(
global::Opc.Ua.ISystemContext context,
global::Opc.Ua.NodeState node,
global::Opc.Ua.NumericRange indexRange,
global::Opc.Ua.QualifiedName dataEncoding,
ref global::Opc.Ua.Variant value,
ref global::Opc.Ua.StatusCode statusCode,
ref global::Opc.Ua.DateTimeUtc timestamp)
{
lock (Lock)
{
if (!value.{{Tokens.VariantTryGet}}(out {{Tokens.ChildDataType}} newValue))
{
newValue = default;
}
UpdateChildVariableStatus(m_variable.{{Tokens.ChildPath}}, ref statusCode, ref timestamp);
m_value.{{Tokens.ChildPath}} = {{Tokens.ValueWrite}};
UpdateParent(context, ref statusCode, ref timestamp);
}
return global::Opc.Ua.ServiceResult.Good;
}
""");
///
/// Variable type node state
///
public static readonly TemplateString VariableTypeValue_Class = TemplateString.Parse(
$$"""
///
/// The {{Tokens.ClassName}} VariableType value.
///
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{Tokens.Tool}}", "{{Tokens.Version}}")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute()]
public class {{Tokens.ClassName}}Value : global::Opc.Ua.BaseVariableValue
{
///
/// Initializes a new instance of the class.
///
public {{Tokens.ClassName}}Value(
{{Tokens.ClassName}}State variable,
{{Tokens.DataType}}? value,
object dataLock)
: base(dataLock)
{
m_value = value;
if (m_value == null)
{
m_value = new {{Tokens.DataType}}();
}
Initialize(variable);
}
///
/// Gets the variable associated with the value.
///
public {{Tokens.ClassName}}State Variable => m_variable;
///
/// Gets or sets the value.
///
public {{Tokens.DataType}} Value
{
get => m_value;
set => m_value = value;
}
///
/// Initializes the value.
///
private void Initialize({{Tokens.ClassName}}State variable)
{
lock (Lock)
{
m_variable = variable;
variable.Value = m_value;
variable.OnReadValue = OnReadValue;
variable.OnWriteValue = OnWriteValue;
global::Opc.Ua.BaseVariableState? instance = null;
global::System.Collections.Generic.List updateList =
new global::System.Collections.Generic.List();
updateList.Add(variable);
{{Tokens.ListOfChildInitializers}}
SetUpdateList(updateList);
}
}
///
protected global::Opc.Ua.ServiceResult OnReadValue(
global::Opc.Ua.ISystemContext context,
global::Opc.Ua.NodeState node,
global::Opc.Ua.NumericRange indexRange,
global::Opc.Ua.QualifiedName dataEncoding,
ref global::Opc.Ua.Variant value,
ref global::Opc.Ua.StatusCode statusCode,
ref global::Opc.Ua.DateTimeUtc timestamp)
{
lock (Lock)
{
DoBeforeReadProcessing(context, node);
if (m_value != null)
{
value = global::Opc.Ua.Variant.{{Tokens.VariantFrom}}(m_value);
}
return Read(context, node, indexRange, dataEncoding, ref value, ref statusCode, ref timestamp);
}
}
///
private global::Opc.Ua.ServiceResult OnWriteValue(
global::Opc.Ua.ISystemContext context,
global::Opc.Ua.NodeState node,
global::Opc.Ua.NumericRange indexRange,
global::Opc.Ua.QualifiedName dataEncoding,
ref global::Opc.Ua.Variant value,
ref global::Opc.Ua.StatusCode statusCode,
ref global::Opc.Ua.DateTimeUtc timestamp)
{
lock (Lock)
{
if (!value.{{Tokens.VariantTryGet}}(out {{Tokens.DataType}} newValue))
{
newValue = default;
}
if ({{Tokens.ValueComparison}})
{
UpdateChildrenChangeMasks(context, ref newValue, ref statusCode, ref timestamp);
Timestamp = timestamp;
m_value = {{Tokens.ValueWrite}};
m_variable.UpdateChangeMasks(global::Opc.Ua.NodeStateChangeMasks.Value);
}
}
return global::Opc.Ua.ServiceResult.Good;
}
///
/// Updates the change masks for the children.
///
private void UpdateChildrenChangeMasks(
global::Opc.Ua.ISystemContext context,
ref {{Tokens.DataType}} newValue,
ref global::Opc.Ua.StatusCode statusCode,
ref global::Opc.Ua.DateTimeUtc timestamp)
{
{{Tokens.ListOfUpdateChildrenChangeMasks}}
}
///
/// Updates the parent variable status.
///
private void UpdateParent(
global::Opc.Ua.ISystemContext context,
ref global::Opc.Ua.StatusCode statusCode,
ref global::Opc.Ua.DateTimeUtc timestamp)
{
Timestamp = timestamp;
m_variable.UpdateChangeMasks(global::Opc.Ua.NodeStateChangeMasks.Value);
m_variable.ClearChangeMasks(context, false);
}
///
/// Updates the status of a child variable.
///
private void UpdateChildVariableStatus(
global::Opc.Ua.BaseVariableState child,
ref global::Opc.Ua.StatusCode statusCode,
ref global::Opc.Ua.DateTimeUtc timestamp)
{
if (child == null)
{
return;
}
child.StatusCode = statusCode;
if (timestamp == global::Opc.Ua.DateTimeUtc.MinValue)
{
timestamp = global::Opc.Ua.DateTimeUtc.Now;
}
child.Timestamp = timestamp;
}
{{Tokens.ListOfChildMethods}}
private {{Tokens.DataType}}? m_value;
private {{Tokens.ClassName}}State? m_variable;
}
""");
///
/// Initialize optional child
///
public static readonly TemplateString InitializeOptionalChild = TemplateString.Parse(
$$"""
if ({{Tokens.ChildName}} != null)
{
{{Tokens.ChildName}}.Create(
context,
context.Create{{Tokens.SymbolicId}}(this, true));
}
""");
///
/// Property template
///
public static readonly TemplateString Property = TemplateString.Parse(
$$"""
///
/// {{Tokens.ChildName}} property
///
{{Tokens.AccessorSymbol}} {{Tokens.ClassName}}? {{Tokens.ChildName}}
{
get => {{Tokens.FieldName}};
set
{
if (!object.ReferenceEquals({{Tokens.FieldName}}, value))
{
ChangeMasks |= global::Opc.Ua.NodeStateChangeMasks.Children;
}
{{Tokens.FieldName}} = value;
}
}
""");
///
/// Override property template
///
public static readonly TemplateString PropertyOverride = TemplateString.Parse(
$$"""
///
/// {{Tokens.ChildName}} property
///
{{Tokens.AccessorSymbol}} {{Tokens.ClassName}}? {{Tokens.ChildName}}
{
get => ({{Tokens.ClassName}})base.{{Tokens.ChildName}};
set => base.{{Tokens.ChildName}} = value;
}
""");
///
/// Add Optional component template
///
public static readonly TemplateString OptionalMethod = TemplateString.Parse(
$$"""
///
/// Add an optional {{Tokens.ChildName}} child
///
{{Tokens.AccessorSymbol}} {{Tokens.ClassName}} Add{{Tokens.ChildName}}(
global::Opc.Ua.ISystemContext context)
{
{{Tokens.ClassName}} state =
context.Create{{Tokens.SymbolicId}}(this, true);
{{Tokens.ChildName}} = state;
return state;
}
""");
///
/// Place holder method template
///
public static readonly TemplateString PlaceHolderMethod = TemplateString.Parse(
$$"""
///
/// Add a placeholder {{Tokens.ChildName}} as child
///
{{Tokens.AccessorSymbol}} {{Tokens.ClassName}} Add{{Tokens.ChildName}}(
global::Opc.Ua.ISystemContext context,
global::Opc.Ua.QualifiedName browseName)
{
{{Tokens.ClassName}} state =
context.Create{{Tokens.SymbolicId}}(this, browseName);
ReplaceChild(context, state);
return state;
}
""");
///
/// Find child methods
///
public static readonly TemplateString ChildOperations = TemplateString.Parse(
$$"""
///
public override void GetChildren(
global::Opc.Ua.ISystemContext context,
global::System.Collections.Generic.IList children)
{
{{Tokens.ListOfFindChildren}}
base.GetChildren(context, children);
}
{{Tokens.ListOfCreateOrReplaceChild}}
///
protected override global::Opc.Ua.BaseInstanceState? FindChild(
global::Opc.Ua.ISystemContext context,
global::Opc.Ua.QualifiedName browseName,
bool createOrReplace,
global::Opc.Ua.BaseInstanceState replacement)
{
if (browseName.IsNull)
{
return null;
}
global::Opc.Ua.BaseInstanceState? instance = null;
switch (browseName.Name)
{
{{Tokens.ListOfFindChildCase}}
}
if (instance != null)
{
return instance;
}
return base.FindChild(context, browseName, createOrReplace, replacement);
}
///
protected override void RemoveExplicitlyDefinedChild(global::Opc.Ua.BaseInstanceState child)
{
{{Tokens.ListOfRemoveChild}}
base.RemoveExplicitlyDefinedChild(child);
}
""");
///
/// Find child case template. Uses a literal string with the
/// runtime browse name (which may differ from the symbolic
/// name when the design overrides <opc:BrowseName>,
/// as in Boiler.InputPipe → "PipeX001").
/// Avoids depending on {Namespace}.BrowseNames.{ChildName}
/// constants so cross-namespace inherited children compile
/// even when the foreign namespace's generated
/// BrowseNames class doesn't carry a constant for that
/// name.
///
public static readonly TemplateString FindChildCase = TemplateString.Parse(
$$"""
case "{{Tokens.ChildBrowseName}}":
{
instance = !createOrReplace ?
{{Tokens.ChildName}} : CreateOrReplace{{Tokens.ChildName}}(context, replacement);
break;
}
""");
///
/// Create or replace a child on the class
///
public static readonly TemplateString CreateOrReplaceChild = TemplateString.Parse(
$$"""
///
/// Create or replace the mandatory {{Tokens.ChildName}} child
///
{{Tokens.AccessorSymbol}} {{Tokens.ClassName}} CreateOrReplace{{Tokens.ChildName}}(
global::Opc.Ua.ISystemContext context,
global::Opc.Ua.BaseInstanceState replacement)
{
if ({{Tokens.ChildName}} == null)
{
{{Tokens.ClassName}}? child = replacement as {{Tokens.ClassName}};
if (child == null)
{
child = {{Tokens.ClassFactory}}(this);
if (replacement != null)
{
child.Create(context, replacement);
}
}
{{Tokens.ChildName}} = child;
}
return {{Tokens.ChildName}};
}
""");
///
/// Find children method template
///
public static readonly TemplateString FindChildren = TemplateString.Parse(
$$"""
if ({{Tokens.FieldName}} != null)
{
children.Add({{Tokens.FieldName}});
}
""");
///
/// Remove child template
///
public static readonly TemplateString RemoveChild = TemplateString.Parse(
$$"""
if (object.ReferenceEquals({{Tokens.FieldName}}, child))
{
{{Tokens.FieldName}} = null;
return;
}
""");
///
/// Clone child template
///
public static readonly TemplateString CloneChild = TemplateString.Parse(
$$"""
state.{{Tokens.BrowseName}} =
({{Tokens.ClassName}})global::Opc.Ua.CoreUtils.Clone({{Tokens.BrowseName}});
""");
///
/// Compare child template
///
public static readonly TemplateString CompareChild = TemplateString.Parse(
$$"""
if (!global::Opc.Ua.NodeStateComparer.Default.Equals(
state.{{Tokens.BrowseName}},
{{Tokens.BrowseName}}))
{
return false;
}
""");
///
/// Hash child template
///
public static readonly TemplateString HashChild = TemplateString.Parse(
$$"""
hashCode = (hashCode * 16777619) ^
global::Opc.Ua.NodeStateComparer.Default.GetHashCode({{Tokens.BrowseName}});
""");
///
/// Encodeable activator
///
public static readonly TemplateString ActivatorClass = TemplateString.Parse(
$$"""
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{Tokens.Tool}}", "{{Tokens.Version}}")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute()]
public sealed class {{Tokens.StateClassName}}Activator : global::Opc.Ua.NodeStateActivator
{
///
/// The singleton instance of the activator.
///
public static readonly {{Tokens.StateClassName}}Activator Instance
= new {{Tokens.StateClassName}}Activator();
///
protected override global::Opc.Ua.NodeState CreateInstance(
global::Opc.Ua.ISystemContext context,
global::Opc.Ua.NodeState parent)
{
return context.CreateInstanceOf{{Tokens.SymbolicId}}(parent);
}
}
""");
///
/// Nodestate activator registration
///
public static readonly TemplateString ActivatorRegistration = TemplateString.Parse(
$$"""
// Register node state factory for {{Tokens.BrowseName}} {{Tokens.NodeClass}}
builder = builder.RegisterType(
{{Tokens.NodeClass}}Ids.{{Tokens.SymbolicId}},
{{Tokens.StateClassName}}Activator.Instance);
""");
///
/// Template for a single node state creation call
///
public static readonly TemplateString Add = TemplateString.Parse(
$$"""
// Add {{Tokens.SymbolicName}} predefined node
{
global::Opc.Ua.NodeState state = Create{{Tokens.SymbolicId}}(context);
state.CreateAsPredefinedNode(context);
nodes.Add(state);
}
""");
///
/// Template for BaseObjectTypeState creation
///
public static readonly TemplateString Create_ObjectType = TemplateString.Parse(
$$"""
///
/// Creates the {{Tokens.SymbolicName}} ObjectType node state.
///
internal static global::Opc.Ua.BaseObjectTypeState Create{{Tokens.SymbolicId}}(
this global::Opc.Ua.ISystemContext context,
bool forInstance = false)
{
var state = new global::Opc.Ua.BaseObjectTypeState();
state.SymbolicName = {{Tokens.SymbolicNameSymbol}};
state.NodeId = {{Tokens.NodeIdConstant}};
state.BrowseName = new global::Opc.Ua.QualifiedName(
{{Tokens.BrowseNameSymbol}},
context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}}));
state.DisplayName = new global::Opc.Ua.LocalizedText({{Tokens.DisplayName}});
{{Tokens.DescriptionValue}}
state.WriteMask = {{Tokens.WriteMaskValue}};
state.UserWriteMask = {{Tokens.UserWriteMaskValue}};
state.SuperTypeId = {{Tokens.SuperTypeId}};
state.IsAbstract = {{Tokens.IsAbstract}};
{{Tokens.ReleaseStatusValue}}
{{Tokens.CategoriesValue}}
{{Tokens.SpecificationValue}}
if (forInstance)
{
{{Tokens.AccessRestrictionsValue}}
{{Tokens.ListOfRolePermissions}}
}
{{Tokens.ListOfReferences}}
{{Tokens.ListOfChildNodeStates}}
if (!forInstance)
{
state.IsPartOfTypeHierarchy = true;
{{Tokens.ModellingRuleId}}
{{Tokens.ListOfOptionalChildNodeStates}}
}
return state;
}
""");
///
/// Template for BaseDataVariableTypeState creation
///
public static readonly TemplateString Create_VariableType = TemplateString.Parse(
$$"""
///
/// Creates the {{Tokens.SymbolicName}} VariableType node state.
///
internal static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}(
this global::Opc.Ua.ISystemContext context,
bool forInstance = false)
{
var state = {{Tokens.StateClassFactory}}();
state.SymbolicName = {{Tokens.SymbolicNameSymbol}};
state.NodeId = {{Tokens.NodeIdConstant}};
state.BrowseName = new global::Opc.Ua.QualifiedName(
{{Tokens.BrowseNameSymbol}},
context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}}));
state.DisplayName = new global::Opc.Ua.LocalizedText({{Tokens.DisplayName}});
{{Tokens.DescriptionValue}}
state.WriteMask = {{Tokens.WriteMaskValue}};
state.UserWriteMask = {{Tokens.UserWriteMaskValue}};
state.SuperTypeId = {{Tokens.SuperTypeId}};
state.IsAbstract = {{Tokens.IsAbstract}};
state.DataType = {{Tokens.DataTypeIdConstant}};
state.ValueRank = {{Tokens.ValueRank}};
{{Tokens.ArrayDimensions}}
{{Tokens.ValueCode}}
{{Tokens.ReleaseStatusValue}}
{{Tokens.CategoriesValue}}
{{Tokens.SpecificationValue}}
if (forInstance)
{
{{Tokens.AccessRestrictionsValue}}
{{Tokens.ListOfRolePermissions}}
}
{{Tokens.ListOfReferences}}
{{Tokens.ListOfChildNodeStates}}
if (!forInstance)
{
state.IsPartOfTypeHierarchy = true;
{{Tokens.ModellingRuleId}}
{{Tokens.ListOfOptionalChildNodeStates}}
}
return state;
}
""");
///
/// Template for ReferenceTypeState creation
///
public static readonly TemplateString Create_ReferenceType = TemplateString.Parse(
$$"""
///
/// Creates the {{Tokens.SymbolicName}} ReferenceType node state.
///
internal static global::Opc.Ua.ReferenceTypeState Create{{Tokens.SymbolicId}}(
this global::Opc.Ua.ISystemContext context,
bool forInstance = false)
{
var state = new global::Opc.Ua.ReferenceTypeState();
state.SymbolicName = {{Tokens.SymbolicNameSymbol}};
state.NodeId = {{Tokens.NodeIdConstant}};
state.BrowseName = new global::Opc.Ua.QualifiedName(
{{Tokens.BrowseNameSymbol}},
context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}}));
state.DisplayName = new global::Opc.Ua.LocalizedText({{Tokens.DisplayName}});
{{Tokens.DescriptionValue}}
state.WriteMask = {{Tokens.WriteMaskValue}};
state.UserWriteMask = {{Tokens.UserWriteMaskValue}};
state.SuperTypeId = {{Tokens.SuperTypeId}};
state.IsAbstract = {{Tokens.IsAbstract}};
state.Symmetric = {{Tokens.SymmetricValue}};
{{Tokens.InverseNameValue}}
{{Tokens.ReleaseStatusValue}}
{{Tokens.CategoriesValue}}
{{Tokens.SpecificationValue}}
if (forInstance)
{
{{Tokens.AccessRestrictionsValue}}
{{Tokens.ListOfRolePermissions}}
}
{{Tokens.ListOfReferences}}
{{Tokens.ListOfChildNodeStates}}
if (!forInstance)
{
{{Tokens.ModellingRuleId}}
{{Tokens.ListOfOptionalChildNodeStates}}
}
return state;
}
""");
///
/// Template for DataTypeState creation
///
public static readonly TemplateString Create_DataType = TemplateString.Parse(
$$"""
///
/// Creates the {{Tokens.SymbolicName}} DataType node state.
///
internal static global::Opc.Ua.DataTypeState Create{{Tokens.SymbolicId}}(
this global::Opc.Ua.ISystemContext context,
bool forInstance = false)
{
var state = new global::Opc.Ua.DataTypeState();
state.SymbolicName = {{Tokens.SymbolicNameSymbol}};
state.NodeId = {{Tokens.NodeIdConstant}};
state.BrowseName = new global::Opc.Ua.QualifiedName(
{{Tokens.BrowseNameSymbol}},
context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}}));
state.DisplayName = new global::Opc.Ua.LocalizedText({{Tokens.DisplayName}});
{{Tokens.DescriptionValue}}
state.WriteMask = {{Tokens.WriteMaskValue}};
state.UserWriteMask = {{Tokens.UserWriteMaskValue}};
state.SuperTypeId = {{Tokens.SuperTypeId}};
state.IsAbstract = {{Tokens.IsAbstract}};
state.DataTypeDefinition = {{Tokens.DataTypeDefinition}};
{{Tokens.ReleaseStatusValue}}
{{Tokens.CategoriesValue}}
{{Tokens.SpecificationValue}}
if (forInstance)
{
{{Tokens.AccessRestrictionsValue}}
{{Tokens.ListOfRolePermissions}}
}
{{Tokens.ListOfReferences}}
{{Tokens.ListOfChildNodeStates}}
if (!forInstance)
{
{{Tokens.ModellingRuleId}}
{{Tokens.ListOfOptionalChildNodeStates}}
}
return state;
}
""");
///
/// Template for BaseObjectState creation
///
public static readonly TemplateString Create_Object = TemplateString.Parse(
$$"""
///
/// Creates the {{Tokens.SymbolicName}} Object node state.
///
internal static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}(
this global::Opc.Ua.ISystemContext context,
bool forInstance = true)
{
var state = {{Tokens.StateClassFactory}}(null);
state.SymbolicName = {{Tokens.SymbolicNameSymbol}};
state.NodeId = {{Tokens.NodeIdConstant}};
state.NumericId = {{Tokens.NumericIdValue}};
state.BrowseName = new global::Opc.Ua.QualifiedName(
{{Tokens.BrowseNameSymbol}},
context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}}));
state.DisplayName = new global::Opc.Ua.LocalizedText({{Tokens.DisplayName}});
{{Tokens.DescriptionValue}}
state.WriteMask = {{Tokens.WriteMaskValue}};
state.UserWriteMask = {{Tokens.UserWriteMaskValue}};
state.TypeDefinitionId = {{Tokens.TypeDefinitionId}};
state.ReferenceTypeId = {{Tokens.ReferenceTypeId}};
// {{Tokens.ModellingRuleId}}
state.EventNotifier = {{Tokens.EventNotifier}};
{{Tokens.ReleaseStatusValue}}
{{Tokens.CategoriesValue}}
{{Tokens.SpecificationValue}}
{{Tokens.AccessRestrictionsValue}}
{{Tokens.ListOfRolePermissions}}
{{Tokens.ListOfReferences}}
{{Tokens.ListOfChildNodeStates}}
if (!forInstance)
{
{{Tokens.ModellingRuleId}}
{{Tokens.ListOfOptionalChildNodeStates}}
}
return state;
}
""");
///
/// Template for BaseVariableState (Property or DataVariable) creation
///
public static readonly TemplateString Create_Variable = TemplateString.Parse(
$$"""
///
/// Creates the {{Tokens.SymbolicName}} Variable node state.
///
internal static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}(
this global::Opc.Ua.ISystemContext context,
bool forInstance = true)
{
var state = {{Tokens.StateClassFactory}}(null);
state.SymbolicName = {{Tokens.SymbolicNameSymbol}};
state.NodeId = {{Tokens.NodeIdConstant}};
state.NumericId = {{Tokens.NumericIdValue}};
state.BrowseName = new global::Opc.Ua.QualifiedName(
{{Tokens.BrowseNameSymbol}},
context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}}));
state.DisplayName = new global::Opc.Ua.LocalizedText(
{{Tokens.DisplayName}});
{{Tokens.DescriptionValue}}
state.WriteMask = {{Tokens.WriteMaskValue}};
state.UserWriteMask = {{Tokens.UserWriteMaskValue}};
state.TypeDefinitionId = {{Tokens.TypeDefinitionId}};
state.ReferenceTypeId = {{Tokens.ReferenceTypeId}};
// {{Tokens.ModellingRuleId}}
state.DataType = {{Tokens.DataTypeIdConstant}};
state.ValueRank = {{Tokens.ValueRank}};
{{Tokens.ArrayDimensions}}
state.AccessLevel = {{Tokens.AccessLevelValue}};
state.UserAccessLevel = {{Tokens.UserAccessLevelValue}};
state.MinimumSamplingInterval = {{Tokens.MinimumSamplingIntervalValue}};
state.Historizing = {{Tokens.HistorizingValue}};
{{Tokens.ValueCode}}
{{Tokens.ReleaseStatusValue}}
{{Tokens.CategoriesValue}}
{{Tokens.SpecificationValue}}
{{Tokens.AccessRestrictionsValue}}
{{Tokens.ListOfRolePermissions}}
{{Tokens.ListOfReferences}}
{{Tokens.ListOfChildNodeStates}}
if (!forInstance)
{
{{Tokens.ModellingRuleId}}
{{Tokens.ListOfOptionalChildNodeStates}}
}
return state;
}
""");
///
/// Template for ViewState creation
///
public static readonly TemplateString Create_View = TemplateString.Parse(
$$"""
///
/// Creates the {{Tokens.SymbolicName}} View node state.
///
internal static global::Opc.Ua.ViewState Create{{Tokens.SymbolicId}}(
this global::Opc.Ua.ISystemContext context)
{
var state = new global::Opc.Ua.ViewState();
state.SymbolicName = {{Tokens.SymbolicNameSymbol}};
state.NodeId = {{Tokens.NodeIdConstant}};
state.BrowseName = new global::Opc.Ua.QualifiedName(
{{Tokens.BrowseNameSymbol}},
context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}}));
state.DisplayName = new global::Opc.Ua.LocalizedText({{Tokens.DisplayName}});
{{Tokens.DescriptionValue}}
state.WriteMask = {{Tokens.WriteMaskValue}};
state.UserWriteMask = {{Tokens.UserWriteMaskValue}};
state.EventNotifier = {{Tokens.EventNotifier}};
state.ContainsNoLoops = {{Tokens.ContainsNoLoopsValue}};
{{Tokens.ReleaseStatusValue}}
{{Tokens.CategoriesValue}}
{{Tokens.SpecificationValue}}
{{Tokens.AccessRestrictionsValue}}
{{Tokens.ListOfRolePermissions}}
{{Tokens.ListOfReferences}}
{{Tokens.ListOfChildNodeStates}}
if (!forInstance)
{
{{Tokens.ModellingRuleId}}
{{Tokens.ListOfOptionalChildNodeStates}}
}
return state;
}
""");
///
/// Template for MethodState creation
///
public static readonly TemplateString Create_InstanceOfMethodType = TemplateString.Parse(
$$"""
///
/// Creates an instance of the {{Tokens.SymbolicName}} Method node state.
///
public static {{Tokens.StateClassName}} CreateInstanceOf{{Tokens.SymbolicId}}(
this global::Opc.Ua.ISystemContext context,
global::Opc.Ua.NodeState parent = null,
global::Opc.Ua.QualifiedName browseName = default)
{
var state = {{Tokens.StateClassFactory}}(parent);
state.NodeId = {{Tokens.NodeIdConstant}};
if (!browseName.IsNull)
{
state.SymbolicName = browseName.Name;
state.BrowseName = browseName;
state.DisplayName = new global::Opc.Ua.LocalizedText(browseName.Name);
}
else
{
state.SymbolicName = {{Tokens.SymbolicNameSymbol}};
state.BrowseName = new global::Opc.Ua.QualifiedName(
{{Tokens.BrowseNameSymbol}},
context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}}));
state.DisplayName = new global::Opc.Ua.LocalizedText(
{{Tokens.DisplayName}});
}
{{Tokens.MethodDeclarationId}}
{{Tokens.DescriptionValue}}
state.WriteMask = {{Tokens.WriteMaskValue}};
state.UserWriteMask = {{Tokens.UserWriteMaskValue}};
state.ReferenceTypeId = {{Tokens.ReferenceTypeId}};
state.Executable = {{Tokens.ExecutableValue}};
state.UserExecutable = {{Tokens.ExecutableValue}};
{{Tokens.ListOfInputArguments}}
{{Tokens.ListOfOutputArguments}}
{{Tokens.ReleaseStatusValue}}
{{Tokens.CategoriesValue}}
{{Tokens.SpecificationValue}}
{{Tokens.AccessRestrictionsValue}}
{{Tokens.ListOfRolePermissions}}
{{Tokens.ListOfReferences}}
{{Tokens.ListOfChildNodeStates}}
return state;
}
""");
///
/// Template for object type instance creation (instantiate an object type)
///
public static readonly TemplateString Create_InstanceOfObjectType = TemplateString.Parse(
$$"""
///
/// Creates an instance of the {{Tokens.TypeName}} type.
///
public static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}(
this global::Opc.Ua.ISystemContext context,
global::Opc.Ua.NodeState parent = null,
global::Opc.Ua.QualifiedName browseName = default)
{
var state = {{Tokens.StateClassFactory}}(parent);
state.NodeId = {{Tokens.NodeIdConstant}};
if (!browseName.IsNull)
{
state.SymbolicName = browseName.Name;
state.BrowseName = browseName;
state.DisplayName = new global::Opc.Ua.LocalizedText(browseName.Name);
}
else
{
state.SymbolicName = {{Tokens.SymbolicNameSymbol}};
state.BrowseName = new global::Opc.Ua.QualifiedName(
{{Tokens.BrowseNameSymbol}},
context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}}));
state.DisplayName = new global::Opc.Ua.LocalizedText(
{{Tokens.DisplayName}});
}
state.TypeDefinitionId = {{Tokens.TypeDefinitionId}};
{{Tokens.DescriptionValue}}
state.WriteMask = {{Tokens.WriteMaskValue}};
state.UserWriteMask = {{Tokens.UserWriteMaskValue}};
state.ReferenceTypeId = {{Tokens.ReferenceTypeId}};
state.EventNotifier = {{Tokens.EventNotifier}};
{{Tokens.ReleaseStatusValue}}
{{Tokens.CategoriesValue}}
{{Tokens.SpecificationValue}}
{{Tokens.AccessRestrictionsValue}}
{{Tokens.ListOfRolePermissions}}
{{Tokens.ListOfReferences}}
{{Tokens.ListOfChildNodeStates}}
return state;
}
""");
///
/// Template variable type instance creation (instantiate a variable type)
///
public static readonly TemplateString Create_InstanceOfVariableType = TemplateString.Parse(
$$"""
///
/// Creates an instance of the {{Tokens.TypeName}} variable type.
///
public static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}(
this global::Opc.Ua.ISystemContext context,
global::Opc.Ua.NodeState parent = null,
global::Opc.Ua.QualifiedName browseName = default)
{
var state = {{Tokens.StateClassFactory}}(parent);
state.NodeId = {{Tokens.NodeIdConstant}};
if (!browseName.IsNull)
{
state.SymbolicName = browseName.Name;
state.BrowseName = browseName;
state.DisplayName = new global::Opc.Ua.LocalizedText(browseName.Name);
}
else
{
state.SymbolicName = {{Tokens.SymbolicNameSymbol}};
state.BrowseName = new global::Opc.Ua.QualifiedName(
{{Tokens.BrowseNameSymbol}},
context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}}));
state.DisplayName = new global::Opc.Ua.LocalizedText(
{{Tokens.DisplayName}});
}
state.TypeDefinitionId = {{Tokens.TypeDefinitionId}};
{{Tokens.DescriptionValue}}
state.WriteMask = {{Tokens.WriteMaskValue}};
state.UserWriteMask = {{Tokens.UserWriteMaskValue}};
state.ReferenceTypeId = {{Tokens.ReferenceTypeId}};
{{Tokens.ModellingRuleId}}
state.DataType = {{Tokens.DataTypeIdConstant}};
state.ValueRank = {{Tokens.ValueRank}};
{{Tokens.ArrayDimensions}}
state.AccessLevel = {{Tokens.AccessLevelValue}};
state.UserAccessLevel = {{Tokens.UserAccessLevelValue}};
state.MinimumSamplingInterval = {{Tokens.MinimumSamplingIntervalValue}};
state.Historizing = {{Tokens.HistorizingValue}};
{{Tokens.ValueCode}}
{{Tokens.ReleaseStatusValue}}
{{Tokens.CategoriesValue}}
{{Tokens.SpecificationValue}}
{{Tokens.AccessRestrictionsValue}}
{{Tokens.ListOfRolePermissions}}
{{Tokens.ListOfReferences}}
{{Tokens.ListOfChildNodeStates}}
return state;
}
""");
///
/// Template for child object state creation
///
public static readonly TemplateString Create_ChildObject = TemplateString.Parse(
$$"""
///
/// Creates an instance of the {{Tokens.SymbolicName}} object node child component.
///
internal static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}(
this global::Opc.Ua.ISystemContext context,
global::Opc.Ua.NodeState parent,
bool forInstance = false)
{
var state = {{Tokens.StateClassFactory}}(parent);
state.SymbolicName = {{Tokens.SymbolicNameSymbol}};
state.NodeId = {{Tokens.NodeIdConstant}};
state.TypeDefinitionId = {{Tokens.TypeDefinitionId}};
state.BrowseName = new global::Opc.Ua.QualifiedName(
{{Tokens.BrowseNameSymbol}},
context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}}));
state.DisplayName = new global::Opc.Ua.LocalizedText(
{{Tokens.DisplayName}});
state.NumericId = {{Tokens.NumericIdValue}};
{{Tokens.DescriptionValue}}
state.WriteMask = {{Tokens.WriteMaskValue}};
state.UserWriteMask = {{Tokens.UserWriteMaskValue}};
state.ReferenceTypeId = {{Tokens.ReferenceTypeId}};
state.EventNotifier = {{Tokens.EventNotifier}};
{{Tokens.ReleaseStatusValue}}
{{Tokens.CategoriesValue}}
{{Tokens.SpecificationValue}}
{{Tokens.AccessRestrictionsValue}}
{{Tokens.ListOfRolePermissions}}
{{Tokens.ListOfReferences}}
{{Tokens.ListOfChildNodeStates}}
if (!forInstance)
{
{{Tokens.ModellingRuleId}}
{{Tokens.ListOfOptionalChildNodeStates}}
}
return state;
}
""");
///
/// Template for child variable state creation
///
public static readonly TemplateString Create_ChildVariable = TemplateString.Parse(
$$"""
///
/// Creates the {{Tokens.SymbolicName}} child Variable node child component.
///
internal static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}(
this global::Opc.Ua.ISystemContext context,
global::Opc.Ua.NodeState parent,
bool forInstance = false)
{
var state = {{Tokens.StateClassFactory}}(parent);
state.SymbolicName = {{Tokens.SymbolicNameSymbol}};
state.NodeId = {{Tokens.NodeIdConstant}};
state.TypeDefinitionId = {{Tokens.TypeDefinitionId}};
state.NumericId = {{Tokens.NumericIdValue}};
state.BrowseName = new global::Opc.Ua.QualifiedName(
{{Tokens.BrowseNameSymbol}},
context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}}));
state.DisplayName = new global::Opc.Ua.LocalizedText(
{{Tokens.DisplayName}});
{{Tokens.DescriptionValue}}
state.WriteMask = {{Tokens.WriteMaskValue}};
state.UserWriteMask = {{Tokens.UserWriteMaskValue}};
state.ReferenceTypeId = {{Tokens.ReferenceTypeId}};
state.DataType = {{Tokens.DataTypeIdConstant}};
state.ValueRank = {{Tokens.ValueRank}};
{{Tokens.ArrayDimensions}}
state.AccessLevel = {{Tokens.AccessLevelValue}};
state.UserAccessLevel = {{Tokens.UserAccessLevelValue}};
state.MinimumSamplingInterval = {{Tokens.MinimumSamplingIntervalValue}};
state.Historizing = {{Tokens.HistorizingValue}};
{{Tokens.ValueCode}}
{{Tokens.ReleaseStatusValue}}
{{Tokens.CategoriesValue}}
{{Tokens.SpecificationValue}}
{{Tokens.AccessRestrictionsValue}}
{{Tokens.ListOfRolePermissions}}
{{Tokens.ListOfReferences}}
{{Tokens.ListOfChildNodeStates}}
{{Tokens.MethodDeclarationId}}
if (!forInstance)
{
{{Tokens.ModellingRuleId}}
{{Tokens.ListOfOptionalChildNodeStates}}
}
return state;
}
""");
///
/// Template for child method state creation
///
public static readonly TemplateString Create_ChildMethod = TemplateString.Parse(
$$"""
///
/// Creates the {{Tokens.SymbolicName}} child Method node child component.
///
internal static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}(
this global::Opc.Ua.ISystemContext context,
global::Opc.Ua.NodeState parent,
bool forInstance = false)
{
var state = {{Tokens.StateClassFactory}}(parent);
state.SymbolicName = {{Tokens.SymbolicNameSymbol}};
state.NodeId = {{Tokens.NodeIdConstant}};
{{Tokens.MethodDeclarationId}}
state.BrowseName = new global::Opc.Ua.QualifiedName(
{{Tokens.BrowseNameSymbol}},
context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}}));
state.DisplayName = new global::Opc.Ua.LocalizedText(
{{Tokens.DisplayName}});
state.NumericId = {{Tokens.NumericIdValue}};
{{Tokens.DescriptionValue}}
state.WriteMask = {{Tokens.WriteMaskValue}};
state.UserWriteMask = {{Tokens.UserWriteMaskValue}};
state.ReferenceTypeId = {{Tokens.ReferenceTypeId}};
state.Executable = {{Tokens.ExecutableValue}};
state.UserExecutable = {{Tokens.ExecutableValue}};
{{Tokens.ReleaseStatusValue}}
{{Tokens.CategoriesValue}}
{{Tokens.SpecificationValue}}
if (forInstance)
{
{{Tokens.AccessRestrictionsValue}}
{{Tokens.ListOfRolePermissions}}
}
{{Tokens.ListOfReferences}}
{{Tokens.ListOfChildNodeStates}}
if (!forInstance)
{
{{Tokens.ModellingRuleId}}
{{Tokens.ListOfOptionalChildNodeStates}}
}
return state;
}
""");
///
/// Template for child object state creation
///
public static readonly TemplateString Create_ChildObject_Placeholder = TemplateString.Parse(
$$"""
///
/// Creates an instance of the {{Tokens.SymbolicName}} object placeholder child.
///
internal static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}(
this global::Opc.Ua.ISystemContext context,
global::Opc.Ua.NodeState parent,
global::Opc.Ua.QualifiedName browseName = default,
bool forInstance = false)
{
var state = {{Tokens.StateClassFactory}}(parent);
state.NodeId = {{Tokens.NodeIdConstant}};
if (!browseName.IsNull)
{
state.SymbolicName = browseName.Name;
state.BrowseName = browseName;
state.DisplayName = new global::Opc.Ua.LocalizedText(browseName.Name);
forInstance = true;
}
else
{
// Create the state for the type parent
state.SymbolicName = {{Tokens.SymbolicNameSymbol}};
state.BrowseName = new global::Opc.Ua.QualifiedName(
{{Tokens.BrowseNameSymbol}},
context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}}));
state.DisplayName = new global::Opc.Ua.LocalizedText(
{{Tokens.DisplayName}});
}
state.NumericId = {{Tokens.NumericIdValue}};
{{Tokens.DescriptionValue}}
state.WriteMask = {{Tokens.WriteMaskValue}};
state.UserWriteMask = {{Tokens.UserWriteMaskValue}};
state.TypeDefinitionId = {{Tokens.TypeDefinitionId}};
state.ReferenceTypeId = {{Tokens.ReferenceTypeId}};
state.EventNotifier = {{Tokens.EventNotifier}};
{{Tokens.ReleaseStatusValue}}
{{Tokens.CategoriesValue}}
{{Tokens.SpecificationValue}}
{{Tokens.AccessRestrictionsValue}}
{{Tokens.ListOfRolePermissions}}
{{Tokens.ListOfReferences}}
{{Tokens.ListOfChildNodeStates}}
if (!forInstance)
{
{{Tokens.ModellingRuleId}}
{{Tokens.ListOfOptionalChildNodeStates}}
}
return state;
}
""");
///
/// Template for child variable state creation
///
public static readonly TemplateString Create_ChildVariable_Placeholder = TemplateString.Parse(
$$"""
///
/// Creates the {{Tokens.SymbolicName}} child Variable object placeholder child.
///
internal static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}(
this global::Opc.Ua.ISystemContext context,
global::Opc.Ua.NodeState parent,
global::Opc.Ua.QualifiedName browseName = default,
bool forInstance = false)
{
var state = {{Tokens.StateClassFactory}}(parent);
state.NodeId = {{Tokens.NodeIdConstant}};
if (!browseName.IsNull)
{
state.SymbolicName = browseName.Name;
state.BrowseName = browseName;
state.DisplayName = new global::Opc.Ua.LocalizedText(browseName.Name);
forInstance = true;
}
else
{
// Create the state for the type parent
state.SymbolicName = {{Tokens.SymbolicNameSymbol}};
state.BrowseName = new global::Opc.Ua.QualifiedName(
{{Tokens.BrowseNameSymbol}},
context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}}));
state.DisplayName = new global::Opc.Ua.LocalizedText(
{{Tokens.DisplayName}});
}
state.NumericId = {{Tokens.NumericIdValue}};
{{Tokens.DescriptionValue}}
state.WriteMask = {{Tokens.WriteMaskValue}};
state.UserWriteMask = {{Tokens.UserWriteMaskValue}};
state.TypeDefinitionId = {{Tokens.TypeDefinitionId}};
state.ReferenceTypeId = {{Tokens.ReferenceTypeId}};
{{Tokens.ModellingRuleId}}
state.DataType = {{Tokens.DataTypeIdConstant}};
state.ValueRank = {{Tokens.ValueRank}};
{{Tokens.ArrayDimensions}}
state.AccessLevel = {{Tokens.AccessLevelValue}};
state.UserAccessLevel = {{Tokens.UserAccessLevelValue}};
state.MinimumSamplingInterval = {{Tokens.MinimumSamplingIntervalValue}};
state.Historizing = {{Tokens.HistorizingValue}};
{{Tokens.ValueCode}}
{{Tokens.ReleaseStatusValue}}
{{Tokens.CategoriesValue}}
{{Tokens.SpecificationValue}}
{{Tokens.AccessRestrictionsValue}}
{{Tokens.ListOfRolePermissions}}
{{Tokens.ListOfReferences}}
{{Tokens.ListOfChildNodeStates}}
if (!forInstance)
{
{{Tokens.ModellingRuleId}}
{{Tokens.ListOfOptionalChildNodeStates}}
}
return state;
}
""");
///
/// Template for child method state creation
///
public static readonly TemplateString Create_ChildMethod_Placeholder = TemplateString.Parse(
$$"""
///
/// Creates the {{Tokens.SymbolicName}} child Method object placeholder child.
///
internal static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}(
this global::Opc.Ua.ISystemContext context,
global::Opc.Ua.NodeState parent,
global::Opc.Ua.QualifiedName browseName = default,
bool forInstance = false)
{
var state = {{Tokens.StateClassFactory}}(parent);
state.NodeId = {{Tokens.NodeIdConstant}};
if (!browseName.IsNull)
{
state.SymbolicName = browseName.Name;
state.BrowseName = browseName;
state.DisplayName = new global::Opc.Ua.LocalizedText(browseName.Name);
forInstance = true;
}
else
{
// Create the state for the type parent
state.SymbolicName = {{Tokens.SymbolicNameSymbol}};
state.BrowseName = new global::Opc.Ua.QualifiedName(
{{Tokens.BrowseNameSymbol}},
context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}}));
state.DisplayName = new global::Opc.Ua.LocalizedText(
{{Tokens.DisplayName}});
}
state.NumericId = {{Tokens.NumericIdValue}};
{{Tokens.DescriptionValue}}
state.WriteMask = {{Tokens.WriteMaskValue}};
state.UserWriteMask = {{Tokens.UserWriteMaskValue}};
state.ReferenceTypeId = {{Tokens.ReferenceTypeId}};
state.Executable = {{Tokens.ExecutableValue}};
state.UserExecutable = {{Tokens.ExecutableValue}};
{{Tokens.MethodDeclarationId}}
{{Tokens.ReleaseStatusValue}}
{{Tokens.CategoriesValue}}
{{Tokens.SpecificationValue}}
{{Tokens.AccessRestrictionsValue}}
{{Tokens.ListOfRolePermissions}}
{{Tokens.ListOfReferences}}
{{Tokens.ListOfChildNodeStates}}
if (!forInstance)
{
{{Tokens.ModellingRuleId}}
{{Tokens.ListOfOptionalChildNodeStates}}
}
return state;
}
""");
///
/// Template for role permissions collection initialization
///
public static readonly TemplateString ListOfRolePermissions = TemplateString.Parse(
$$"""
state.RolePermissions = new global::Opc.Ua.RolePermissionType[]
{
{{Tokens.ListOfRolePermissions}}
};
""");
///
/// Template for role permission
///
public static readonly TemplateString RolePermission = TemplateString.Parse(
$$"""
new global::Opc.Ua.RolePermissionType
{
RoleId = {{Tokens.RoleIdConstant}},
Permissions = {{Tokens.PermissionsValue}}
},
""");
///
/// Template for description assignment
///
public static readonly TemplateString Description = TemplateString.Parse(
$$"""
state.Description = new global::Opc.Ua.LocalizedText({{Tokens.DescriptionValue}});
""");
///
/// Template for inverse name assignment
///
public static readonly TemplateString InverseName = TemplateString.Parse(
$$"""
state.InverseName = new global::Opc.Ua.LocalizedText({{Tokens.InverseNameValue}});
""");
///
/// Template for release status assignment
///
public static readonly TemplateString ReleaseStatus = TemplateString.Parse(
$$"""
state.ReleaseStatus = {{Tokens.ReleaseStatusValue}};
""");
///
/// Template for categories assignment
///
public static readonly TemplateString Categories = TemplateString.Parse(
$$"""
state.Categories = {{Tokens.CategoriesValue}};
""");
///
/// Template for specification assignment
///
public static readonly TemplateString Specification = TemplateString.Parse(
$$"""
state.Specification = {{Tokens.SpecificationValue}};
""");
///
/// Template for access restrictions assignment
///
public static readonly TemplateString AccessRestrictions = TemplateString.Parse(
$$"""
state.AccessRestrictions = {{Tokens.AccessRestrictionsValue}};
""");
///
/// Template for method declaration id assignment
///
public static readonly TemplateString MethodDeclarationId = TemplateString.Parse(
$$"""
state.MethodDeclarationId = {{Tokens.MethodDeclarationId}};
""");
///
/// Template for array dimensions assignment
///
public static readonly TemplateString ArrayDimensions = TemplateString.Parse(
$$"""
state.ArrayDimensions = {{Tokens.ArrayDimensions}};
""");
///
/// Template for value assignment
///
public static readonly TemplateString VariantArrayOfValue = TemplateString.Parse(
$$"""
state.WrappedValue = global::Opc.Ua.Variant.FromStructure(
global::Opc.Ua.ArrayOf.ToArrayOf(new {{Tokens.DataType}}[]
{
{{Tokens.ListOfValues}}
}));
""");
///
/// Template for value assignment
///
public static readonly TemplateString ArgumentValue = TemplateString.Parse(
$$"""
new global::Opc.Ua.Argument
{
Name = {{Tokens.Name}},
DataType = {{Tokens.DataType}},
ValueRank = {{Tokens.ValueRank}},
ArrayDimensions = {{Tokens.ArrayDimensions}},
Description = {{Tokens.Description}}
},
""");
}
}