private INodeFactoryDescriptor LoadDescriptor(NodeConfigurationData configuration) { foreach (var loader in _descriptorLoaders) { try { Debug.Print("Try load Node factory descriptor using loader of type '{0}'", loader.GetType()); var descriptor = loader.LoadNodeFactoryDescriptor(configuration); if (descriptor != null) { Debug.Print("Successfully loaded Node factory descriptor of type '{0}'", descriptor.GetType()); return descriptor; } } catch (Exception e) { Debug.WriteLine(e.Message); return null; } } Debug.Fail("There are no loaders configured that able to load Node factory descriptor using configuration data", configuration.GetValue<string>()); return null; }
private static async Task<INode> LoadRootNode(NodeUri rootUri, INodeRuntime runtime, NodeConfigurationData configuration) { Debug.Indent(); Debug.Print("Load Node Descriptors Loaders"); //var nodeFactoryLoaders = configuration["nodeFactoryLoaders"].GetValue<IEnumerable<string>>() // .Select(x => runtime.TypeLoader.LoadType(x)) // .Select(x => runtime.ObjectLoader.CreateInstance<INodeFactoryDescriptorLoader>(x)) // .ToArray(); var nodeFactoryLoaders = new[] {new NodeFactoryDescriptorByTypeAttributeLoader(runtime)}; Debug.Print("Create Node loader"); var nodeLoader = new NodeFactoryLoader(nodeFactoryLoaders); Debug.Print("Create root Node locator builder"); var nodeLocatorBuilder = new NodeLocatorBuilder(); Debug.Print("Load root Node factory"); var nodeFactory = nodeLoader.LoadNodeFactory(nodeLocatorBuilder, configuration); Debug.Assert(nodeFactory != null, "Unable to load root Node factory"); Debug.Print($"Build root Node locator @'{rootUri}'"); var locator = await nodeLocatorBuilder.BuildNodeLocator(rootUri); Debug.Assert(locator != null, "Unable to build root Node locator"); Debug.Print($"Create root Node instance @'{rootUri}'"); var node = await nodeFactory(rootUri, locator); Debug.Assert(node != null, "Unable to create root Node instance"); Debug.Unindent(); return node; }
public Func<NodeUri, INodeLocator, Task<INode>> LoadNodeFactory(INodeLocatorRegistry registry, NodeConfigurationData configuration) { Debug.Indent(); Debug.Assert(configuration != null, "Node configuration is NULL"); Debug.Print("Load Node Factory Descriptor"); var descriptor = LoadDescriptor(configuration); Debug.Assert(descriptor != null, "Unknown or invalid Node descriptor"); Debug.Print("Load child Node Factories"); var childTasks = new Dictionary<string, Task<INodeLocatorRegistry>>(); int childNodeAutoId = 0; foreach (var nodeConfiguration in configuration.Nodes) { childNodeAutoId++; var config = nodeConfiguration; var id = config.Id ?? childNodeAutoId.ToString("D2"); if (childTasks.ContainsKey(id)) { id = $"{id}-{childNodeAutoId}"; } Debug.Print("Load Node at '{0}'", id); childTasks[id] = Task.Run(() => { Debug.Print("Create Node Locator Builder for child node '{0}'", id); var childNodeLocatorRegistry = registry.CreateChildRegistry(id); Debug.Print("Load Node Factory for child node '{0}'", id); var childNodeFactory = LoadNodeFactory(childNodeLocatorRegistry, config); Debug.Print("Rregister child Node Factory '{0}'", id); registry.RegisterNodeFactory(id, async (uri, locator) => await childNodeFactory(uri, locator)); return childNodeLocatorRegistry; }); } var nodeFactory = descriptor.CreateNodeFactory(registry, configuration); var task = new Func<NodeUri, INodeLocator, Task<INode>>(async (uri, locator) => { Debug.Indent(); Debug.Print("Wait for all child Node Factories of '{0}' to finish initialization", uri); await Task.WhenAll(childTasks.Values); Debug.Print("Create Node instance at '{0}'", uri); var node = await nodeFactory(uri, locator); Debug.Unindent(); return node; }); Debug.Unindent(); return task; }
public override INodeFactoryDescriptor LoadNodeFactoryDescriptor(NodeConfigurationData configuration) { return (INodeFactoryDescriptor)_runtime.CreateObject(configuration.GetValue<string>(AttributeName)); }
public abstract INodeFactoryDescriptor LoadNodeFactoryDescriptor(NodeConfigurationData configuration);