예제 #1
0
        public override void Update(EventBean[] newData, EventBean[] oldData)
        {
            // handle remove stream: post oldData to all views
            if (oldData != null && oldData.Length != 0)
            {
                try
                {
                    _ignoreViewIrStream = true;
                    for (int i = 0; i < _views.Length; i++)
                    {
                        _views[i].Update(newData, oldData);
                    }
                }
                finally
                {
                    _ignoreViewIrStream = false;
                }
            }

            if (newData != null)
            {
                // post to all non-batch views first to let them decide the remove stream, if any
                try
                {
                    _captureIrNonBatch = true;
                    for (int i = 0; i < _views.Length; i++)
                    {
                        if (i != _batchViewIndex)
                        {
                            _views[i].Update(newData, oldData);
                        }
                    }
                }
                finally
                {
                    _captureIrNonBatch = false;
                }

                // if there is any data removed from non-batch views, remove from all views
                // collect removed events
                _removedEvents.Clear();
                for (int i = 0; i < _views.Length; i++)
                {
                    if (_oldEventsPerView[i] != null)
                    {
                        for (int j = 0; j < _views.Length; j++)
                        {
                            if (i == j)
                            {
                                continue;
                            }
                            _views[j].Update(null, _oldEventsPerView[i]);

                            for (int k = 0; k < _oldEventsPerView[i].Length; k++)
                            {
                                _removedEvents.Add(_oldEventsPerView[i][k]);
                            }
                        }
                        _oldEventsPerView[i] = null;
                    }
                }

                // post only new events to the batch view that have not been removed
                EventBean[] newDataNonRemoved;
                if (_hasAsymetric)
                {
                    newDataNonRemoved = EventBeanUtility.GetNewDataNonRemoved(newData, _removedEvents, _newEventsPerView);
                }
                else
                {
                    newDataNonRemoved = EventBeanUtility.GetNewDataNonRemoved(newData, _removedEvents);
                }
                if (newDataNonRemoved != null)
                {
                    _views[_batchViewIndex].Update(newDataNonRemoved, null);
                }
            }
        }
예제 #2
0
        public override void Update(
            EventBean[] newData,
            EventBean[] oldData)
        {
            agentInstanceContext.AuditProvider.View(newData, oldData, agentInstanceContext, factory);
            agentInstanceContext.InstrumentationProvider.QViewProcessIRStream(factory, newData, oldData);

            var localState = factory.BatchViewLocalStatePerThread;

            // handle remove stream: post oldData to all views
            if (oldData != null && oldData.Length != 0) {
                try {
                    localState.IsIgnoreViewIRStream = true;
                    for (var i = 0; i < views.Length; i++) {
                        var view = views[i];
                        agentInstanceContext.InstrumentationProvider.QViewIndicate(factory, newData, oldData);
                        view.Update(newData, oldData);
                        agentInstanceContext.InstrumentationProvider.AViewIndicate();
                    }
                }
                finally {
                    localState.IsIgnoreViewIRStream = false;
                }
            }

            if (newData != null) {
                // post to all non-batch views first to let them decide the remove stream, if any
                try {
                    localState.IsCaptureIRNonBatch = true;
                    for (var i = 0; i < views.Length; i++) {
                        if (i != factory.BatchViewIndex) {
                            var view = views[i];
                            agentInstanceContext.InstrumentationProvider.QViewIndicate(factory, newData, oldData);
                            view.Update(newData, oldData);
                            agentInstanceContext.InstrumentationProvider.AViewIndicate();
                        }
                    }
                }
                finally {
                    localState.IsCaptureIRNonBatch = false;
                }

                // if there is any data removed from non-batch views, remove from all views
                // collect removed events
                localState.RemovedEvents.Clear();
                for (var i = 0; i < views.Length; i++) {
                    if (localState.OldEventsPerView[i] != null) {
                        for (var j = 0; j < views.Length; j++) {
                            if (i == j) {
                                continue;
                            }

                            var view = views[j];
                            var oldEvents = localState.OldEventsPerView[i];

                            agentInstanceContext.InstrumentationProvider.QViewIndicate(factory, null, oldEvents);
                            view.Update(null, oldEvents);
                            agentInstanceContext.InstrumentationProvider.AViewIndicate();

                            for (var k = 0; k < localState.OldEventsPerView[i].Length; k++) {
                                localState.RemovedEvents.Add(localState.OldEventsPerView[i][k]);
                            }
                        }

                        localState.OldEventsPerView[i] = null;
                    }
                }

                // post only new events to the batch view that have not been removed
                EventBean[] newDataNonRemoved;
                if (factory.IsAsymetric) {
                    newDataNonRemoved = EventBeanUtility.GetNewDataNonRemoved(
                        newData,
                        localState.RemovedEvents,
                        localState.NewEventsPerView);
                }
                else {
                    newDataNonRemoved = EventBeanUtility.GetNewDataNonRemoved(newData, localState.RemovedEvents);
                }

                if (newDataNonRemoved != null) {
                    var view = views[factory.BatchViewIndex];
                    agentInstanceContext.InstrumentationProvider.QViewIndicate(factory, newDataNonRemoved, null);
                    view.Update(newDataNonRemoved, null);
                    agentInstanceContext.InstrumentationProvider.AViewIndicate();
                }
            }

            agentInstanceContext.InstrumentationProvider.AViewProcessIRStream();
        }
예제 #3
0
        public override void Update(EventBean[] newData, EventBean[] oldData)
        {
            IntersectBatchViewLocalState localState = _factory.GetBatchViewLocalStatePerThread();

            // handle remove stream: post oldData to all views
            if (oldData != null && oldData.Length != 0)
            {
                try
                {
                    localState.IsIgnoreViewIRStream = true;
                    for (int i = 0; i < _views.Length; i++)
                    {
                        _views[i].Update(newData, oldData);
                    }
                }
                finally
                {
                    localState.IsIgnoreViewIRStream = false;
                }
            }

            if (newData != null)
            {
                // post to all non-batch views first to let them decide the remove stream, if any
                try
                {
                    localState.IsCaptureIRNonBatch = true;
                    for (int i = 0; i < _views.Length; i++)
                    {
                        if (i != _factory.BatchViewIndex)
                        {
                            _views[i].Update(newData, oldData);
                        }
                    }
                }
                finally
                {
                    localState.IsCaptureIRNonBatch = false;
                }

                // if there is any data removed from non-batch views, remove from all views
                // collect removed events
                localState.RemovedEvents.Clear();
                for (int i = 0; i < _views.Length; i++)
                {
                    if (localState.OldEventsPerView[i] != null)
                    {
                        for (int j = 0; j < _views.Length; j++)
                        {
                            if (i == j)
                            {
                                continue;
                            }
                            _views[j].Update(null, localState.OldEventsPerView[i]);

                            for (int k = 0; k < localState.OldEventsPerView[i].Length; k++)
                            {
                                localState.RemovedEvents.Add(localState.OldEventsPerView[i][k]);
                            }
                        }
                        localState.OldEventsPerView[i] = null;
                    }
                }

                // post only new events to the batch view that have not been removed
                EventBean[] newDataNonRemoved;
                if (_factory.IsAsymmetric())
                {
                    newDataNonRemoved = EventBeanUtility.GetNewDataNonRemoved(
                        newData, localState.RemovedEvents, localState.NewEventsPerView);
                }
                else
                {
                    newDataNonRemoved = EventBeanUtility.GetNewDataNonRemoved(newData, localState.RemovedEvents);
                }
                if (newDataNonRemoved != null)
                {
                    _views[_factory.BatchViewIndex].Update(newDataNonRemoved, null);
                }
            }
        }