public void AddPolicy(bool isEnabled, bool isTypeSet, bool expectedAdded)
        {
            var policyCache = new ResourceTriggerFilterPolicyCache(new List <IFilteredTargetHandlerFactory>());

            ResourceTriggerFilterDef policy = CreateDummyPolicy();

            policy.TriggerEnabled = isEnabled;

            if (!isTypeSet)
            {
                policy.TriggeredOnType = null;
            }

            policyCache.UpdateOrAddPolicy(policy);

            if (expectedAdded)
            {
                Assert.That(policyCache.PolicyToFieldsMap.ContainsKey(policy.Id), Is.True);
                Assert.That(policyCache.TypePolicyMap.ContainsKey(policy.TriggeredOnType.Id), Is.True);
            }
            else
            {
                Assert.That(policyCache.PolicyToFieldsMap, Is.Empty);
                Assert.That(policyCache.TypePolicyMap, Is.Empty);
            }
        }
        /// <summary>
        /// Confirm that the workflow should trigger, if so trigger it
        /// </summary>
        /// <param name="policy"></param>
        /// <param name="entity"></param>
        /// <param name="isNew"></param>
        private void TestAndTrigger(ResourceTriggerFilterDef policy, IEntity entity, bool isNew)
        {
            using (new SecurityBypassContext())
            {
                if (WorkflowRunContext.Current.DisableTriggers)
                {
                    return;
                }

                var updateTrigger = policy.Cast <WfTriggerUserUpdatesResource>();

                var triggeredOnCreate = updateTrigger.TriggeringCondition_Enum == TriggeredOnEnum_Enumeration.TriggeredOnEnumCreate;
                var triggeredOnUpdate = updateTrigger.TriggeringCondition_Enum == TriggeredOnEnum_Enumeration.TriggeredOnEnumUpdate;
                var triggeredOnEither = updateTrigger.TriggeringCondition_Enum == TriggeredOnEnum_Enumeration.TriggeredOnEnumCreateUpdate;


                if (triggeredOnEither || (isNew && triggeredOnCreate) || (!isNew && triggeredOnUpdate))
                {
                    if (Factory.FeatureSwitch.Get("longRunningWorkflow"))
                    {
                        Trigger_New(updateTrigger, entity, policy.RtfdRunInForeground == true);
                    }
                    else
                    {
                        Trigger_Old(updateTrigger, entity, policy.RtfdRunInForeground == true);
                    }
                }
            }
        }
        /// <summary>
        /// Update the cache for the given policy
        /// </summary>
        /// <param name="policy"></param>
        public void UpdateOrAddPolicy(ResourceTriggerFilterDef policy)
        {
            using (Profiler.Measure("ResourceTriggerFilterPolicyCache UpdateOrAddPolicy"))
            {
                RemovePolicy(policy.Id);

                if (policy.TriggerEnabled == true && policy.TriggeredOnType != null)
                {
                    var allFieldRelIds = new HashSet <long>(policy.UpdatedFieldsToTriggerOn.Select(f => f.Id).Union(policy.UpdatedRelationshipsToTriggerOn.Select(r => r.Id)));
                    _policyToFieldsMap.Add(policy.Id, allFieldRelIds);

                    var handler = _policyTypeHandlerMap[policy.TypeIds.First()];

                    var targetTypes = policy.TriggeredOnType.GetDescendantsAndSelf();
                    foreach (var targetType in targetTypes)
                    {
                        List <ResourceTriggerFilterDef> syncDefList;
                        if (!_typePolicyMap.TryGetValue(targetType.Id, out syncDefList))
                        {
                            syncDefList = new List <ResourceTriggerFilterDef>();
                            _typePolicyMap.Add(targetType.Id, syncDefList);
                        }

                        syncDefList.Add(policy);
                    }
                }
            }
        }
Exemple #4
0
        /// <summary>
        /// Add a textural record of all of the changes to the entity into the provided string builder
        /// </summary>
        void AddChanges(RecordChangeAuditFormatter formatter, ResourceTriggerFilterDef policy, bool isNew, IEntity entity, IEntity originalEntity, IEnumerable <long> changedFields, IEnumerable <long> changedForwardRels, IEnumerable <long> changedReverseRels)
        {
            var allChanges = changedFields.Union(changedForwardRels).Union(changedReverseRels);

            formatter.IsCreate = isNew;

            AddChangedFields(formatter, originalEntity, entity, changedFields);
            AddAllChangedRelationships(formatter, originalEntity, entity, changedForwardRels, changedReverseRels);
        }
Exemple #5
0
        bool IFilteredSaveEventHandler.OnBeforeDelete(ResourceTriggerFilterDef policy, IEntity entity)
        {
            using (new SecurityBypassContext())
            {
                RecordChanges(entity, (formatter) =>
                {
                    formatter.IsDelete = true;
                });

                return(false);
            }
        }
        public void CacheCleanedWhenPolicyRemoved()
        {
            ResourceTriggerFilterDef policy = CreateDummyPolicy();

            var policyCache = new ResourceTriggerFilterPolicyCache(new List <IFilteredTargetHandlerFactory>());

            policyCache.UpdateOrAddPolicy(policy);
            policyCache.RemovePolicy(policy.Id);

            Assert.That(policyCache.PolicyToFieldsMap.ContainsKey(policy.Id), Is.False);

            var policies = policyCache.TypePolicyMap[policy.TriggeredOnType.Id];

            Assert.That(policies.FirstOrDefault(p => p.Id == policy.Id), Is.Null);
        }
Exemple #7
0
        public bool OnBeforeSave(ResourceTriggerFilterDef policy, IEntity entity, bool isNew, IEnumerable <long> changedFields, IEnumerable <long> changedForwardRels, IEnumerable <long> changedReverseRels)
        {
            using (new SecurityBypassContext())
            {
                var changedWatchedFields      = changedFields.Intersect(policy.UpdatedFieldsToTriggerOn.Select(f => f.Id)).Except(IgnoredFields());
                var changedWatchedForwardRels = changedForwardRels.Intersect(policy.UpdatedRelationshipsToTriggerOn.Select(f => f.Id)).Except(IgnoredRels());
                var changedWatchedReverseRels = changedReverseRels.Intersect(policy.UpdatedRelationshipsToTriggerOn.Select(f => f.Id)).Except(IgnoredRels());

                var originalEntity = isNew ? null : GetOriginalEntity(entity, changedWatchedFields, changedWatchedForwardRels, changedWatchedReverseRels);

                RecordChanges(entity, (formatter) =>
                {
                    AddChanges(formatter, policy, isNew, entity, originalEntity, changedWatchedFields, changedWatchedForwardRels, changedWatchedReverseRels);
                });

                return(false);
            }
        }
Exemple #8
0
        bool IFilteredSaveEventHandler.OnBeforeReverseRemove(ResourceTriggerFilterDef policy, long relationshipId, Direction direction, IEntity policyEntity, IEntity otherEntity)
        {
            using (new SecurityBypassContext())
            {
                RecordChanges(policyEntity, (formatter) =>
                {
                    var rel = Entity.Get <Relationship>(relationshipId);

                    if (rel.IsLookup(direction))
                    {
                        formatter.AddChangedLookup(rel.DisplayName(direction), otherEntity, null);
                    }
                    else
                    {
                        formatter.AddChangedRelationship(rel.DisplayName(direction), otherEntity.Id.ToEnumerable <long>(), Enumerable.Empty <long>(), -1); //TODO: Fix count
                    }
                });

                return(false);
            }
        }
 public void OnAfterReverseRemove(ResourceTriggerFilterDef policy, long relationshipId, Direction direction, IEntity otherEntity, IEntity entity)
 {
     AfterReverseRemoveCount++;
 }
 bool IFilteredSaveEventHandler.OnBeforeReverseRemove(ResourceTriggerFilterDef policy, long relationshipId, Direction direction, IEntity policyEntity, IEntity otherEntity)
 {
     return(false);
 }
 public void OnAfterReverseAdd(ResourceTriggerFilterDef policy, long relationshipId, Direction direction, IEntity otherEntity, IEntity entity, bool isNew)
 {
     AfterReverseAddCount++;
 }
 public void OnAfterSave(ResourceTriggerFilterDef policy, IEntity entity, bool isNew, IEnumerable <long> changedFields, IEnumerable <long> changedForwardRels, IEnumerable <long> changedReverseRels)
 {
     AfterSaveCount++;
 }
Exemple #13
0
 void IFilteredSaveEventHandler.OnAfterDelete(ResourceTriggerFilterDef policy, IEntity entity)
 {
     // do nothing
 }
 void IFilteredSaveEventHandler.OnAfterReverseRemove(ResourceTriggerFilterDef policy, long relationshipId, Direction direction, IEntity policyEntity, IEntity otherEntity)
 {
     TestAndTrigger(policy, policyEntity, false);
 }
 void IFilteredSaveEventHandler.OnAfterReverseAdd(ResourceTriggerFilterDef policy, long relationshipId, Direction direction, IEntity policyEntity, IEntity otherEntity, bool isNew)
 {
     TestAndTrigger(policy, policyEntity, isNew);
 }
            bool IFilteredSaveEventHandler.OnBeforeDelete(ResourceTriggerFilterDef policy, IEntity entity)
            {
                BeforeDeleteCount++;

                return(false);
            }
 void IFilteredSaveEventHandler.OnAfterDelete(ResourceTriggerFilterDef policy, IEntity entity)
 {
     AfterDeleteCount++;
 }
Exemple #18
0
 void IFilteredSaveEventHandler.OnAfterSave(ResourceTriggerFilterDef policy, IEntity entity, bool isNew, IEnumerable <long> changedFields, IEnumerable <long> changedForwardRels, IEnumerable <long> changedReverseRels)
 {
     // do Nothing
 }
 public bool OnBeforeSave(ResourceTriggerFilterDef policy, IEntity entity, bool isNew, IEnumerable <long> changedFields, IEnumerable <long> changedForwardRels, IEnumerable <long> changedReverseRels)
 {
     BeforeSaveCount++;
     return(false);
 }
Exemple #20
0
 void IFilteredSaveEventHandler.OnAfterReverseRemove(ResourceTriggerFilterDef policy, long relationshipId, Direction direction, IEntity policyEntity, IEntity otherEntity)
 {
     // do nothing
 }
            public bool OnBeforeReverseRemove(ResourceTriggerFilterDef policy, long relationshipId, Direction direction, IEntity otherEntity, IEntity entity)
            {
                BeforeReverseRemoveCount++;

                return(false);
            }
 bool IFilteredSaveEventHandler.OnBeforeSave(ResourceTriggerFilterDef policy, IEntity changedEntity, bool isNew, IEnumerable <long> changedFields, IEnumerable <long> changedForwardRels, IEnumerable <long> changedReverseRels)
 {
     return(false);
 }