Esempio n. 1
0
        /// <summary>
        /// Creates an instance of <see cref="IBoilerplateContext"/>
        /// </summary>
        /// <param name="identity">The current identity being used (rights and roles contract requirements/restrictions will apply to this identity)</param>
        /// <param name="accessProvider">An access provider for specific types (available through IBoilerplateContext.Open&lt;T&gt;())</param>
        /// <param name="permissionsProvider">The provider that will be used for all permissions verification attempts</param>
        /// <param name="visibility">The visibility level that this context has. This will affect operations that rely on visibility (e.g. logging).</param>
        /// <returns>An instance of <see cref="IBoilerplateContext"/></returns>
        public static IBoilerplateContext New(IIdentity identity = null,
                                              ITypeAccessProvider accessProvider       = null,
                                              IPermissionsProvider permissionsProvider = null,
                                              Visibility visibility = Visibility.None)
        {
            var actualIdentity            = identity ?? Identity.Default;
            var actualTypeAccessProvider  = accessProvider ?? TypeAccessProvider.Empty;
            var actualPermissionsProvider = permissionsProvider ?? PermissionsProvider.Default;

            var functionGenerator = new FunctionGenerator();

            //Core providers
            var translationProvider = new TranslationProvider(functionGenerator);
            var validationProvider  = new ValidationProvider(functionGenerator);
            var logProvider         = new LogProvider(functionGenerator, visibility);

            //Set up error handling
            var tryCatchProvider         = new TryCatchBlockProvider(functionGenerator);
            var exceptionHandlerProvider = new ExceptionHandlerProvider(logProvider);
            var errorContext             = new ImmutableErrorContext(logProvider, tryCatchProvider, exceptionHandlerProvider);

            var bundle = new ContextBundle(permissionsProvider: actualPermissionsProvider,
                                           errorContext: errorContext,
                                           translationProvider: translationProvider,
                                           accessProvider: actualTypeAccessProvider,
                                           validationProvider: validationProvider,
                                           logProvider: logProvider,
                                           visibility: visibility);

            return(new InitialBoilerplateContext <ContractContext>(bundle, actualIdentity));
        }
Esempio n. 2
0
        public static InvokationResult Invoke <T>(Type controller, string methodName, T scope,
                                                  string statement, ContextBundle context = null, Func <object, bool> proceed = null)
        {
            if (proceed == null)
            {
                proceed = o => false;
            }
            context = context ?? new ContextBundle();
            var method           = GetMethod(controller, methodName);
            var statementHandler = new ReflectionStatementDefinition(method, controller);
            var invokationResult = new InvokationResult()
            {
                Context          = context,
                Statement        = statement,
                MatchingCriteria = statementHandler.GetMatchingCriteria(),
                Attachments      = new ContextBundle()
            };

            invokationResult.Match = statementHandler.Matches(new MatchingContext()
            {
                Statement = statement,
                ScopeType = typeof(T)
            });
            if (!invokationResult.Matched)
            {
                return(invokationResult);
            }
            var link = statementHandler.Link(statement);

            if (link == null)
            {
                throw new Exception("If matched, should have linked, but didn't");
            }
            invokationResult.Result = link.Execute(new InvokationContext()
            {
                Context     = invokationResult.Context,
                Attachments = invokationResult.Attachments,
                Scope       = scope,
                Proceed     = proceed
            });
            return(invokationResult);
        }
        public void ItDoesNotReUseControllers()
        {
            var load   = new ReflectionStatementDefinition(GetMethod("R8"), typeof(TestStatements));
            var linked = load.Link("R8");
            var att1   = new ContextBundle();
            var att2   = new ContextBundle();

            linked.Execute(new InvokationContext()
            {
                Scope       = 9,
                Attachments = att1
            });

            linked.Execute(new InvokationContext()
            {
                Scope       = 9,
                Attachments = att2
            });

            var ctr1 = att1.Get <TestStatements>("controller");
            var ctr2 = att2.Get <TestStatements>("controller");

            Assert.AreNotSame(ctr1, ctr2);
        }
Esempio n. 4
0
 public DaisyExecution(DaisyAst ast, DaisyMode mode)
 {
     Attachments = new ContextBundle();
     DebugInfo = new ExecutionDebugInfo(ast,mode);
 }
Esempio n. 5
0
        static void Main(string[] args)
        {
            var iterations = 5000000;
            var code = Tests.Daisy.Component.Statements.UserHasNoRecentTransactions;
            var stopwatch = new Stopwatch();

            var statements = new StatementSet()
              .Add(new HasAccountSilverBulletStatement())
              .Add(new HasTransactionSilverBulletStatement())
              .Add(new IsActiveSilverBulletStatement())
              .Add(new TimestampBeforeSilverBulletStatement())
              ;

            var pgrm = DaisyCompiler.Compile<User>(code, statements);
            Console.WriteLine("Setup: " + stopwatch.ElapsedMilliseconds);

            stopwatch = new Stopwatch();
            Console.WriteLine("Running Daisy with silver bullet...");
            stopwatch.Start();

            for(int i=0; i<iterations; ++i)
            {
                pgrm.Execute(Tests.Daisy.Component.TestData.Ben);
            }

            stopwatch.Stop();
            Console.WriteLine("Elapsed: " + stopwatch.ElapsedMilliseconds);
            Console.WriteLine("Per execution: " + ((double)stopwatch.ElapsedMilliseconds)/iterations);

            statements = new StatementSet()
                .FromController(typeof(UserController))
                .FromController(typeof(TransactionController))
                .FromController(typeof(AccountController))
                ;
            pgrm = DaisyCompiler.Compile<User>(code, statements);
            Console.WriteLine("Running Daisy with reflection...");
            GC.Collect();
            GC.WaitForFullGCComplete();

            stopwatch = new Stopwatch();
            stopwatch.Start();

            for(int i=0; i<iterations; ++i)
            {
                pgrm.Execute(Tests.Daisy.Component.TestData.Ben);
            }
            stopwatch.Stop();
            Console.WriteLine("Elapsed: " + stopwatch.ElapsedMilliseconds);
            Console.WriteLine("Per execution: " + ((double)stopwatch.ElapsedMilliseconds)/iterations);

            GC.Collect();
            GC.WaitForFullGCComplete();

            Console.WriteLine("Running raw iterations...");
            stopwatch = new Stopwatch();
            stopwatch.Start();

            for(int i=0; i<iterations; ++i)
            {
                var data = Tests.Daisy.Component.TestData.Ben;
                var result = data.IsActive
                    && !data.Accounts.Any(account =>
                        account.Transactions.Any(transaction =>
                            DateTime.Now.AddYears(-1) > transaction.Timestamp
                        )
                    );
            }
            stopwatch.Stop();
            Console.WriteLine("Elapsed: " + stopwatch.ElapsedMilliseconds);
            Console.WriteLine("Per execution: " + ((double)stopwatch.ElapsedMilliseconds)/iterations);

            Console.WriteLine("Running iterations from handlers...");
            stopwatch = new Stopwatch();
            stopwatch.Start();
            var context = new ContextBundle();
            var attachments = new ContextBundle();

            var tracer = new Tracer();
            for(int i=0; i<iterations; ++i)
            {
                var data = Tests.Daisy.Component.TestData.Ben;
                var result = new UserController() { Scope = data, Context = context, Attachments = attachments, Tracer = tracer}.IsActive()
                    && !new UserController() { Scope = data, Context = context, Attachments = attachments, Tracer = tracer}.HasAccount(account =>
                        new AccountController() { Scope = account, Context = context, Attachments = attachments, Tracer = tracer}.HasTransaction(
                        transaction =>
                            new TransactionController() { Scope = transaction, Context = context, Attachments = attachments, Tracer = tracer}.TimestampBeforeYearsAgo(1)
                        )
                    );
            }
            stopwatch.Stop();
            Console.WriteLine("Elapsed: " + stopwatch.ElapsedMilliseconds);
            Console.WriteLine("Per execution: " + ((double)stopwatch.ElapsedMilliseconds)/iterations);
            Console.ReadKey();
        }
Esempio n. 6
0
        static void Main(string[] args)
        {
            var iterations = 5000000;
            var code       = Tests.Daisy.Component.Statements.UserHasNoRecentTransactions;
            var stopwatch  = new Stopwatch();

            var statements = new StatementSet()
                             .Add(new HasAccountSilverBulletStatement())
                             .Add(new HasTransactionSilverBulletStatement())
                             .Add(new IsActiveSilverBulletStatement())
                             .Add(new TimestampBeforeSilverBulletStatement())
            ;

            var pgrm = DaisyCompiler.Compile <User>(code, statements);

            Console.WriteLine("Setup: " + stopwatch.ElapsedMilliseconds);

            stopwatch = new Stopwatch();
            Console.WriteLine("Running Daisy with silver bullet...");
            stopwatch.Start();

            for (int i = 0; i < iterations; ++i)
            {
                pgrm.Execute(Tests.Daisy.Component.TestData.Ben);
            }

            stopwatch.Stop();
            Console.WriteLine("Elapsed: " + stopwatch.ElapsedMilliseconds);
            Console.WriteLine("Per execution: " + ((double)stopwatch.ElapsedMilliseconds) / iterations);

            statements = new StatementSet()
                         .FromController(typeof(UserController))
                         .FromController(typeof(TransactionController))
                         .FromController(typeof(AccountController))
            ;
            pgrm = DaisyCompiler.Compile <User>(code, statements);
            Console.WriteLine("Running Daisy with reflection...");
            GC.Collect();
            GC.WaitForFullGCComplete();

            stopwatch = new Stopwatch();
            stopwatch.Start();

            for (int i = 0; i < iterations; ++i)
            {
                pgrm.Execute(Tests.Daisy.Component.TestData.Ben);
            }
            stopwatch.Stop();
            Console.WriteLine("Elapsed: " + stopwatch.ElapsedMilliseconds);
            Console.WriteLine("Per execution: " + ((double)stopwatch.ElapsedMilliseconds) / iterations);

            GC.Collect();
            GC.WaitForFullGCComplete();

            Console.WriteLine("Running raw iterations...");
            stopwatch = new Stopwatch();
            stopwatch.Start();

            for (int i = 0; i < iterations; ++i)
            {
                var data   = Tests.Daisy.Component.TestData.Ben;
                var result = data.IsActive &&
                             !data.Accounts.Any(account =>
                                                account.Transactions.Any(transaction =>
                                                                         DateTime.Now.AddYears(-1) > transaction.Timestamp
                                                                         )
                                                );
            }
            stopwatch.Stop();
            Console.WriteLine("Elapsed: " + stopwatch.ElapsedMilliseconds);
            Console.WriteLine("Per execution: " + ((double)stopwatch.ElapsedMilliseconds) / iterations);

            Console.WriteLine("Running iterations from handlers...");
            stopwatch = new Stopwatch();
            stopwatch.Start();
            var context     = new ContextBundle();
            var attachments = new ContextBundle();

            var tracer = new Tracer();

            for (int i = 0; i < iterations; ++i)
            {
                var data   = Tests.Daisy.Component.TestData.Ben;
                var result = new UserController()
                {
                    Scope = data, Context = context, Attachments = attachments, Tracer = tracer
                }.IsActive() &&
                !new UserController()
                {
                    Scope = data, Context = context, Attachments = attachments, Tracer = tracer
                }.HasAccount(account =>
                             new AccountController()
                {
                    Scope = account, Context = context, Attachments = attachments, Tracer = tracer
                }.HasTransaction(
                                 transaction =>
                                 new TransactionController()
                {
                    Scope = transaction, Context = context, Attachments = attachments, Tracer = tracer
                }.TimestampBeforeYearsAgo(1)
                                 )
                             );
            }
            stopwatch.Stop();
            Console.WriteLine("Elapsed: " + stopwatch.ElapsedMilliseconds);
            Console.WriteLine("Per execution: " + ((double)stopwatch.ElapsedMilliseconds) / iterations);
            Console.ReadKey();
        }