/// <summary> /// Convert node model to vertex /// </summary> /// <param name="node"></param> /// <param name="sourceId"></param> /// <param name="revision"></param> /// <param name="codec"></param> /// <param name="context"></param> /// <returns></returns> public static BaseNodeVertexModel ToVertex(this BaseNodeModel node, string sourceId, long revision, IVariantEncoder codec, ServiceMessageContext context) { if (node == null) { throw new ArgumentNullException(nameof(node)); } if (NodeId.IsNull(node.NodeId)) { throw new ArgumentException(nameof(node)); } var builtInType = BuiltInType.Null; BaseNodeVertexModel vertex; switch (node) { case ObjectNodeModel oNode: vertex = new ObjectNodeVertexModel { EventNotifier = (NodeEventNotifier?)oNode.EventNotifier }; break; case PropertyNodeModel vNode: vertex = new PropertyNodeVertexModel { ValueRank = (NodeValueRank?)vNode.ValueRank, ArrayDimensions = vNode.ArrayDimensions, AccessLevel = (vNode.AccessLevel != null || vNode.AccessLevelEx != null) ? (NodeAccessLevel?)((vNode.AccessLevel ?? 0) | (vNode.AccessLevelEx ?? 0)) : null, MinimumSamplingInterval = vNode.MinimumSamplingInterval, Historizing = vNode.Historizing, Value = vNode.Value == null ? null : codec.Encode(vNode.Value.Value, out builtInType, context), BuiltInType = builtInType }; break; case VariableNodeModel vNode: vertex = new VariableNodeVertexModel { ValueRank = (NodeValueRank?)vNode.ValueRank, ArrayDimensions = vNode.ArrayDimensions, AccessLevel = (vNode.AccessLevel != null || vNode.AccessLevelEx != null) ? (NodeAccessLevel?)((vNode.AccessLevel ?? 0) | (vNode.AccessLevelEx ?? 0)) : null, MinimumSamplingInterval = vNode.MinimumSamplingInterval, Historizing = vNode.Historizing, Value = vNode.Value == null ? null : codec.Encode(vNode.Value.Value, out builtInType, context), BuiltInType = builtInType }; break; case MethodNodeModel mNode: vertex = new MethodNodeVertexModel { Executable = mNode.Executable.ToNullable(false), UserExecutable = mNode.UserExecutable.ToNullable(false) }; break; case ViewNodeModel vNode: vertex = new ViewNodeVertexModel { ContainsNoLoops = vNode.ContainsNoLoops }; break; case ObjectTypeNodeModel otNode: vertex = new ObjectTypeNodeVertexModel { IsAbstract = otNode.IsAbstract }; break; case PropertyTypeNodeModel vtNode: vertex = new PropertyTypeNodeVertexModel { IsAbstract = vtNode.IsAbstract ?? false, ValueRank = (NodeValueRank?)vtNode.ValueRank, ArrayDimensions = vtNode.ArrayDimensions, Value = vtNode.Value == null ? null : codec.Encode(vtNode.Value.Value, out builtInType, context), BuiltInType = builtInType }; break; case VariableTypeNodeModel vtNode: vertex = new VariableTypeNodeVertexModel { IsAbstract = vtNode.IsAbstract ?? false, ValueRank = (NodeValueRank?)vtNode.ValueRank, ArrayDimensions = vtNode.ArrayDimensions, Value = vtNode.Value == null ? null : codec.Encode(vtNode.Value.Value, out builtInType, context), BuiltInType = builtInType }; break; case DataTypeNodeModel dtNode: vertex = new DataTypeNodeVertexModel { IsAbstract = dtNode.IsAbstract, DataTypeDefinition = dtNode.Definition == null ? null : codec.Encode(new Variant(new ExtensionObject(dtNode.Definition)), out _, context) }; break; case ReferenceTypeNodeModel rtNode: vertex = new ReferenceTypeNodeVertexModel { IsAbstract = rtNode.IsAbstract, Symmetric = rtNode.Symmetric, InverseName = rtNode.InverseName.AsString() }; break; default: return(null); } vertex.NodeId = node.NodeId.AsString(context); vertex.BrowseName = node.BrowseName.AsString(context); vertex.DisplayName = node.DisplayName.AsString(); vertex.Description = node.Description.AsString(); vertex.WriteMask = (uint?)node.WriteMask; vertex.UserWriteMask = (uint?)node.UserWriteMask; if (!string.IsNullOrEmpty(node.SymbolicName) && node.SymbolicName != node.BrowseName.Name) { vertex.SymbolicName = node.SymbolicName; } vertex.Revision = revision; vertex.SourceId = sourceId; vertex.Id = CreateAddressSpaceVertexId(sourceId, vertex.NodeId); #if FALSE if (node.RolePermissions != null && node.RolePermissions.Count > 0) { } if (node.UserRolePermissions != null && node.UserRolePermissions.Count > 0) { } // export references. var exportedReferences = new List <Reference>(); foreach (var reference in node.GetAllReferences(context)) { if (node.NodeClass == NodeClass.Method) { if (!reference.IsInverse && reference.ReferenceTypeId == ReferenceTypeIds.HasTypeDefinition) { continue; } } exportedReferences.Add(new Reference { ReferenceType = EncodeNodeId(reference.ReferenceTypeId, context), IsForward = !reference.IsInverse, Value = EncodeExpandedNodeId(reference.TargetId, context) }); } vertex.References = exportedReferences.ToArray(); #endif return(vertex); }