예제 #1
0
 public RuntimePipeline(IPipelineHandler handler, ILogger logger)
 {
     if (handler == null)
     {
         throw new ArgumentNullException("handler");
     }
     if (logger == null)
     {
         throw new ArgumentNullException("logger");
     }
     _handler        = handler;
     _handler.Logger = logger;
     _logger         = logger;
 }
예제 #2
0
        /// <summary>
        /// Inserts the given handler after current handler in the pipeline.
        /// </summary>
        /// <param name="handler">Handler to be inserted in the pipeline.</param>
        /// <param name="current">Handler after which the given handler is inserted.</param>
        private static void InsertHandler(IPipelineHandler handler, IPipelineHandler current)
        {
            var next = current.InnerHandler;

            current.InnerHandler = handler;
            handler.OuterHandler = current;

            if (next != null)
            {
                var innerMostHandler = GetInnermostHandler(handler);
                innerMostHandler.InnerHandler = next;
                next.OuterHandler             = innerMostHandler;
            }
        }
예제 #3
0
        /// <summary>
        /// Replaces the first occurance of a handler of type T with the given handler.
        /// </summary>
        /// <typeparam name="T">Type of the handler which will be replaced.</typeparam>
        /// <param name="handler">The handler to be added to the pipeline.</param>
        public void ReplaceHandler <T>(IPipelineHandler handler)
            where T : IPipelineHandler
        {
            if (handler == null)
            {
                throw new ArgumentNullException("handler");
            }

            var type = typeof(T);
            IPipelineHandler previous = null;
            var current = _handler;

            while (current != null)
            {
                if (current.GetType() == type)
                {
                    // Replace current with handler.
                    handler.InnerHandler = current.InnerHandler;
                    handler.OuterHandler = current.OuterHandler;
                    if (previous != null)
                    {
                        // Wireup previous handler
                        previous.InnerHandler = handler;
                    }
                    else
                    {
                        // Current is the top, replace it.
                        _handler = handler;
                    }

                    if (current.InnerHandler != null)
                    {
                        // Wireup next handler
                        current.InnerHandler.OuterHandler = handler;
                    }

                    // Cleanup current
                    current.InnerHandler = null;
                    current.OuterHandler = null;

                    SetHandlerProperties(handler);
                    return;
                }
                previous = current;
                current  = current.InnerHandler;
            }
            throw new InvalidOperationException(
                      string.Format(CultureInfo.InvariantCulture, "Cannot find a handler of type {0}", type.Name));
        }
예제 #4
0
        /// <summary>
        /// Constructor for RuntimePipeline.
        /// </summary>
        /// <param name="handler">The handler with which the pipeline is initalized.</param>
        public RuntimePipeline(IPipelineHandler handler)
        {
            if (handler == null)
            {
                throw new ArgumentNullException("handler");
            }

            var logger =
                Amazon.Runtime.Internal.Util.Logger.GetLogger(typeof(RuntimePipeline));

            _handler        = handler;
            _handler.Logger = logger;

            _logger = logger;
        }
예제 #5
0
    public IPipelineBuilder <T> Use(IPipelineHandler <T> handler)
    {
        _ = handler ?? throw new ArgumentNullException(nameof(handler));

        if (_first is null)
        {
            _first = handler;
            _last  = _first;
        }
        else
        {
            _last.SetNext(handler);
            _last = handler;
        }

        return(this);
    }
예제 #6
0
        public void AddHandler(IPipelineHandler handler)
        {
            if (handler == null)
            {
                throw new ArgumentNullException("handler");
            }
            ThrowIfDisposed();
            IPipelineHandler innermostHandler = GetInnermostHandler(handler);

            if (_handler != null)
            {
                innermostHandler.InnerHandler = _handler;
                _handler.OuterHandler         = innermostHandler;
            }
            _handler = handler;
            SetHandlerProperties(handler);
        }
예제 #7
0
        public XPipelineContext <THandler> AddLast(IPipelineHandler <THandler> handler)
        {
            var context     = new XPipelineContext <THandler>(handler);
            var origin_prev = _last;

            _last = context;

            if (origin_prev != null)
            {
                origin_prev.Next = context;
                context.Prev     = origin_prev;
            }
            if (_head == null)
            {
                _head = origin_prev != null ? origin_prev : _last;
            }
            return(context);
        }
예제 #8
0
        public void AddHandlerAfter <T>(IPipelineHandler handler) where T : IPipelineHandler
        {
            if (handler == null)
            {
                throw new ArgumentNullException("handler");
            }
            ThrowIfDisposed();
            Type typeFromHandle = typeof(T);

            for (IPipelineHandler pipelineHandler = _handler; pipelineHandler != null; pipelineHandler = pipelineHandler.InnerHandler)
            {
                if (pipelineHandler.GetType() == typeFromHandle)
                {
                    InsertHandler(handler, pipelineHandler);
                    SetHandlerProperties(handler);
                    return;
                }
            }
            throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "Cannot find a handler of type {0}", typeFromHandle.Name));
        }
예제 #9
0
        public void ReplaceHandler <T>(IPipelineHandler handler) where T : IPipelineHandler
        {
            if (handler == null)
            {
                throw new ArgumentNullException("handler");
            }
            ThrowIfDisposed();
            Type             typeFromHandle  = typeof(T);
            IPipelineHandler pipelineHandler = null;

            for (IPipelineHandler pipelineHandler2 = _handler; pipelineHandler2 != null; pipelineHandler2 = pipelineHandler2.InnerHandler)
            {
                if (pipelineHandler2.GetType() == typeFromHandle)
                {
                    handler.InnerHandler = pipelineHandler2.InnerHandler;
                    handler.OuterHandler = pipelineHandler2.OuterHandler;
                    if (pipelineHandler != null)
                    {
                        pipelineHandler.InnerHandler = handler;
                    }
                    else
                    {
                        _handler = handler;
                    }
                    if (pipelineHandler2.InnerHandler != null)
                    {
                        pipelineHandler2.InnerHandler.OuterHandler = handler;
                    }
                    pipelineHandler2.InnerHandler = null;
                    pipelineHandler2.OuterHandler = null;
                    SetHandlerProperties(handler);
                    return;
                }
                pipelineHandler = pipelineHandler2;
            }
            throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "Cannot find a handler of type {0}", typeFromHandle.Name));
        }
예제 #10
0
        /// <summary>
        /// Adds a handler before the first instance of handler of type T.
        /// </summary>
        /// <typeparam name="T">Type of the handler before which the given handler instance is added.</typeparam>
        /// <param name="handler">The handler to be added to the pipeline.</param>
        public void AddHandlerBefore <T>(IPipelineHandler handler)
            where T : IPipelineHandler
        {
            if (handler == null)
            {
                throw new ArgumentNullException("handler");
            }

            ThrowIfDisposed();

            var type = typeof(T);

            if (_handler.GetType() == type)
            {
                // Add the handler to the top of the pipeline
                AddHandler(handler);
                SetHandlerProperties(handler);
                return;
            }

            var current = _handler;

            while (current != null)
            {
                if (current.InnerHandler != null &&
                    current.InnerHandler.GetType() == type)
                {
                    InsertHandler(handler, current);
                    SetHandlerProperties(handler);
                    return;
                }
                current = current.InnerHandler;
            }

            throw new InvalidOperationException(
                      string.Format(CultureInfo.InvariantCulture, "Cannot find a handler of type {0}", type.Name));
        }
예제 #11
0
        public XPipelineContext <THandler> AddFirst(IPipelineHandler <THandler> handler)
        {
            var context       = new XPipelineContext <THandler>(handler);
            var _origin_first = _head;

            context.Next = _origin_first;
            _head        = context;
            if (_origin_first != null)
            {
                _origin_first.Prev = _head;
                if (_last == null)
                {
                    _last = _origin_first;
                }
            }
            else
            {
                if (_last == null)
                {
                    _last = context;
                }
            }
            return(context);
        }
예제 #12
0
 public XPipelineContext(IPipelineHandler <THandler> handler)
 {
     _handler = handler;
     Next     = null;
     Prev     = null;
 }
예제 #13
0
 public Pipeline AddHandler(IPipelineHandler handler)
 {
     _pipelineHandlers.Add(new PipelineOption(null, handler));
     return(this);
 }
예제 #14
0
 private void SetHandlerProperties(IPipelineHandler handler)
 {
     handler.Logger = _logger;
 }
예제 #15
0
 public PipelineHandlerCollection Add(IPipelineHandler handler) =>
 AddRange(handler);
예제 #16
0
 public IPipelineHandler <T> SetNext(IPipelineHandler <T> handler)
 {
     _next = handler;
     return(handler);
 }
예제 #17
0
 public PipelineHandlerToDelegatingHandlerConverter(T handler)
 {
     this.handler = handler;
 }
예제 #18
0
 private void SetHandlerProperties(IPipelineHandler handler)
 {
     ThrowIfDisposed();
     handler.Logger = _logger;
 }
예제 #19
0
 public PipelineOption(Func <IPipelineHandler> factory, IPipelineHandler handler)
 {
     _factory = factory;
     _handler = handler;
 }
예제 #20
0
 public Notification(IPipelineHandler handler, string errorMessage)
 {
     Handler      = handler;
     ErrorMessage = errorMessage;
 }
예제 #21
0
 private void SetHandlerProperties(IPipelineHandler handler)
 {
     ThrowIfDisposed();
 }
예제 #22
0
 public PipelineDependencyException(IPipelineHandler handler, params string[] dependencies)
     : base(handler, FormatErrorMessage(handler, dependencies))
 {
 }
예제 #23
0
 public PipelineException(IPipelineHandler pipelineHandler, string message, Exception innerException = null)
     : base(message, innerException)
 {
     PipelineHandler = pipelineHandler;
 }
예제 #24
0
 public static PipelineContext AddNotification(this PipelineContext context, IPipelineHandler handler, string errorMessage) =>
 context.Add(new Notification(handler, errorMessage));
예제 #25
0
 public void AddLast(IPipelineHandler handler)
 {
 }