/// <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<T>())</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)); }
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); }
public DaisyExecution(DaisyAst ast, DaisyMode mode) { Attachments = new ContextBundle(); DebugInfo = new ExecutionDebugInfo(ast,mode); }
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(); }
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(); }