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();
}
}