private void UpdateEvSource(JToken edm, dynamic container, TransactionalEventContext context, string eventActionToSend) { var result = container.DeltaUpdate(edm); container.UpdateAdditionalSources(context.TransactionId); FireEvents(edm, result, eventActionToSend, context.Event.EventPath, container); }
public void AddToServiceContainer(dynamic container) { container.ProcessIncomingMessage = new Action(() => { TransactionalEventContext context = this.transactionalService.GetTransactionCtx(container); var eventMessage = context.Event; this.eventDispatcher.ProcessIncomingMessage(eventMessage, StaticCorrelationTypes.Api); }); }
public TransactionalEventContext GetTransactionCtx(dynamic container) { TransactionalEventContext ctx = container.Context as TransactionalEventContext; if (ctx == null) { throw new Exception("Context should be Transactional"); } return(ctx); }
public void AddToServiceContainer(dynamic container) { container.Query = new Func <SingleQuery, IList <JObject> >((singleQuery) => { using (new StopwatchLog(Metrics.Query)) { var transactions = this.transactionSlaveRepository.GetTransactions((string)container.Context.AgentIdentity, singleQuery); return(transactions); } }); container.Get = new Func <SingleQuery, JToken>((filterQuery) => { using (new StopwatchLog(Metrics.Get)) { var ctx = this.transactionalService.GetTransactionCtx(container); // Get transaction from event source JToken transaction = this.transactionalService.GetSingle(container, (string)container.Context.AgentIdentity, ctx.TransactionId); IList <JToken> result = JsonLinqExecutor.GetExecutor.Run(new[] { filterQuery }, transaction, (ExpandoObject)container); return(result.Any() ? result.First() : null); } }); container.DeltaUpdate = new Func <JToken, JToken>(edm => { TransactionalEventContext ctx = this.transactionalService.GetTransactionCtx(container); using (new StopwatchLog(Metrics.DeltaUpdate)) { //NOTE:TODO: Generate ids? var operation = edm.FindOperations().First(); this.infraService.AddModifyByObj(operation, ctx); this.evSourceService.AddEvent((string)container.Context.AgentIdentity, edm, ctx.TransactionId); return(edm); } }); }
public void AddToServiceContainer(dynamic container) { container.ProcessEdm = new Action <JToken>(edm => { using (new StopwatchLog(Metrics.ProcessEdm)) { TransactionalEventContext context = this.transactionalService.GetTransactionCtx(container); EventAction?currentAction = null; string eventActionName = string.Empty; var modelName = edm.GetEdmMainPropName(); var modelInfo = this.storageProvider.GetModelElementTree(modelName); if (EventHandlerDefinitions.StandardActionsStrings.ContainsKey(context.Event.EventAction)) { currentAction = EventHandlerDefinitions.StandardActionsStrings[context.Event.EventAction]; eventActionName = EventHandlerDefinitions.StandardActionsNames[currentAction.Value][1]; } else { var current = GetCurrentElementInfo(context.Event.EventPath, modelInfo); var customAction = current.CustomActions.First(x => x.ActionName == context.Event.EventAction); currentAction = customAction.ActionType; eventActionName = customAction.ActionNamePast; } switch (currentAction) { case EventAction.Initiate: var m = new JObject { [context.Event.EventPath] = GetTransactionalOperations(edm) }; var res = container.Create(modelInfo, m); container.UpdateAdditionalSources(ObjectHelper.GetId(res)); container.FireEvent(context.Event.EventPath, eventActionName, string.Empty, res); context.Data = res; break; case EventAction.Set: UpdateEvSource(edm, container, context, eventActionName); context.Data = edm; break; case EventAction.Delete: UpdateEvSource(edm, container, context, eventActionName); context.Data = edm; break; case EventAction.Add: var operation = GetTransactionalOperations(edm); var initItem = this.modelHelper.Init(modelInfo, context.Event.EventPath); foreach (var child in initItem.Children <JProperty>()) { operation[child.Name] = child.Value; } UpdateEvSource(edm, container, context, eventActionName); context.Data = edm; break; case EventAction.Get: var obj = container.Get((new EDMObjectParser().Parse(edm as JObject)).AddMethod(QueryMethodType.Get)); container.FireEvent(context.Event.EventPath, eventActionName, string.Empty, obj); context.Data = obj; break; case EventAction.Query: //TODO:NOTE: Here we need to get single query from EDM. var objs = container.Query(new FilterParser().Parse(edm as JObject)); container.FireEvent(context.Event.EventPath, eventActionName, string.Empty, objs); context.Data = new JArray((IList <JObject>)objs); break; default: break; } } }); }