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); } } } }
/// <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); }
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); }
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); } }
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++; }
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++; }
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); }
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); }