public void Activate(EventBean optionalTriggeringEvent, IDictionary <String, Object> optionalTriggeringPattern, ContextControllerState controllerState, ContextInternalFilterAddendum filterAddendum, int?importPathId)
        {
            var factoryContext = _factory.FactoryContext;

            _activationFilterAddendum = filterAddendum;

            foreach (var item in _factory.SegmentedSpec.Items)
            {
                var callback = new ContextControllerPartitionedFilterCallback(factoryContext.ServicesContext, factoryContext.AgentInstanceContextCreate, item, this, filterAddendum);
                _filterCallbacks.Add(callback);

                if (optionalTriggeringEvent != null)
                {
                    var match = StatementAgentInstanceUtil.EvaluateFilterForStatement(factoryContext.ServicesContext, optionalTriggeringEvent, factoryContext.AgentInstanceContextCreate, callback.FilterHandle);

                    if (match)
                    {
                        callback.MatchFound(optionalTriggeringEvent, null);
                    }
                }
            }

            if (factoryContext.NestingLevel == 1)
            {
                controllerState = ContextControllerStateUtil.GetRecoveryStates(_factory.FactoryContext.StateCache, factoryContext.OutermostContextName);
            }
            if (controllerState == null)
            {
                return;
            }

            int?pathIdToUse = importPathId ?? _pathId;

            InitializeFromState(optionalTriggeringEvent, optionalTriggeringPattern, filterAddendum, controllerState, pathIdToUse.Value, null, false);
        }
Пример #2
0
        public void Activate(EventBean optionalTriggeringEvent, IDictionary <String, Object> optionalTriggeringPattern, ContextControllerState controllerState, ContextInternalFilterAddendum activationFilterAddendum, int?importPathId)
        {
            ContextControllerFactoryContext factoryContext = _factory.FactoryContext;

            _activationFilterAddendum = activationFilterAddendum;

            if (factoryContext.NestingLevel == 1)
            {
                controllerState = ContextControllerStateUtil.GetRecoveryStates(_factory.FactoryContext.StateCache, factoryContext.OutermostContextName);
            }
            if (controllerState == null)
            {
                // handle preallocate
                if (_factory.HashedSpec.IsPreallocate)
                {
                    for (int i = 0; i < _factory.HashedSpec.Granularity; i++)
                    {
                        var properties = ContextPropertyEventType.GetHashBean(factoryContext.ContextName, i);
                        _currentSubpathId++;

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

                            _factory.PopulateContextInternalFilterAddendums(filterAddendumToUse, i);
                        }

                        ContextControllerInstanceHandle handle = _activationCallback.ContextPartitionInstantiate(null, _currentSubpathId, null, this, optionalTriggeringEvent, null, i, properties, controllerState, filterAddendumToUse, _factory.FactoryContext.IsRecoveringResilient, ContextPartitionState.STARTED);
                        _partitionKeys.Put(i, handle);

                        _factory.FactoryContext.StateCache.AddContextPath(
                            _factory.FactoryContext.OutermostContextName,
                            _factory.FactoryContext.NestingLevel,
                            _pathId, _currentSubpathId, handle.ContextPartitionOrPathId, i,
                            _factory.Binding);
                    }
                    return;
                }

                // start filters if not preallocated
                ActivateFilters(optionalTriggeringEvent);

                return;
            }

            // initialize from existing state
            int pathIdToUse = importPathId ?? _pathId;

            InitializeFromState(optionalTriggeringEvent, optionalTriggeringPattern, controllerState, pathIdToUse, null, false);

            // activate filters
            if (!_factory.HashedSpec.IsPreallocate)
            {
                ActivateFilters(null);
            }
        }
Пример #3
0
        public void Activate(
            EventBean optionalTriggeringEvent,
            IDictionary <String, Object> optionalTriggeringPattern,
            ContextControllerState controllerState,
            ContextInternalFilterAddendum activationFilterAddendum,
            int?importPathId)
        {
            if (Factory.FactoryContext.NestingLevel == 1)
            {
                controllerState = ContextControllerStateUtil.GetRecoveryStates(
                    Factory.StateCache, Factory.FactoryContext.OutermostContextName);
            }

            if (controllerState == null)
            {
                var count = 0;
                foreach (var category in _factory.CategorySpec.Items)
                {
                    var context =
                        ContextPropertyEventType.GetCategorizedBean(
                            Factory.FactoryContext.ContextName, 0, category.Name);
                    _currentSubpathId++;

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

                        _factory.PopulateContextInternalFilterAddendums(filterAddendumToUse, count);
                    }

                    var handle = _activationCallback.ContextPartitionInstantiate(
                        null, _currentSubpathId, null, this, optionalTriggeringEvent, optionalTriggeringPattern, count,
                        context, controllerState, filterAddendumToUse, Factory.FactoryContext.IsRecoveringResilient,
                        ContextPartitionState.STARTED);
                    _handleCategories.Put(count, handle);

                    Factory.StateCache.AddContextPath(
                        Factory.FactoryContext.OutermostContextName, Factory.FactoryContext.NestingLevel, PathId,
                        _currentSubpathId, handle.ContextPartitionOrPathId, count, _factory.Binding);
                    count++;
                }
                return;
            }

            var pathIdToUse = importPathId != null ? importPathId.Value : PathId;

            InitializeFromState(
                optionalTriggeringEvent, optionalTriggeringPattern, activationFilterAddendum, controllerState,
                pathIdToUse, null);
        }
Пример #4
0
        public void Activate(EventBean optionalTriggeringEvent, IDictionary <String, Object> optionalTriggeringPattern, ContextControllerState controllerState, ContextInternalFilterAddendum filterAddendum, int?importPathId)
        {
            if (_factory.FactoryContext.NestingLevel == 1)
            {
                controllerState = ContextControllerStateUtil.GetRecoveryStates(_factory.FactoryContext.StateCache, _factory.FactoryContext.OutermostContextName);
            }

            bool currentlyRunning;
            var  contextDetailInitiatedTerminated = _factory.ContextDetailInitiatedTerminated;

            if (controllerState == null)
            {
                StartCondition = MakeEndpoint(contextDetailInitiatedTerminated.Start, filterAddendum, true, 0);

                // if this is single-instance mode, check if we are currently running according to schedule
                currentlyRunning = StartCondition.IsImmediate;
                if (!contextDetailInitiatedTerminated.IsOverlapping)
                {
                    currentlyRunning = DetermineCurrentlyRunning(StartCondition);
                }

                if (currentlyRunning)
                {
                    CurrentSubpathId++;
                    var endEndpoint = MakeEndpoint(contextDetailInitiatedTerminated.End, filterAddendum, false, CurrentSubpathId);
                    endEndpoint.Activate(optionalTriggeringEvent, null, 0, _factory.FactoryContext.IsRecoveringResilient);
                    var startTime      = _factory.SchedulingService.Time;
                    var endTime        = endEndpoint.ExpectedEndTime;
                    var builtinProps   = GetBuiltinProperties(_factory.FactoryContext.ContextName, startTime, endTime, Collections.GetEmptyMap <string, object>());
                    var instanceHandle = ActivationCallback.ContextPartitionInstantiate(null, CurrentSubpathId, null, this, optionalTriggeringEvent, optionalTriggeringPattern, null, builtinProps, controllerState, filterAddendum, _factory.FactoryContext.IsRecoveringResilient, ContextPartitionState.STARTED);
                    EndConditions.Put(endEndpoint, new ContextControllerInitTermInstance(instanceHandle, null, startTime, endTime, CurrentSubpathId));

                    var state = new ContextControllerInitTermState(_factory.FactoryContext.ServicesContext.SchedulingService.Time, builtinProps);
                    _factory.FactoryContext.StateCache.AddContextPath(_factory.FactoryContext.OutermostContextName, _factory.FactoryContext.NestingLevel, _pathId, CurrentSubpathId, instanceHandle.ContextPartitionOrPathId, state, _factory.Binding);
                }

                // non-overlapping and not currently running, or overlapping
                if ((!contextDetailInitiatedTerminated.IsOverlapping && !currentlyRunning) ||
                    contextDetailInitiatedTerminated.IsOverlapping)
                {
                    StartCondition.Activate(optionalTriggeringEvent, null, 0, _factory.FactoryContext.IsRecoveringResilient);
                }
                return;
            }

            StartCondition = MakeEndpoint(contextDetailInitiatedTerminated.Start, filterAddendum, true, 0);

            // if this is single-instance mode, check if we are currently running according to schedule
            currentlyRunning = false;
            if (!contextDetailInitiatedTerminated.IsOverlapping)
            {
                currentlyRunning = DetermineCurrentlyRunning(StartCondition);
            }
            if (!currentlyRunning)
            {
                StartCondition.Activate(optionalTriggeringEvent, null, 0, _factory.FactoryContext.IsRecoveringResilient);
            }

            int pathIdToUse = importPathId ?? _pathId;

            InitializeFromState(optionalTriggeringEvent, optionalTriggeringPattern, filterAddendum, controllerState, pathIdToUse, null, false);
        }