public static ConstructElement ( ISystemContext context, DaElement element, ushort namespaceIndex ) : NodeState | ||
context | ISystemContext | The context. |
element | DaElement | The element. |
namespaceIndex | ushort | Index of the namespace for the NodeId. |
return | NodeState |
/// <summary> /// Verifies that the specified node exists. /// </summary> protected override NodeState ValidateNode( ServerSystemContext context, NodeHandle handle, IDictionary <NodeId, NodeState> cache) { // not valid if no root. if (handle == null) { return(null); } // check if previously validated. if (handle.Validated) { return(handle.Node); } NodeState target = null; // check if already in the cache. if (cache != null) { if (cache.TryGetValue(handle.NodeId, out target)) { // nulls mean a NodeId which was previously found to be invalid has been referenced again. if (target == null) { return(null); } handle.Node = target; handle.Validated = true; return(handle.Node); } target = null; } try { // check if the node id has been parsed. DaParsedNodeId parsedNodeId = handle.ParsedNodeId as DaParsedNodeId; if (parsedNodeId == null) { return(null); } NodeState root = null; DaElement element = null; ComDaClient client = m_system.SelectClient(context, false); // validate a branch or item. if (parsedNodeId.RootType == DaModelUtils.DaElement) { element = client.FindElement(parsedNodeId.RootId); // branch does not exist. if (element == null) { return(null); } // create a temporary object to use for the operation. root = DaModelUtils.ConstructElement(context, element, NamespaceIndex); root.Handle = element; AddAdditionalElementReferences(SystemContext, root); } // validate an property. else if (parsedNodeId.RootType == DaModelUtils.DaProperty) { element = client.FindElement(parsedNodeId.RootId); // branch does not exist. if (element == null) { return(null); } // validate the property. DaProperty property = client.FindProperty(parsedNodeId.RootId, parsedNodeId.PropertyId); // property does not exist. if (property == null) { return(null); } // create a temporary object to use for the operation. root = DaModelUtils.ConstructProperty(context, element.ItemId, property, NamespaceIndex); root.Handle = property; AddAdditionalElementReferences(SystemContext, root); } // unknown root type. else { return(null); } // all done if no components to validate. if (String.IsNullOrEmpty(parsedNodeId.ComponentPath)) { handle.Validated = true; handle.Node = target = root; return(handle.Node); } // validate component. NodeState component = root.FindChildBySymbolicName(context, parsedNodeId.ComponentPath); // component does not exist. if (component == null) { return(null); } // found a valid component. handle.Validated = true; handle.Node = target = component; return(handle.Node); } finally { // store the node in the cache to optimize subsequent lookups. if (cache != null) { cache.Add(handle.NodeId, target); } } }
/// <summary> /// Returns the next child. /// </summary> private NodeStateReference NextChild(Stage stage) { ComDaClientManager system = (ComDaClientManager)this.SystemContext.SystemHandle; ComDaClient client = system.SelectClient((ServerSystemContext)SystemContext, false); DaElement element = null; if (stage == Stage.Children) { if (m_browser == null) { return(null); } element = m_browser.Next(); if (element == null) { return(null); } // construct the node. NodeState node = DaModelUtils.ConstructElement(SystemContext, element, m_namespaceIndex); // return the reference. return(new NodeStateReference(ReferenceTypeIds.Organizes, false, node)); } if (stage == Stage.Properties) { if (m_properties == null) { return(null); } for (int ii = m_position; ii < m_properties.Length; ii++) { if (m_properties[ii].PropertyId <= PropertyIds.TimeZone) { continue; } m_position = ii + 1; // construct the node. NodeState node = DaModelUtils.ConstructProperty(SystemContext, m_itemId, m_properties[ii], m_namespaceIndex); // return the reference. return(new NodeStateReference(ReferenceTypeIds.HasProperty, false, node)); } // all done. return(null); } if (stage == Stage.Parents) { if (m_parentId != null) { NodeId parentId = DaModelUtils.ConstructIdForDaElement(m_parentId, -1, m_namespaceIndex); m_parentId = null; return(new NodeStateReference(ReferenceTypeIds.Organizes, true, parentId)); } } return(null); }