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