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>();
 }
Exemplo n.º 7
0
        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;
                }
            }
        }
Exemplo n.º 8
0
        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();
            }
        }
Exemplo n.º 9
0
        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;
        }
Exemplo n.º 10
0
 public void Flush()
 {
     _lastFlushDateTime = DateTime.Now;
     _evaluatedHooks = null;
     _dirtyHooksCallbackDelegates = new Dictionary<string, DirtyHooksCallbackDelegate>();
 }
Exemplo n.º 11
0
        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);
            }
        }
Exemplo n.º 12
0
        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);
            }
        }