コード例 #1
0
ファイル: HttpFeature.cs プロジェクト: randommuses/jasper
 public Task Activate(JasperRuntime runtime, IGenerationConfig generation)
 {
     return(Task.Factory.StartNew(() =>
     {
         Routes.BuildRoutingTree(generation, runtime.Container);
     }));
 }
コード例 #2
0
        Task IFeature.Activate(JasperRuntime runtime, IGenerationConfig generation)
        {
            return(Task.Factory.StartNew(() =>
            {
                // TODO -- will need to be smart enough to do the conglomerate
                // generation config of the base, with service bus specific stuff
                _graph.Compile(generation, runtime.Container);

                var transports = runtime.Container.GetAllInstances <ITransport>().ToArray();

                Channels.UseTransports(transports);

                configureSerializationOrder(runtime);

                // TODO
                // Done -- 1. Start up transports
                // 2. Start up subscriptions when ready

                var pipeline = runtime.Container.GetInstance <IHandlerPipeline>();

                // TODO -- might parallelize this later
                foreach (var transport in transports)
                {
                    transport.Start(pipeline, Channels);

                    Channels
                    .Where(x => x.Uri.Scheme == transport.Protocol && x.Sender == null)
                    .Each(x =>
                    {
                        x.Sender = new NulloSender(transport, x.Uri);
                    });
                }
            }));
        }
コード例 #3
0
ファイル: HandlerChain.cs プロジェクト: randommuses/jasper
        public IGenerationModel ToGenerationModel(IGenerationConfig config)
        {
            if (!Handlers.Any())
            {
                throw new InvalidOperationException("No method handlers configured for message type " + MessageType.FullName);
            }

            var configureMethods = Handlers.Select(x => x.HandlerType).Distinct()
                                   .Select(x => x.GetTypeInfo().GetMethod("Configure",
                                                                          new Type[] { typeof(HandlerChain) }));

            foreach (var method in configureMethods)
            {
                method?.Invoke(null, new object[] { this });
            }

            foreach (var methodCall in Handlers.ToArray())
            {
                methodCall.Method.ForAttribute <ModifyHandlerChainAttribute>(att => att.Modify(this));
            }

            foreach (var handlerType in Handlers.Select(x => x.HandlerType).Distinct().ToArray())
            {
                handlerType.ForAttribute <ModifyHandlerChainAttribute>(att => att.Modify(this));
            }

            var i = 0;
            var cascadingHandlers = Handlers.Where(x => x.ReturnVariable != null)
                                    .Select(x => new CaptureCascadingMessages(x.ReturnVariable, ++i));

            var frames = Wrappers.Concat(Handlers).Concat(cascadingHandlers).ToList();

            return(new MessageHandlerGenerationModel(TypeName, MessageType, config, frames));
        }
コード例 #4
0
ファイル: HandlerSet.cs プロジェクト: randommuses/jasper
        public Type[] CompileAll(IGenerationConfig generation)
        {
            var code = GenerateCode(generation);

            var generator = buildGenerator(generation);

            var assembly = generator.Generate(code);

            return(assembly.GetExportedTypes().ToArray());
        }
コード例 #5
0
ファイル: RouteGraph.cs プロジェクト: randommuses/jasper
        public void BuildRoutingTree(IGenerationConfig generation, IContainer container)
        {
            var handlers = CompileAndBuildAll(generation, container);

            foreach (var handler in handlers)
            {
                var route = handler.Chain.Route;
                route.Handler = handler;
                Router.Add(route);
            }
        }
コード例 #6
0
ファイル: RouteChain.cs プロジェクト: randommuses/jasper
        public IGenerationModel ToGenerationModel(IGenerationConfig config)
        {
            // TODO -- apply conneg policies here
            // TODO -- look for attributes
            // TODO -- add extra frames
            // TODO -- return the Route generation model
            var frames = new List <Frame>();

            frames.Add(Action);


            return(new RouteHandlerGenerationModel(TypeName, config, frames));
        }
コード例 #7
0
ファイル: HandlerGraph.cs プロジェクト: randommuses/jasper
        internal void Compile(IGenerationConfig generation, IContainer container)
        {
            if (!_hasGrouped)
            {
                Group();
            }

            var handlers = CompileAndBuildAll(generation, container);

            foreach (var handler in handlers)
            {
                _handlers.Add(handler.Chain.MessageType, handler);
            }
        }
コード例 #8
0
ファイル: HandlerSet.cs プロジェクト: randommuses/jasper
        private AssemblyGenerator buildGenerator(IGenerationConfig generation)
        {
            // TODO -- should probably do a lot more here. See GH-6
            var generator = new AssemblyGenerator();

            generator.ReferenceAssembly(GetType().GetTypeInfo().Assembly);
            generator.ReferenceAssembly(typeof(Task).GetTypeInfo().Assembly);

            foreach (var assembly in generation.Assemblies)
            {
                generator.ReferenceAssembly(assembly);
            }

            return(generator);
        }
コード例 #9
0
ファイル: HandlerSet.cs プロジェクト: randommuses/jasper
        public string GenerateCode(IGenerationConfig generation)
        {
            beforeGeneratingCode();

            var writer = new SourceWriter();

            writer.UsingNamespace <Task>();
            writer.BlankLine();

            writer.Namespace(generation.ApplicationNamespace);

            foreach (var chain in chains)
            {
                var generationModel = chain.ToGenerationModel(generation);


                // TODO -- figure out how to get the source code for each handler
                writer.WriteLine($"// START: {chain.TypeName}");

                HandlerSourceWriter.Write(generationModel, writer);
                writer.WriteLine($"// END: {chain.TypeName}");

                writer.WriteLine("");
                writer.WriteLine("");
            }

            writer.FinishBlock();


            var code = writer.Code();

            attachSourceCodeToChains(code);


            return(code);
        }
コード例 #10
0
ファイル: GenerationModel.cs プロジェクト: randommuses/jasper
        protected GenerationModel(string className, string inputName, IVariableSource specific, IGenerationConfig config, IList <Frame> frames)
        {
            if (!frames.Any())
            {
                throw new ArgumentOutOfRangeException(nameof(frames), "Cannot be an empty list");
            }

            var handlerType = typeof(T).FindInterfaceThatCloses(typeof(IHandler <>));

            if (handlerType == null)
            {
                throw new ArgumentOutOfRangeException(nameof(T), $"Type {typeof(T).FullName} does not implement IHandler<T>");
            }

            ClassName = className;
            Config    = config;
            Frames    = frames;
            _specific = specific;

            var inputType = handlerType.GetGenericArguments().Single();

            InputVariable = new Variable(inputType, inputName);

            var compiled = compileFrames(frames);

            if (compiled.All(x => !x.IsAsync))
            {
                AsyncMode = AsyncMode.ReturnCompletedTask;
            }
            else if (compiled.Count(x => x.IsAsync) == 1 && compiled.Last().IsAsync&& compiled.Last().CanReturnTask())
            {
                AsyncMode = compiled.Any(x => x.Wraps) ? AsyncMode.AsyncTask : AsyncMode.ReturnFromLastNode;
            }

            Top = chainFrames(compiled);
        }
コード例 #11
0
 public RouteHandlerGenerationModel(string className, IGenerationConfig config, IList <Frame> frames)
     : base(className, RouteGraph.Context, new ContextVariableSource(), config, frames)
 {
 }
コード例 #12
0
ファイル: HandlerSet.cs プロジェクト: randommuses/jasper
        public THandler[] CompileAndBuildAll(IGenerationConfig generation, IContainer container)
        {
            var types = CompileAll(generation);

            return(chains.Select(x => x.Create(types, container)).ToArray());
        }
コード例 #13
0
 public HomogeneousTreeStrategy()
 {
     genCfg = new HomogeneousTreeConfig();
 }
コード例 #14
0
 public MessageHandlerGenerationModel(string className, Type messageType, IGenerationConfig config, IList <Frame> frames)
     : base(className, HandlerGraph.Context, new MessageHandlerVariableSource(messageType), config, frames)
 {
 }
コード例 #15
0
 public Task Activate(JasperRuntime runtime, IGenerationConfig generation)
 {
     Runtime      = runtime;
     WasActivated = true;
     return(Task.CompletedTask);
 }
コード例 #16
0
ファイル: SeparableTreeStrategy.cs プロジェクト: snxxy/DiffEq
 public SeparableTreeStrategy()
 {
     genCfg = new SeparableTreeConfig();
 }