Exemple #1
0
        public void CanLoadFromCacheUsingChildActivitiesId()
        {
            var expiration  = new ExpirationStrategyMock();
            var planId      = new Guid(1, (short)0, (short)0, (byte)0, (byte)0, (byte)0, (byte)0, (byte)0, (byte)0, (byte)0, (byte)0);
            int calledTimes = 0;

            var plan = LoadPlan(planId);

            Func <Guid, PlanNodeDO> cacheMiss = x =>
            {
                calledTimes++;
                return(plan);
            };

            var cache = new PlanCache(expiration);

            var plan1 = cache.Get(new Guid(2, (short)0, (short)0, (byte)0, (byte)0, (byte)0, (byte)0, (byte)0, (byte)0, (byte)0, (byte)0), cacheMiss);

            Assert.IsTrue(AreEquals(plan1, plan));

            foreach (var id in PlanTreeHelper.Linearize(plan).Select(x => x.Id))
            {
                Assert.IsTrue(AreEquals(plan, cache.Get(id, cacheMiss)));
            }

            Assert.AreEqual(1, calledTimes);
        }
Exemple #2
0
        public async Task <PayloadDTO> Run(IUnitOfWork uow, ActivityDO curActivityDO, ActivityExecutionMode curActionExecutionMode, ContainerDO curContainerDO)
        {
            if (PlanTreeHelper.Linearize(_planNodes[curActivityDO.Id]).OfType <ActivityDO>().Any(x => x.Id == curActivityDO.Id))
            {
                Processed++;
            }

            await Task.Delay(1);

            return(await _activity.Run(uow, curActivityDO, curActionExecutionMode, curContainerDO));
        }
Exemple #3
0
        public PersistentPlanStorage(PlanNodeDO root)
        {
            if (root == null)
            {
                return;
            }

            foreach (var node in PlanTreeHelper.Linearize(root))
            {
                _storage[node.Id] = node;
            }
        }
Exemple #4
0
 public List <PlanNodeDO> GetDescendants()
 {
     return(PlanTreeHelper.Linearize(this));
 }
        private void SaveAndUpdateActivity(IUnitOfWork uow, ActivityDO submittedActiviy)
        {
            var isNewActivity = false;

            PlanTreeHelper.Visit(submittedActiviy, x =>
            {
                if (x.Id == Guid.Empty)
                {
                    if (Object.ReferenceEquals(x, submittedActiviy))
                    {
                        isNewActivity = true;
                    }
                    x.Id = Guid.NewGuid();
                }
                var activityDO = x as ActivityDO;
                if (activityDO != null && activityDO.ActivityTemplateId == Guid.Empty)
                {
                    var activityTemplate        = activityDO.ActivityTemplate;
                    activityDO.ActivityTemplate = uow
                                                  .ActivityTemplateRepository
                                                  .GetQuery()
                                                  .Single(y => y.Name == activityTemplate.Name &&
                                                          y.Version == activityTemplate.Version &&
                                                          y.Terminal.Name == activityTemplate.Terminal.Name &&
                                                          y.Terminal.Version == activityTemplate.Terminal.Version);
                    activityDO.ActivityTemplateId = activityDO.ActivityTemplate.Id;
                }
            });

            PlanNodeDO plan;
            PlanNodeDO originalAction;

            if (submittedActiviy.ParentPlanNodeId != null)
            {
                plan = uow.PlanRepository.Reload <PlanNodeDO>(submittedActiviy.ParentPlanNodeId);
                if (plan == null)
                {
                    throw new MissingObjectException($"Parent plan with Id {submittedActiviy.ParentPlanNodeId} doesn't exist");
                }
                originalAction = plan.ChildNodes.FirstOrDefault(x => x.Id == submittedActiviy.Id);

                //This might mean that this plan's parent was changed
                if (originalAction == null && !isNewActivity)
                {
                    originalAction = uow.PlanRepository.GetById <PlanNodeDO>(submittedActiviy.Id);
                    if (originalAction != null)
                    {
                        var originalActionsParent = uow.PlanRepository.Reload <PlanNodeDO>(originalAction.ParentPlanNodeId);
                        originalActionsParent.ChildNodes.Remove(originalAction);
                        originalAction.ParentPlanNodeId = plan.Id;
                    }
                }
            }
            else
            {
                originalAction = uow.PlanRepository.Reload <PlanNodeDO>(submittedActiviy.Id);
                plan           = originalAction.ParentPlanNode;
            }

            if (originalAction != null)
            {
                plan.ChildNodes.Remove(originalAction);

                // Add child subplans.
                foreach (var subPlan in originalAction.ChildNodes.OfType <SubplanDO>())
                {
                    submittedActiviy.ChildNodes.Add(subPlan);
                }

                var originalActions = PlanTreeHelper.Linearize(originalAction)
                                      .OfType <ActivityDO>()
                                      .ToDictionary(x => x.Id, x => x);

                foreach (var submitted in PlanTreeHelper.Linearize(submittedActiviy))
                {
                    ActivityDO existingActivity;

                    if (originalActions.TryGetValue(submitted.Id, out existingActivity))
                    {
                        RestoreSystemProperties(existingActivity, (ActivityDO)submitted);
                    }
                }
            }

            if (submittedActiviy.Ordering <= 0)
            {
                plan.AddChildWithDefaultOrdering(submittedActiviy);
            }
            else
            {
                plan.ChildNodes.Add(submittedActiviy);
            }
        }