コード例 #1
0
        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);
        }
コード例 #2
0
 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);
     });
 }
コード例 #3
0
        public TransactionalEventContext GetTransactionCtx(dynamic container)
        {
            TransactionalEventContext ctx = container.Context as TransactionalEventContext;

            if (ctx == null)
            {
                throw new Exception("Context should be Transactional");
            }

            return(ctx);
        }
コード例 #4
0
        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);
                }
            });
        }
コード例 #5
0
        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;
                    }
                }
            });
        }