/// <summary> /// Gets or creates the <see cref="NamespaceMetadataState"/> node for the specified NamespaceUri. /// </summary> /// <param name="namespaceUri"></param> /// <returns></returns> public NamespaceMetadataState CreateNamespaceMetadataState(string namespaceUri) { NamespaceMetadataState namespaceMetadataState = FindNamespaceMetadataState(namespaceUri); if (namespaceMetadataState == null) { // find ServerNamespaces node NamespacesState serverNamespacesNode = FindPredefinedNode(ObjectIds.Server_Namespaces, typeof(NamespacesState)) as NamespacesState; if (serverNamespacesNode == null) { Utils.LogError("Cannot create NamespaceMetadataState for namespace '{0}'.", namespaceUri); return(null); } // create the NamespaceMetadata node namespaceMetadataState = new NamespaceMetadataState(serverNamespacesNode); namespaceMetadataState.BrowseName = new QualifiedName(namespaceUri, NamespaceIndex); namespaceMetadataState.Create(SystemContext, null, namespaceMetadataState.BrowseName, null, true); namespaceMetadataState.DisplayName = namespaceUri; namespaceMetadataState.SymbolicName = namespaceUri; namespaceMetadataState.NamespaceUri.Value = namespaceUri; // add node as child of ServerNamespaces and in predefined nodes serverNamespacesNode.AddChild(namespaceMetadataState); serverNamespacesNode.ClearChangeMasks(Server.DefaultSystemContext, true); AddPredefinedNode(SystemContext, namespaceMetadataState); } return(namespaceMetadataState); }
/// <summary> /// Gets and returns the <see cref="NamespaceMetadataState"/> node associated with the specified NamespaceUri /// </summary> /// <param name="namespaceUri"></param> /// <returns></returns> public NamespaceMetadataState GetNamespaceMetadataState(string namespaceUri) { if (namespaceUri == null) { return(null); } if (m_namespaceMetadataStates.ContainsKey(namespaceUri)) { return(m_namespaceMetadataStates[namespaceUri]); } NamespaceMetadataState namespaceMetadataState = FindNamespaceMetadataState(namespaceUri); lock (Lock) { // remember the result for faster access. m_namespaceMetadataStates[namespaceUri] = namespaceMetadataState; } return(namespaceMetadataState); }
/// <summary> /// Finds the <see cref="NamespaceMetadataState"/> node for the specified NamespaceUri. /// </summary> /// <param name="namespaceUri"></param> /// <returns></returns> private NamespaceMetadataState FindNamespaceMetadataState(string namespaceUri) { try { // find ServerNamespaces node NamespacesState serverNamespacesNode = FindPredefinedNode(ObjectIds.Server_Namespaces, typeof(NamespacesState)) as NamespacesState; if (serverNamespacesNode == null) { Utils.LogError("Cannot find ObjectIds.Server_Namespaces node."); return(null); } IList <BaseInstanceState> serverNamespacesChildren = new List <BaseInstanceState>(); serverNamespacesNode.GetChildren(SystemContext, serverNamespacesChildren); foreach (var namespacesReference in serverNamespacesChildren) { // Find NamespaceMetadata node of NamespaceUri in Namespaces children NamespaceMetadataState namespaceMetadata = namespacesReference as NamespaceMetadataState; if (namespaceMetadata == null) { continue; } if (namespaceMetadata.NamespaceUri.Value == namespaceUri) { return(namespaceMetadata); } else { continue; } } IList <IReference> serverNamespacesReferencs = new List <IReference>(); serverNamespacesNode.GetReferences(SystemContext, serverNamespacesReferencs); foreach (IReference serverNamespacesReference in serverNamespacesReferencs) { if (serverNamespacesReference.IsInverse == false) { // Find NamespaceMetadata node of NamespaceUri in Namespaces references NodeId nameSpaceNodeId = ExpandedNodeId.ToNodeId(serverNamespacesReference.TargetId, Server.NamespaceUris); NamespaceMetadataState namespaceMetadata = FindNodeInAddressSpace(nameSpaceNodeId) as NamespaceMetadataState; if (namespaceMetadata == null) { continue; } if (namespaceMetadata.NamespaceUri.Value == namespaceUri) { return(namespaceMetadata); } } } return(null); } catch (Exception ex) { Utils.LogError(ex, "Error searching NamespaceMetadata for namespaceUri {0}.", namespaceUri); return(null); } }