示例#1
0
        public ContextManagerNested(ContextControllerFactoryServiceContext factoryServiceContext)
        {
            _contextName               = factoryServiceContext.ContextName;
            _servicesContext           = factoryServiceContext.ServicesContext;
            _contextPartitionIdManager = factoryServiceContext.AgentInstanceContextCreate.StatementContext.ContextControllerFactoryService.AllocatePartitionIdMgr(
                _contextName, factoryServiceContext.AgentInstanceContextCreate.StatementContext.StatementId);
            _nestedContextFactories = factoryServiceContext.AgentInstanceContextCreate.StatementContext.ContextControllerFactoryService.GetFactory(
                factoryServiceContext);

            StatementAIResourceRegistryFactory resourceRegistryFactory =
                () => new StatementAIResourceRegistry(new AIRegistryAggregationMap(), new AIRegistryExprMap());

            var contextProps = ContextPropertyEventType.GetNestedTypeBase();

            foreach (var factory in _nestedContextFactories)
            {
                contextProps.Put(factory.FactoryContext.ContextName, factory.ContextBuiltinProps);
            }
            var contextPropsType = _servicesContext.EventAdapterService.CreateAnonymousMapType(
                _contextName, contextProps, true);
            var registry = new ContextPropertyRegistryImpl(
                Collections.GetEmptyList <ContextDetailPartitionItem>(), contextPropsType);

            _contextDescriptor = new ContextDescriptor(
                _contextName, false, registry, resourceRegistryFactory, this, factoryServiceContext.Detail);
        }
 public ContextManager Make(ContextDetail contextDetail, ContextControllerFactoryServiceContext factoryServiceContext)
 {
     if (contextDetail is ContextDetailNested)
     {
         return(new ContextManagerNested(factoryServiceContext));
     }
     return(new ContextManagerImpl(factoryServiceContext));
 }
示例#3
0
        private static ContextControllerFactory BuildContextFactory(
            ContextControllerFactoryServiceContext serviceContext,
            String contextName,
            ContextDetail detail,
            int nestingLevel,
            IList <FilterSpecCompiled> optFiltersNested,
            ContextStateCache contextStateCache)
        {
            var factoryContext = new ContextControllerFactoryContext(
                serviceContext.ContextName, contextName, serviceContext.ServicesContext,
                serviceContext.AgentInstanceContextCreate, nestingLevel, serviceContext.IsRecoveringResilient);

            return(BuildContextFactory(factoryContext, detail, optFiltersNested, contextStateCache));
        }
示例#4
0
 public static ContextControllerFactory[] GetFactory(ContextControllerFactoryServiceContext serviceContext,
                                                     ContextStateCache contextStateCache)
 {
     if (!(serviceContext.Detail is ContextDetailNested))
     {
         ContextControllerFactory factory = BuildContextFactory(
             serviceContext, serviceContext.ContextName, serviceContext.Detail, 1, null, contextStateCache);
         factory.ValidateFactory();
         return(new ContextControllerFactory[]
         {
             factory
         });
     }
     return(BuildNestedContextFactories(serviceContext, contextStateCache));
 }
示例#5
0
        public ContextManagerImpl(ContextControllerFactoryServiceContext factoryServiceContext)
        {
            _uLock                     = LockManager.CreateLock(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
            _contextName               = factoryServiceContext.ContextName;
            _servicesContext           = factoryServiceContext.ServicesContext;
            _factory                   = factoryServiceContext.AgentInstanceContextCreate.StatementContext.ContextControllerFactoryService.GetFactory(factoryServiceContext)[0];
            _rootContext               = _factory.CreateNoCallback(0, this); // single instance: created here and activated/deactivated later
            _contextPartitionIdManager = factoryServiceContext.AgentInstanceContextCreate.StatementContext.ContextControllerFactoryService.AllocatePartitionIdMgr(_contextName, factoryServiceContext.AgentInstanceContextCreate.StatementContext.StatementId);

            var resourceRegistryFactory = _factory.StatementAIResourceRegistryFactory;

            var contextProps     = _factory.ContextBuiltinProps;
            var contextPropsType = _servicesContext.EventAdapterService.CreateAnonymousMapType(_contextName, contextProps, true);
            var registry         = new ContextPropertyRegistryImpl(_factory.ContextDetailPartitionItems, contextPropsType);

            _contextDescriptor = new ContextDescriptor(_contextName, _factory.IsSingleInstanceContext, registry, resourceRegistryFactory, this, _factory.ContextDetail);
        }
示例#6
0
        public void AddContextSpec(EPServicesContext servicesContext, AgentInstanceContext agentInstanceContext, CreateContextDesc contextDesc, bool isRecoveringResilient, EventType statementResultEventType)
        {
            var mgr = _contexts.Get(contextDesc.ContextName);

            if (mgr != null)
            {
                if (_destroyedContexts.Contains(contextDesc.ContextName))
                {
                    throw new ExprValidationException("Context by name '" + contextDesc.ContextName + "' is still referenced by statements and may not be changed");
                }
                throw new ExprValidationException("Context by name '" + contextDesc.ContextName + "' already exists");
            }

            var factoryServiceContext = new ContextControllerFactoryServiceContext(contextDesc.ContextName, servicesContext, contextDesc.ContextDetail, agentInstanceContext, isRecoveringResilient, statementResultEventType);
            var contextManager        = servicesContext.ContextManagerFactoryService.Make(contextDesc.ContextDetail, factoryServiceContext);

            factoryServiceContext.AgentInstanceContextCreate.EpStatementAgentInstanceHandle.FilterFaultHandler = contextManager;

            _contexts.Put(contextDesc.ContextName, new ContextManagerEntry(contextManager));
        }
示例#7
0
        private static ContextControllerFactory[] BuildNestedContextFactories(
            ContextControllerFactoryServiceContext serviceContext, ContextStateCache contextStateCache)
        {
            var nestedSpec = (ContextDetailNested)serviceContext.Detail;
            // determine nested filter use
            IDictionary <CreateContextDesc, IList <FilterSpecCompiled> > filtersPerNestedContext = null;

            for (int i = 0; i < nestedSpec.Contexts.Count; i++)
            {
                CreateContextDesc contextParent = nestedSpec.Contexts[i];
                for (int j = i + 1; j < nestedSpec.Contexts.Count; j++)
                {
                    CreateContextDesc          contextControlled = nestedSpec.Contexts[j];
                    IList <FilterSpecCompiled> specs             = contextControlled.FilterSpecs;
                    if (specs == null)
                    {
                        continue;
                    }
                    if (filtersPerNestedContext == null)
                    {
                        filtersPerNestedContext = new Dictionary <CreateContextDesc, IList <FilterSpecCompiled> >();
                    }
                    IList <FilterSpecCompiled> existing = filtersPerNestedContext.Get(contextParent);
                    if (existing != null)
                    {
                        existing.AddAll(specs);
                    }
                    else
                    {
                        filtersPerNestedContext.Put(contextParent, specs);
                    }
                }
            }

            // create contexts
            ICollection <String> namesUsed = new HashSet <String>();
            var hierarchy = new ContextControllerFactory[nestedSpec.Contexts.Count];

            for (int i = 0; i < nestedSpec.Contexts.Count; i++)
            {
                CreateContextDesc context = nestedSpec.Contexts[i];

                if (namesUsed.Contains(context.ContextName))
                {
                    throw new ExprValidationException(
                              "Context by name '" + context.ContextName +
                              "' has already been declared within nested context '" + serviceContext.ContextName + "'");
                }
                namesUsed.Add(context.ContextName);

                int nestingLevel = i + 1;

                IList <FilterSpecCompiled> optFiltersNested = null;
                if (filtersPerNestedContext != null)
                {
                    optFiltersNested = filtersPerNestedContext.Get(context);
                }

                hierarchy[i] = BuildContextFactory(
                    serviceContext, context.ContextName, context.ContextDetail, nestingLevel, optFiltersNested,
                    contextStateCache);
                hierarchy[i].ValidateFactory();
            }
            return(hierarchy);
        }