private void InitializeFromState(EventBean optionalTriggeringEvent,
                                         IDictionary <String, Object> optionalTriggeringPattern,
                                         ContextControllerState controllerState,
                                         int pathIdToUse,
                                         AgentInstanceSelector agentInstanceSelector)
        {
            var factoryContext = _factory.FactoryContext;
            var states         = controllerState.States;
            var childContexts  = ContextControllerStateUtil.GetChildContexts(factoryContext, pathIdToUse, states);

            var maxSubpathId = int.MinValue;

            foreach (var entry in childContexts)
            {
                var hashAlgoGeneratedId = (int?)_factory.Binding.ByteArrayToObject(entry.Value.Blob, null);

                // merge filter addendum, if any
                var filterAddendumToUse = _activationFilterAddendum;
                if (_factory.HasFiltersSpecsNestedContexts())
                {
                    filterAddendumToUse = _activationFilterAddendum != null?_activationFilterAddendum.DeepCopy() : new ContextInternalFilterAddendum();

                    _factory.PopulateContextInternalFilterAddendums(filterAddendumToUse, hashAlgoGeneratedId);
                }

                // check if exists already
                if (controllerState.IsImported)
                {
                    var existingHandle = _partitionKeys.Get(hashAlgoGeneratedId.Value);
                    if (existingHandle != null)
                    {
                        _activationCallback.ContextPartitionNavigate(existingHandle, this, controllerState, entry.Value.OptionalContextPartitionId.Value, filterAddendumToUse, agentInstanceSelector, entry.Value.Blob);
                        continue;
                    }
                }

                var properties = ContextPropertyEventType.GetHashBean(factoryContext.ContextName, hashAlgoGeneratedId.Value);

                var assignedSubPathId = !controllerState.IsImported ? entry.Key.SubPath : ++_currentSubpathId;
                var handle            = _activationCallback.ContextPartitionInstantiate(entry.Value.OptionalContextPartitionId, assignedSubPathId, entry.Key.SubPath, this, optionalTriggeringEvent, optionalTriggeringPattern, hashAlgoGeneratedId, properties, controllerState, filterAddendumToUse, factoryContext.IsRecoveringResilient, entry.Value.State);
                _partitionKeys.Put(hashAlgoGeneratedId.Value, handle);

                if (entry.Key.SubPath > maxSubpathId)
                {
                    maxSubpathId = assignedSubPathId;
                }
            }
            if (!controllerState.IsImported)
            {
                _currentSubpathId = maxSubpathId != int.MinValue ? maxSubpathId : 0;
            }
        }
Example #2
0
        private void InitializeFromState(
            EventBean optionalTriggeringEvent,
            IDictionary <String, Object> optionalTriggeringPattern,
            ContextInternalFilterAddendum activationFilterAddendum,
            ContextControllerState controllerState,
            int pathIdToUse,
            AgentInstanceSelector agentInstanceSelector,
            bool loadingExistingState)
        {
            var states        = controllerState.States;
            var childContexts = ContextControllerStateUtil.GetChildContexts(
                Factory.FactoryContext, pathIdToUse, states);

            int maxSubpathId = int.MinValue;

            foreach (var entry in childContexts)
            {
                var categoryNumber = (int)_factory.Binding.ByteArrayToObject(entry.Value.Blob, null);
                ContextDetailCategoryItem category = _factory.CategorySpec.Items[categoryNumber];

                // merge filter addendum, if any
                var filterAddendumToUse = activationFilterAddendum;
                if (_factory.HasFiltersSpecsNestedContexts)
                {
                    filterAddendumToUse = activationFilterAddendum != null
                        ? activationFilterAddendum.DeepCopy()
                        : new ContextInternalFilterAddendum();

                    _factory.PopulateContextInternalFilterAddendums(filterAddendumToUse, categoryNumber);
                }

                // check if exists already
                if (controllerState.IsImported)
                {
                    var existingHandle = _handleCategories.Get(categoryNumber);
                    if (existingHandle != null)
                    {
                        _activationCallback.ContextPartitionNavigate(
                            existingHandle, this, controllerState, entry.Value.OptionalContextPartitionId.Value,
                            filterAddendumToUse, agentInstanceSelector, entry.Value.Blob, loadingExistingState);
                        continue;
                    }
                }

                var context =
                    ContextPropertyEventType.GetCategorizedBean(Factory.FactoryContext.ContextName, 0, category.Name);

                var contextPartitionId = entry.Value.OptionalContextPartitionId.Value;
                var assignedSubPathId  = !controllerState.IsImported ? entry.Key.SubPath : ++_currentSubpathId;
                var handle             =
                    _activationCallback.ContextPartitionInstantiate(
                        contextPartitionId, assignedSubPathId, entry.Key.SubPath, this, null, null, categoryNumber,
                        context, controllerState, filterAddendumToUse, loadingExistingState || Factory.FactoryContext.IsRecoveringResilient,
                        entry.Value.State);
                _handleCategories.Put(categoryNumber, handle);

                if (entry.Key.SubPath > maxSubpathId)
                {
                    maxSubpathId = assignedSubPathId;
                }
            }
            if (!controllerState.IsImported)
            {
                _currentSubpathId = maxSubpathId != int.MinValue ? maxSubpathId : 0;
            }
        }
        private void InitializeFromState(
            EventBean optionalTriggeringEvent,
            IDictionary <String, Object> optionalTriggeringPattern,
            ContextInternalFilterAddendum filterAddendum,
            ContextControllerState controllerState,
            int pathIdToUse,
            AgentInstanceSelector agentInstanceSelector,
            bool loadingExistingState)
        {
            var factoryContext = _factory.FactoryContext;
            var states         = controllerState.States;

            // restart if there are states
            var maxSubpathId        = int.MinValue;
            var childContexts       = ContextControllerStateUtil.GetChildContexts(factoryContext, pathIdToUse, states);
            var eventAdapterService = _factory.FactoryContext.ServicesContext.EventAdapterService;

            foreach (var entry in childContexts)
            {
                var keys   = (Object[])_factory.Binding.ByteArrayToObject(entry.Value.Blob, eventAdapterService);
                var mapKey = GetKeyObjectForLookup(keys);

                // merge filter addendum, if any
                var myFilterAddendum = _activationFilterAddendum;
                if (_factory.HasFiltersSpecsNestedContexts)
                {
                    filterAddendum = _activationFilterAddendum != null
                        ? _activationFilterAddendum.DeepCopy()
                        : new ContextInternalFilterAddendum();

                    _factory.PopulateContextInternalFilterAddendums(filterAddendum, mapKey);
                }

                // check if exists already
                if (controllerState.IsImported)
                {
                    var existingHandle = _partitionKeys.Get(mapKey);
                    if (existingHandle != null)
                    {
                        _activationCallback.ContextPartitionNavigate(
                            existingHandle, this, controllerState, entry.Value.OptionalContextPartitionId.Value,
                            myFilterAddendum, agentInstanceSelector, entry.Value.Blob, loadingExistingState);
                        continue;
                    }
                }

                var props = ContextPropertyEventType.GetPartitionBean(
                    factoryContext.ContextName, 0, mapKey, _factory.SegmentedSpec.Items[0].PropertyNames);

                var assignedSubpathId = !controllerState.IsImported ? entry.Key.SubPath : ++_currentSubpathId;
                var handle            =
                    _activationCallback.ContextPartitionInstantiate(
                        entry.Value.OptionalContextPartitionId, assignedSubpathId, entry.Key.SubPath, this,
                        optionalTriggeringEvent, optionalTriggeringPattern, mapKey, props, controllerState,
                        myFilterAddendum, loadingExistingState || factoryContext.IsRecoveringResilient, entry.Value.State);
                _partitionKeys.Put(mapKey, handle);

                if (entry.Key.SubPath > maxSubpathId)
                {
                    maxSubpathId = assignedSubpathId;
                }
            }
            if (!controllerState.IsImported)
            {
                _currentSubpathId = maxSubpathId != int.MinValue ? maxSubpathId : 0;
            }
        }