private EvaluatedHooks DoInitializeFromRegistrator() { var result = new EvaluatedHooks(); using (GlobalInitializerFacade.CoreIsInitializedScope) { if (HostingEnvironment.ApplicationHost.ShutdownInitiated()) { return(result); } using (new LogExecutionTime("RGB(194, 252, 131)HookingFacade", "Initializing Entity Hooks")) using (new DataScope(DataScopeIdentifier.Administrated)) { Verify.That(GlobalInitializerFacade.SystemCoreInitialized, "Expected system core to be initialized"); foreach (string name in HookRegistratorRegistry.HookRegistratorPluginNames) { var entityTokenHooks = HookRegistratorPluginFacade.GetHooks(name); foreach (EntityTokenHook entityTokenHook in entityTokenHooks) { List <EntityToken> hookies = result.ParentToChild.GetOrAdd(entityTokenHook.Hooker, () => new List <EntityToken>()); hookies.AddRange(entityTokenHook.Hookies); } } foreach (KeyValuePair <EntityToken, List <EntityToken> > kvp in result.ParentToChild) { foreach (EntityToken hookie in kvp.Value) { List <EntityToken> hookers = result.ChildToParent.GetOrAdd(hookie, () => new List <EntityToken>()); hookers.Add(kvp.Key); } } } } return(result); }
private void ApplyQueuedChanges(EvaluatedHooks evaluatedHooks) { lock (_changesQueueSyncRoot) { foreach (Pair <bool, EntityTokenHook> change in _changesQueue) { if (change.First) { AddHookInternal(evaluatedHooks, change.Second); } else { RemoveHookInternal(evaluatedHooks, change.Second); } } _changesQueue.Clear(); } }
private void RemoveHookInternal(EvaluatedHooks hooks, EntityTokenHook entityTokenHook) { Verify.ArgumentNotNull(entityTokenHook, "entityTokenHook"); if (hooks.ParentToChild.ContainsKey(entityTokenHook.Hooker)) { List <EntityToken> hookies = hooks.ParentToChild[entityTokenHook.Hooker]; foreach (EntityToken hookie in hookies) { hooks.ChildToParent[hookie].Remove(entityTokenHook.Hooker); if (hooks.ChildToParent[hookie].Count == 0) { hooks.ChildToParent.Remove(hookie); } } hooks.ParentToChild.Remove(entityTokenHook.Hooker); } }
private void AddHookInternal(EvaluatedHooks hooks, EntityTokenHook entityTokenHook) { Verify.ArgumentNotNull(entityTokenHook, "entityTokenHook"); List <EntityToken> hookies; if (!hooks.ParentToChild.TryGetValue(entityTokenHook.Hooker, out hookies)) { hooks.ParentToChild.Add(entityTokenHook.Hooker, entityTokenHook.Hookies.ToList()); } else { foreach (var entityToken in entityTokenHook.Hookies) { if (!hookies.Contains(entityToken)) { hookies.Add(entityToken); } } } foreach (EntityToken hookie in entityTokenHook.Hookies) { List <EntityToken> hookers; if (!hooks.ChildToParent.TryGetValue(hookie, out hookers)) { hookers = new List <EntityToken>(); hooks.ChildToParent.Add(hookie, hookers); } else if (hookers.Contains(entityTokenHook.Hooker)) { continue; } hookers.Add(entityTokenHook.Hooker); } }
private EvaluatedHooks GetEvaluatedHooks() { var evaluatedHooks = _evaluatedHooks; if (evaluatedHooks != null) { return(evaluatedHooks); } lock (_lock) { evaluatedHooks = _evaluatedHooks; if (evaluatedHooks != null) { return(evaluatedHooks); } Verify.IsFalse(_isInitializing, "Calling to HookingFacade while it's initializing is not allowed"); _isInitializing = true; DateTime calculationTime = DateTime.Now; try { ClearChangesQueue(); evaluatedHooks = DoInitializeFromRegistrator(); var dirtyHooksCallbackDelegates = _dirtyHooksCallbackDelegates; if (dirtyHooksCallbackDelegates.Count > 0) { var delegates = new Dictionary <string, DirtyHooksCallbackDelegate>(dirtyHooksCallbackDelegates); _dirtyHooksCallbackDelegates = new Dictionary <string, DirtyHooksCallbackDelegate>(); foreach (DirtyHooksCallbackDelegate dirtyHooksCallbackDelegate in delegates.Values) { try { dirtyHooksCallbackDelegate(); } catch (Exception ex) { Log.LogError("HookingFacade", ex); } } } ApplyQueuedChanges(evaluatedHooks); if (calculationTime > _lastFlushDateTime) { _evaluatedHooks = evaluatedHooks; } return(evaluatedHooks); } finally { _isInitializing = false; } } }
public void Flush() { _lastFlushDateTime = DateTime.Now; _evaluatedHooks = null; _dirtyHooksCallbackDelegates = new Dictionary <string, DirtyHooksCallbackDelegate>(); }
private EvaluatedHooks GetEvaluatedHooks() { var evaluatedHooks = _evaluatedHooks; if (evaluatedHooks != null) return evaluatedHooks; lock (_lock) { evaluatedHooks = _evaluatedHooks; if (evaluatedHooks != null) return evaluatedHooks; Verify.IsFalse(_isInitializing, "Calling to HookingFacade while it's initializing is not allowed"); _isInitializing = true; DateTime calculationTime = DateTime.Now; try { ClearChangesQueue(); evaluatedHooks = DoInitializeFromRegistrator(); var dirtyHooksCallbackDelegates = _dirtyHooksCallbackDelegates; if (dirtyHooksCallbackDelegates.Count > 0) { var delegates = new Dictionary<string, DirtyHooksCallbackDelegate>(dirtyHooksCallbackDelegates); _dirtyHooksCallbackDelegates = new Dictionary<string, DirtyHooksCallbackDelegate>(); foreach (DirtyHooksCallbackDelegate dirtyHooksCallbackDelegate in delegates.Values) { try { dirtyHooksCallbackDelegate(); } catch (Exception ex) { Log.LogError("HookingFacade", ex); } } } ApplyQueuedChanges(evaluatedHooks); if (calculationTime > _lastFlushDateTime) { _evaluatedHooks = evaluatedHooks; } return evaluatedHooks; } finally { _isInitializing = false; } } }
private void ApplyQueuedChanges(EvaluatedHooks evaluatedHooks) { lock (_changesQueueSyncRoot) { foreach (Pair<bool, EntityTokenHook> change in _changesQueue) { if (change.First) { AddHookInternal(evaluatedHooks, change.Second); } else { RemoveHookInternal(evaluatedHooks, change.Second); } } _changesQueue.Clear(); } }
private EvaluatedHooks DoInitializeFromRegistrator() { var result = new EvaluatedHooks(); using (GlobalInitializerFacade.CoreIsInitializedScope) { if (HostingEnvironment.ApplicationHost.ShutdownInitiated()) { return result; } using(new LogExecutionTime("RGB(194, 252, 131)HookingFacade", "Initializing Entity Hooks")) using (new DataScope(DataScopeIdentifier.Administrated)) { Verify.That(GlobalInitializerFacade.SystemCoreInitialized, "Expected system core to be initialized"); foreach (string name in HookRegistratorRegistry.HookRegistratorPluginNames) { var entityTokenHooks = HookRegistratorPluginFacade.GetHooks(name); foreach (EntityTokenHook entityTokenHook in entityTokenHooks) { List<EntityToken> hookies = result.ParentToChild.GetOrAdd(entityTokenHook.Hooker, () => new List<EntityToken>()); hookies.AddRange(entityTokenHook.Hookies); } } foreach (KeyValuePair<EntityToken, List<EntityToken>> kvp in result.ParentToChild) { foreach (EntityToken hookie in kvp.Value) { List<EntityToken> hookers = result.ChildToParent.GetOrAdd(hookie, () => new List<EntityToken>()); hookers.Add(kvp.Key); } } } } return result; }
public void Flush() { _lastFlushDateTime = DateTime.Now; _evaluatedHooks = null; _dirtyHooksCallbackDelegates = new Dictionary<string, DirtyHooksCallbackDelegate>(); }
private void AddHookInternal(EvaluatedHooks hooks, EntityTokenHook entityTokenHook) { Verify.ArgumentNotNull(entityTokenHook, "entityTokenHook"); List<EntityToken> hookies; if (!hooks.ParentToChild.TryGetValue(entityTokenHook.Hooker, out hookies)) { hooks.ParentToChild.Add(entityTokenHook.Hooker, entityTokenHook.Hookies.ToList()); } else { foreach (var entityToken in entityTokenHook.Hookies) { if (!hookies.Contains(entityToken)) { hookies.Add(entityToken); } } } foreach (EntityToken hookie in entityTokenHook.Hookies) { List<EntityToken> hookers; if (!hooks.ChildToParent.TryGetValue(hookie, out hookers)) { hookers = new List<EntityToken>(); hooks.ChildToParent.Add(hookie, hookers); } else if (hookers.Contains(entityTokenHook.Hooker)) { continue; } hookers.Add(entityTokenHook.Hooker); } }
private void RemoveHookInternal(EvaluatedHooks hooks, EntityTokenHook entityTokenHook) { Verify.ArgumentNotNull(entityTokenHook, "entityTokenHook"); if (hooks.ParentToChild.ContainsKey(entityTokenHook.Hooker)) { List<EntityToken> hookies = hooks.ParentToChild[entityTokenHook.Hooker]; foreach (EntityToken hookie in hookies) { hooks.ChildToParent[hookie].Remove(entityTokenHook.Hooker); if (hooks.ChildToParent[hookie].Count == 0) { hooks.ChildToParent.Remove(hookie); } } hooks.ParentToChild.Remove(entityTokenHook.Hooker); } }