Exemple #1
0
        /// <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);
        }