Opc.Ua.Server.CoreNodeManager.CreateReferenceType C# (CSharp) Method

CreateReferenceType() public method

Creates an ReferenceType node with the specified node id.
public CreateReferenceType ( NodeId parentId, NodeId nodeId, QualifiedName browseName, LocalizedText displayName, LocalizedText description, uint writeMask, uint userWriteMask, LocalizedText inverseName, bool isAbstract, bool symmetric ) : NodeId
parentId NodeId
nodeId NodeId
browseName QualifiedName
displayName LocalizedText
description LocalizedText
writeMask uint
userWriteMask uint
inverseName LocalizedText
isAbstract bool
symmetric bool
return NodeId
        public NodeId CreateReferenceType(
            NodeId         parentId,
            NodeId         nodeId,
            QualifiedName  browseName,
            LocalizedText  displayName,
            LocalizedText  description,
            uint           writeMask,
            uint           userWriteMask,
            LocalizedText  inverseName,
            bool           isAbstract,
            bool           symmetric)
        {
            try
            {
                m_lock.Enter();
    
                // check for null node id.
                if (NodeId.IsNull(nodeId))
                {
                    nodeId = CreateUniqueNodeId();
                }

                // check if node id exists.
                if (m_nodes.Exists(nodeId))
                {
                    throw ServiceResultException.Create(StatusCodes.BadNodeIdExists, "NodeId '{0}' already exists.", nodeId);
                }

                // find parent.
                IReferenceType parent = GetManagerHandle(parentId) as IReferenceType;

                if (parent == null)
                {
                    throw ServiceResultException.Create(StatusCodes.BadParentNodeIdInvalid, "Parent node '{0}' does not exist or is not an ReferenceType.", parentId);
                }
                
                // validate reference.
                ValidateReference(parent, ReferenceTypeIds.HasSubtype, false, NodeClass.ReferenceType);

                // validate browse name.
                if (QualifiedName.IsNull(browseName))
                {
                    throw ServiceResultException.Create(StatusCodes.BadBrowseNameInvalid, "BrowseName must not be empty.");
                }

                // check that the browse name is unique.
                if (m_server.TypeTree.FindReferenceType(browseName) != null)
                {
                    throw ServiceResultException.Create(StatusCodes.BadBrowseNameInvalid, "A ReferenceType with the same BrowseName ({0}) already exists.", browseName);
                }

                // create node.
                ReferenceTypeNode node = new ReferenceTypeNode();

                node.NodeId          = nodeId;
                node.NodeClass       = NodeClass.ReferenceType;
                node.BrowseName      = browseName;
                node.DisplayName     = displayName;
                node.Description     = description;
                node.WriteMask       = writeMask;
                node.UserWriteMask   = userWriteMask;
                node.InverseName     = inverseName;
                node.IsAbstract      = isAbstract;
                node.Symmetric       = symmetric;

                if (node.DisplayName == null)
                {
                    node.DisplayName = new LocalizedText(browseName.Name);
                }

                // add reference from parent.
                AddReference(parent, ReferenceTypeIds.HasSubtype, false, node, true);
                
                // add node.
                AddNode(node);
                                
                // return the new node id.
                return node.NodeId;
            }
            finally
            {
                m_lock.Exit();
            } 
        }