/// <summary> /// Returns a unique handle for the node. /// </summary> protected override NodeHandle GetManagerHandle(ServerSystemContext context, NodeId nodeId, IDictionary <NodeId, NodeState> cache) { lock (Lock) { // quickly exclude nodes that are not in the namespace. if (!IsNodeIdInNamespace(nodeId)) { return(null); } // check for check for nodes that are being currently monitored. MonitoredNode monitoredNode = null; if (MonitoredNodes.TryGetValue(nodeId, out monitoredNode)) { NodeHandle handle = new NodeHandle(); handle.NodeId = nodeId; handle.Validated = true; handle.Node = monitoredNode.Node; return(handle); } if (nodeId.IdType != IdType.String) { NodeState node = null; if (PredefinedNodes.TryGetValue(nodeId, out node)) { NodeHandle handle = new NodeHandle(); handle.NodeId = nodeId; handle.Node = node; handle.Validated = true; return(handle); } } // parse the identifier. ParsedNodeId parsedNodeId = ParsedNodeId.Parse(nodeId); if (parsedNodeId != null) { NodeHandle handle = new NodeHandle(); handle.NodeId = nodeId; handle.Validated = false; handle.Node = null; handle.ParsedNodeId = parsedNodeId; return(handle); } return(null); } }
/// <summary> /// Returns a unique handle for the node. /// </summary> protected override NodeHandle GetManagerHandle(ServerSystemContext context, NodeId nodeId, IDictionary <NodeId, NodeState> cache) { lock (Lock) { // quickly exclude nodes that are not in the namespace. if (!IsNodeIdInNamespace(nodeId)) { return(null); } NodeState node = null; // check cache (the cache is used because the same node id can appear many times in a single request). if (cache != null) { if (cache.TryGetValue(nodeId, out node)) { return(new NodeHandle(nodeId, node)); } } // look up predefined node. if (PredefinedNodes.TryGetValue(nodeId, out node)) { NodeHandle handle = new NodeHandle(nodeId, node); if (cache != null) { cache.Add(nodeId, node); } return(handle); } #region Task #A5 - Add Support for External Nodes // parse the node id and return an unvalidated handle. if (nodeId.IdType == IdType.String) { NodeHandle handle = new NodeHandle(); handle.NodeId = nodeId; handle.Validated = false; handle.ParsedNodeId = ParsedNodeId.Parse(nodeId); return(handle); } #endregion // node not found. return(null); } }
/// <summary> /// Creates the NodeId for the specified node. /// </summary> public override NodeId New(ISystemContext context, NodeState node) { if (node is BaseInstanceState instance && instance.Parent != null) { var pnd = ParsedNodeId.Parse(instance.Parent.NodeId); if (pnd != null) { return(pnd.Construct(instance.SymbolicName)); } } return(node.NodeId); }
/// <summary> /// Returns a unique handle for the node. /// </summary> protected override NodeHandle GetManagerHandle(ServerSystemContext context, NodeId nodeId, IDictionary <NodeId, NodeState> cache) { lock (Lock) { // quickly exclude nodes that are not in the namespace. if (!IsNodeIdInNamespace(nodeId)) { return(null); } // check for check for nodes that are being currently monitored. if (MonitoredNodes.TryGetValue(nodeId, out var monitoredNode)) { var handle = new NodeHandle { NodeId = nodeId, Validated = true, Node = monitoredNode.Node }; return(handle); } // parse the identifier. var parsedNodeId = ParsedNodeId.Parse(nodeId); if (parsedNodeId != null) { var handle = new NodeHandle { NodeId = nodeId, Validated = false, Node = null, ParsedNodeId = parsedNodeId }; return(handle); } return(null); } }
/// <summary> /// Used to receive notifications when a node is browsed. /// </summary> public void OnPopulateBrowser( ISystemContext context, NodeState node, NodeBrowser browser) { ParsedNodeId nodeId = ParsedNodeId.Parse(node.NodeId); DirectoryInfo info = new DirectoryInfo(nodeId.RootId); if (!info.Exists) { return; } if (browser.IsRequired(ReferenceTypeIds.Organizes, false)) { foreach (DirectoryInfo child in info.GetDirectories()) { ParsedNodeId childId = new ParsedNodeId(); childId.RootType = 0; childId.RootId = child.FullName; childId.NamespaceIndex = NamespaceIndex; browser.Add(new NodeStateReference(ReferenceTypeIds.Organizes, false, childId.Construct())); } } if (browser.IsRequired(ReferenceTypeIds.Organizes, true)) { ParsedNodeId parentId = new ParsedNodeId(); parentId.RootType = 0; parentId.RootId = info.Parent.FullName; parentId.NamespaceIndex = NamespaceIndex; browser.Add(new NodeStateReference(ReferenceTypeIds.Organizes, true, parentId.Construct())); } }