Пример #1
0
 public void Stop()
 {
     StopCallback?.Invoke(this, new EventArgs());
     _IsPlaying = false;
     _IsDone    = true;
     synchronizationContext.Post((o) => {
         timer1.Enabled = false;
     }, null);
 }
 public static void StopSafe(StopCallback stopMethod, StatementContext statementContext)
 {
     try {
         stopMethod.Invoke();
     }
     catch (Exception e) {
         Log.Warn("Failed to perform statement stop for statement '" + statementContext.StatementName +
                  "' expression '" + statementContext.Expression + "' : " + e.Message, e);
     }
 }
        protected override StatementAgentInstanceFactoryResult NewContextInternal(AgentInstanceContext agentInstanceContext, bool isRecoveringResilient)
        {
            var stopCallbacks = new List <StopCallback>();

            String   windowName = _statementSpec.CreateWindowDesc.WindowName;
            Viewable finalView;
            Viewable eventStreamParentViewable;
            StatementAgentInstancePostLoad postLoad;
            Viewable topView;
            NamedWindowProcessorInstance processorInstance;
            ViewableActivationResult     viewableActivationResult;

            try {
                // Register interest
                viewableActivationResult = _activator.Activate(agentInstanceContext, false, isRecoveringResilient);
                stopCallbacks.Add(viewableActivationResult.StopCallback);
                eventStreamParentViewable = viewableActivationResult.Viewable;

                // Obtain processor for this named window
                var processor = _services.NamedWindowService.GetProcessor(windowName);
                if (processor == null)
                {
                    throw new Exception("Failed to obtain named window processor for named window '" + windowName + "'");
                }

                // Allocate processor instance
                processorInstance = processor.AddInstance(agentInstanceContext);
                var rootView = processorInstance.RootViewInstance;
                eventStreamParentViewable.AddView(rootView);

                // Materialize views
                var viewFactoryChainContext = new AgentInstanceViewFactoryChainContext(agentInstanceContext, true, null, null);
                var createResult            = _services.ViewService.CreateViews(rootView, _unmaterializedViewChain.FactoryChain, viewFactoryChainContext, false);
                topView   = createResult.TopViewable;
                finalView = createResult.FinalViewable;

                // If this is a virtual data window implementation, bind it to the context for easy lookup
                StopCallback envStopCallback = null;
                if (finalView is VirtualDWView)
                {
                    var objectName    = "/virtualdw/" + windowName;
                    var virtualDWView = (VirtualDWView)finalView;
                    _services.EngineEnvContext.Bind(objectName, virtualDWView.VirtualDataWindow);
                    envStopCallback = () =>
                    {
                        virtualDWView.Dispose();
                        _services.EngineEnvContext.Unbind(objectName);
                    };
                }
                StopCallback environmentStopCallback = envStopCallback;

                // create stop method using statement stream specs
                StopCallback allInOneStopMethod = () =>
                {
                    var iwindowName = _statementSpec.CreateWindowDesc.WindowName;
                    var iprocessor  = _services.NamedWindowService.GetProcessor(iwindowName);
                    if (iprocessor == null)
                    {
                        Log.Warn("Named window processor by name '" + iwindowName + "' has not been found");
                    }
                    else
                    {
                        var instance = iprocessor.GetProcessorInstance(agentInstanceContext);
                        if (instance != null && instance.RootViewInstance.IsVirtualDataWindow)
                        {
                            instance.RootViewInstance.VirtualDataWindow.HandleStopWindow();
                        }
                    }
                    if (environmentStopCallback != null)
                    {
                        environmentStopCallback.Invoke();
                    }
                };

                stopCallbacks.Add(allInOneStopMethod);

                // Attach tail view
                NamedWindowTailViewInstance tailView = processorInstance.TailViewInstance;
                finalView.AddView(tailView);
                finalView = tailView;

                // obtain result set processor
                ResultSetProcessor resultSetProcessor = EPStatementStartMethodHelperAssignExpr.GetAssignResultSetProcessor(agentInstanceContext, _resultSetProcessorPrototype);

                // Attach output view
                View outputView = _outputProcessViewFactory.MakeView(resultSetProcessor, agentInstanceContext);
                finalView.AddView(outputView);
                finalView = outputView;

                // obtain post load
                postLoad = processorInstance.PostLoad;

                // Handle insert case
                if (_statementSpec.CreateWindowDesc.IsInsert && !_isRecoveringStatement)
                {
                    String insertFromWindow = _statementSpec.CreateWindowDesc.InsertFromWindow;
                    NamedWindowProcessor         namedWindowProcessor  = _services.NamedWindowService.GetProcessor(insertFromWindow);
                    NamedWindowProcessorInstance sourceWindowInstances = namedWindowProcessor.GetProcessorInstance(agentInstanceContext);
                    IList <EventBean>            events = new List <EventBean>();
                    if (_statementSpec.CreateWindowDesc.InsertFilter != null)
                    {
                        var eventsPerStream = new EventBean[1];
                        var filter          = _statementSpec.CreateWindowDesc.InsertFilter.ExprEvaluator;
                        for (IEnumerator <EventBean> it = sourceWindowInstances.TailViewInstance.GetEnumerator(); it.MoveNext();)
                        {
                            var candidate = it.Current;
                            eventsPerStream[0] = candidate;
                            var result = filter.Evaluate(new EvaluateParams(eventsPerStream, true, agentInstanceContext));
                            if ((result == null) || (false.Equals(result)))
                            {
                                continue;
                            }
                            events.Add(candidate);
                        }
                    }
                    else
                    {
                        for (IEnumerator <EventBean> it = sourceWindowInstances.TailViewInstance.GetEnumerator(); it.MoveNext();)
                        {
                            events.Add(it.Current);
                        }
                    }
                    if (events.Count > 0)
                    {
                        EventType   rootViewType    = rootView.EventType;
                        EventBean[] convertedEvents = _services.EventAdapterService.TypeCast(events, rootViewType);
                        rootView.Update(convertedEvents, null);
                    }
                }
            }
            catch (Exception)
            {
                StopCallback callback = StatementAgentInstanceUtil.GetStopCallback(stopCallbacks, agentInstanceContext);
                StatementAgentInstanceUtil.StopSafe(callback, _statementContext);
                throw;
            }

            StatementAgentInstanceFactoryCreateWindowResult createWindowResult = new StatementAgentInstanceFactoryCreateWindowResult(
                finalView, null, agentInstanceContext, eventStreamParentViewable, postLoad, topView, processorInstance, viewableActivationResult);

            if (_statementContext.StatementExtensionServicesContext != null)
            {
                _statementContext.StatementExtensionServicesContext.ContributeStopCallback(createWindowResult, stopCallbacks);
            }

            Log.Debug(".start Statement start completed");
            StopCallback stopCallback = StatementAgentInstanceUtil.GetStopCallback(stopCallbacks, agentInstanceContext);

            createWindowResult.StopCallback = stopCallback;

            return(createWindowResult);
        }