/// <summary> /// Initializes the object with default values. /// </summary> public MasterNodeManager( IServerInternal server, ApplicationConfiguration configuration, string dynamicNamespaceUri, params INodeManager[] additionalManagers) { if (server == null) throw new ArgumentNullException("server"); if (configuration == null) throw new ArgumentNullException("configuration"); m_server = server; m_nodeManagers = new List<INodeManager>(); m_maxContinuationPointsPerBrowse = (uint)configuration.ServerConfiguration.MaxBrowseContinuationPoints; // ensure the dynamic namespace uris. int dynamicNamespaceIndex = 1; if (!String.IsNullOrEmpty(dynamicNamespaceUri)) { dynamicNamespaceIndex = server.NamespaceUris.GetIndex(dynamicNamespaceUri); if (dynamicNamespaceIndex == -1) { dynamicNamespaceIndex = server.NamespaceUris.Append(dynamicNamespaceUri); } } // need to build a table of NamespaceIndexes and their NodeManagers. List<INodeManager> registeredManagers = null; Dictionary<int,List<INodeManager>> namespaceManagers = new Dictionary<int,List<INodeManager>>(); namespaceManagers[0] = registeredManagers = new List<INodeManager>(); namespaceManagers[1] = registeredManagers = new List<INodeManager>(); // always add the diagnostics node manager to the start of the list. DiagnosticsNodeManager diagnosticsManager = new DiagnosticsNodeManager(server, configuration); RegisterNodeManager(diagnosticsManager, registeredManagers, namespaceManagers); // add the core node manager second because the diagnostics node manager takes priority. // always add the core node manager to the second of the list. m_nodeManagers.Add(new CoreNodeManager(m_server, configuration, (ushort)dynamicNamespaceIndex)); // register core node manager for default UA namespace. namespaceManagers[0].Add(m_nodeManagers[1]); // register core node manager for built-in server namespace. namespaceManagers[1].Add(m_nodeManagers[1]); // add the custom NodeManagers provided by the application. if (additionalManagers != null) { foreach (INodeManager nodeManager in additionalManagers) { RegisterNodeManager(nodeManager, registeredManagers, namespaceManagers); } // build table from dictionary. m_namespaceManagers = new INodeManager[m_server.NamespaceUris.Count][]; for (int ii = 0; ii < m_namespaceManagers.Length; ii++) { if (namespaceManagers.TryGetValue(ii, out registeredManagers)) { m_namespaceManagers[ii] = registeredManagers.ToArray(); } } } }