All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.glassfish.jersey.client.ClientFilteringStages Maven / Gradle / Ivy

Go to download

A bundle project producing JAX-RS RI bundles. The primary artifact is an "all-in-one" OSGi-fied JAX-RS RI bundle (jaxrs-ri.jar). Attached to that are two compressed JAX-RS RI archives. The first archive (jaxrs-ri.zip) consists of binary RI bits and contains the API jar (under "api" directory), RI libraries (under "lib" directory) as well as all external RI dependencies (under "ext" directory). The secondary archive (jaxrs-ri-src.zip) contains buildable JAX-RS RI source bundle and contains the API jar (under "api" directory), RI sources (under "src" directory) as well as all external RI dependencies (under "ext" directory). The second archive also contains "build.xml" ANT script that builds the RI sources. To build the JAX-RS RI simply unzip the archive, cd to the created jaxrs-ri directory and invoke "ant" from the command line.

There is a newer version: 3.1.6
Show newest version
/*
 * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package org.glassfish.jersey.client;

import java.io.IOException;
import java.util.Collections;
import java.util.Iterator;

import jakarta.ws.rs.ProcessingException;
import jakarta.ws.rs.client.ClientRequestFilter;
import jakarta.ws.rs.client.ClientResponseFilter;
import jakarta.ws.rs.client.ResponseProcessingException;
import jakarta.ws.rs.core.Response;

import org.glassfish.jersey.client.internal.routing.ClientResponseMediaTypeDeterminer;
import org.glassfish.jersey.internal.inject.InjectionManager;
import org.glassfish.jersey.internal.inject.Providers;
import org.glassfish.jersey.model.internal.RankedComparator;
import org.glassfish.jersey.process.internal.AbstractChainableStage;
import org.glassfish.jersey.process.internal.ChainableStage;

/**
 * Client filtering stage factory.
 *
 * @author Marek Potociar
 */
class ClientFilteringStages {

    private ClientFilteringStages() {
        // Prevents instantiation
    }

    /**
     * Create client request filtering stage using the injection manager. May return {@code null}.
     *
     * @param injectionManager injection manager to be used.
     * @return configured request filtering stage, or {@code null} in case there are no
     *         {@link ClientRequestFilter client request filters} registered in the injection manager.
     */
    static ChainableStage createRequestFilteringStage(InjectionManager injectionManager) {
        RankedComparator comparator = new RankedComparator<>(RankedComparator.Order.ASCENDING);
        Iterable requestFilters =
                Providers.getAllProviders(injectionManager, ClientRequestFilter.class, comparator);
        return requestFilters.iterator().hasNext() ? new RequestFilteringStage(requestFilters) : null;
    }

    /**
     * Create client request filtering stage using the injection manager. May return {@code null}.
     *
     * @param firstFilter Non null {@link ClientRequestFilter client request filter} to be executed
     *                    in the client request filtering stage.
     * @param injectionManager injection manager to be used.
     * @return configured request filtering stage, or {@code null} in case there are no
     *         {@link ClientRequestFilter client request filters} registered in the injection manager
     *         and {@code firstFilter} is null.
     */
    static ChainableStage createRequestFilteringStage(ClientRequestFilter firstFilter,
                                                                     InjectionManager injectionManager) {
        RankedComparator comparator = new RankedComparator<>(RankedComparator.Order.ASCENDING);
        Iterable requestFilters =
                Providers.getAllProviders(injectionManager, ClientRequestFilter.class, comparator);
        if (firstFilter != null && !requestFilters.iterator().hasNext()) {
            return new RequestFilteringStage(Collections.singletonList(firstFilter));
        } else if (firstFilter != null && requestFilters.iterator().hasNext()) {
            return new RequestFilteringStage(prependFilter(firstFilter, requestFilters));
        }
        return null;
    }

    /**
     * Create client response filtering stage using the injection manager. May return {@code null}.
     *
     * @param injectionManager injection manager to be used.
     * @return configured response filtering stage, or {@code null} in case there are no
     *         {@link ClientResponseFilter client response filters} registered in the injection manager.
     */
    static ChainableStage createResponseFilteringStage(InjectionManager injectionManager) {
        RankedComparator comparator = new RankedComparator<>(RankedComparator.Order.DESCENDING);
        Iterable responseFilters =
                Providers.getAllProviders(injectionManager, ClientResponseFilter.class, comparator);
        return responseFilters.iterator().hasNext() ? new ResponseFilterStage(responseFilters) : null;
    }

    /**
     * Prepend an filter to a given iterable.
     * @param filter to be prepend.
     * @param filters the iterable the given filter is to be prependto
     * @param  filter type
     * @return iterable with first item of prepended filter.
     */
    private static  Iterable prependFilter(T filter, Iterable filters) {
        return new Iterable() {
            @Override
            public Iterator iterator() {
                return new Iterator() {
                    final Iterator filterIterator = filters.iterator();
                    boolean wasInterceptorFilterNext = false;

                    @Override
                    public boolean hasNext() {
                        return !wasInterceptorFilterNext || filterIterator.hasNext();
                    }

                    @Override
                    public T next() {
                        if (wasInterceptorFilterNext) {
                            return filterIterator.next();
                        } else {
                            wasInterceptorFilterNext = true;
                            return filter;
                        }
                    }
                };
            }
        };
    }

    private static final class RequestFilteringStage extends AbstractChainableStage {

        private final Iterable requestFilters;

        private RequestFilteringStage(final Iterable requestFilters) {
            this.requestFilters = requestFilters;
        }

        @Override
        public Continuation apply(ClientRequest requestContext) {
            for (ClientRequestFilter filter : requestFilters) {
                try {
                    filter.filter(requestContext);
                    final Response abortResponse = requestContext.getAbortResponse();
                    if (abortResponse != null) {
                        final ClientResponseMediaTypeDeterminer determiner = new ClientResponseMediaTypeDeterminer(
                                requestContext.getWorkers());
                        determiner.setResponseMediaTypeIfNotSet(abortResponse, requestContext.getConfiguration());
                        throw new AbortException(new ClientResponse(requestContext, abortResponse));
                    }
                } catch (IOException ex) {
                    throw new ProcessingException(ex);
                }
            }
            return Continuation.of(requestContext, getDefaultNext());
        }
    }

    private static class ResponseFilterStage extends AbstractChainableStage {

        private final Iterable filters;

        private ResponseFilterStage(Iterable filters) {
            this.filters = filters;
        }

        @Override
        public Continuation apply(ClientResponse responseContext) {
            try {
                for (ClientResponseFilter filter : filters) {
                    filter.filter(responseContext.getRequestContext(), responseContext);
                }
            } catch (IOException ex) {
                InboundJaxrsResponse response = new InboundJaxrsResponse(responseContext, null);
                throw new ResponseProcessingException(response, ex);
            }

            return Continuation.of(responseContext, getDefaultNext());
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy