Exemple #1
0
        protected override void SetHandlingKernel(
            IKernelCommand command,
            KernelInvocationContext context)
        {
            if (context.HandlingKernel == null)
            {
                {
                    switch (_childKernels.Count)
                    {
                    case 0:
                        context.HandlingKernel = this;
                        break;

                    case 1:
                        context.HandlingKernel = _childKernels[0];
                        break;

                    default:
                        if (command is SubmitCode submitCode &&
                            ChildKernels.SingleOrDefault(k => k.Name == submitCode.TargetKernelName) is {} targetKernel)
                        {
                            context.HandlingKernel = targetKernel;
                        }
                        else if (DefaultKernelName != null)
                        {
                            context.HandlingKernel = ChildKernels.SingleOrDefault(k => k.Name == DefaultKernelName);
                        }

                        break;
                    }
Exemple #2
0
        protected override void SetHandlingKernel(
            IKernelCommand command,
            KernelInvocationContext context)
        {
            var targetKernelName = (command as KernelCommandBase)?.TargetKernelName
                                   ?? DefaultKernelName;

            if (context.HandlingKernel == null || context.HandlingKernel.Name != targetKernelName)
            {
                if (targetKernelName != null)
                {
                    context.HandlingKernel = targetKernelName == Name
                        ? this
                        : ChildKernels.FirstOrDefault(k => k.Name == targetKernelName)
                                             ?? throw new NoSuitableKernelException();
                }
                else
                {
                    context.HandlingKernel = _childKernels.Count switch
                    {
                        0 => this,
                        1 => _childKernels[0],
                        _ => context.HandlingKernel
                    };
                }
            }
        }
        public void Add(IKernel kernel)
        {
            if (kernel == null)
            {
                throw new ArgumentNullException(nameof(kernel));
            }

            if (ChildKernels.Any(k => k.Name == kernel.Name))
            {
                throw new ArgumentException($"Kernel \"{kernel.Name}\" already registered", nameof(kernel));
            }

            _childKernels.Add(kernel);

            var chooseKernelCommand = new Command($"%%{kernel.Name}");

            chooseKernelCommand.Handler =
                CommandHandler.Create <KernelInvocationContext>(context =>
            {
                context.HandlingKernel = kernel;
            });

            AddDirective(chooseKernelCommand);

            RegisterForDisposal(kernel.KernelEvents.Subscribe(PublishEvent));

            RegisterForDisposal(kernel);
        }
Exemple #4
0
        public void Add(IKernel kernel)
        {
            if (kernel == null)
            {
                throw new ArgumentNullException(nameof(kernel));
            }

            if (ChildKernels.Any(k => k.Name == kernel.Name))
            {
                throw new ArgumentException($"Kernel \"{kernel.Name}\" already registered", nameof(kernel));
            }

            _childKernels.Add(kernel);

            if (kernel is KernelBase kernelBase)
            {
                kernelBase.Pipeline.AddMiddleware(async(command, context, next) =>
                {
                    await next(command, context);
                    while (_packages.TryDequeue(out var packageAdded))
                    {
                        var loadExtensionsInDirectory =
                            new LoadExtensionsInDirectory(packageAdded.PackageReference.PackageRoot, Name);
                        await this.SendAsync(loadExtensionsInDirectory);
                    }
                });
            }

            var chooseKernelCommand = new Command($"%%{kernel.Name}")
            {
                Handler = CommandHandler.Create <KernelInvocationContext>(
                    context => { context.HandlingKernel = kernel; })
            };

            AddDirective(chooseKernelCommand);
            RegisterForDisposal(kernel.KernelEvents.Subscribe(PublishEvent));
            RegisterForDisposal(kernel);
        }