blob: d0cd24c31127d92bf00187427803b0c85c8a6b48 [file] [log] [blame]
/*
* Copyright (c) 2019 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.spi;
import org.glassfish.jersey.Beta;
import org.glassfish.jersey.spi.Contract;
import javax.ws.rs.ConstrainedTo;
import javax.ws.rs.RuntimeType;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.CacheControl;
import javax.ws.rs.core.Configuration;
import javax.ws.rs.core.Cookie;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import java.net.URI;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/**
* Implementations of this interface will be notified when a new Invocation.Builder
* is created. This will allow implementations to access the invocation builders,
* and is intended for global providers. For example, the Invocation.Builder properties can be
* accessed to set properties that are available on the {@link javax.ws.rs.client.ClientRequestContext}.
* <p>
* In order for the InvocationBuilderListener to be called, the implementation of the interface needs
* to be registered on the {@code Client} the same way the {@code ClientRequestFilter} is registered, for instance.
*
* If multiple {@code InvocationBuilderListeners} are to be utilized, the order of execution is driven by the {@code Priority},
* the lower the priority value, the higher the priority, the sooner the execution.
*
* @since 2.30
*/
@Beta
@Contract
@ConstrainedTo(RuntimeType.CLIENT)
public interface InvocationBuilderListener {
/**
* An {@link javax.ws.rs.client.Invocation.Builder} subset of setter methods.
*/
public interface InvocationBuilderContext {
/**
* Add the accepted response media types.
*
* @param mediaTypes accepted response media types.
* @return the updated context.
*/
InvocationBuilderContext accept(String... mediaTypes);
/**
* Add the accepted response media types.
*
* @param mediaTypes accepted response media types.
* @return the updated context.
*/
InvocationBuilderContext accept(MediaType... mediaTypes);
/**
* Add acceptable languages.
*
* @param locales an array of the acceptable languages.
* @return the updated context.
*/
InvocationBuilderContext acceptLanguage(Locale... locales);
/**
* Add acceptable languages.
*
* @param locales an array of the acceptable languages.
* @return the updated context.
*/
InvocationBuilderContext acceptLanguage(String... locales);
/**
* Add acceptable encodings.
*
* @param encodings an array of the acceptable encodings.
* @return the updated context.
*/
InvocationBuilderContext acceptEncoding(String... encodings);
/**
* Add a cookie to be set.
*
* @param cookie to be set.
* @return the updated context.
*/
InvocationBuilderContext cookie(Cookie cookie);
/**
* Add a cookie to be set.
*
* @param name the name of the cookie.
* @param value the value of the cookie.
* @return the updated context.
*/
InvocationBuilderContext cookie(String name, String value);
/**
* Set the cache control data of the message.
*
* @param cacheControl the cache control directives, if {@code null}
* any existing cache control directives will be removed.
* @return the updated context.
*/
InvocationBuilderContext cacheControl(CacheControl cacheControl);
/**
* Get the accepted response media types.
*
* @return accepted response media types.
*/
List<String> getAccepted();
/**
* Get acceptable languages.
*
* @return acceptable languages.
*/
List<String> getAcceptedLanguages();
/**
* Get the cache control data of the message.
*
* @return the cache control data of the message.
*/
List<CacheControl> getCacheControls();
/**
* Get runtime configuration.
*
* @return runtime configuration.
*/
Configuration getConfiguration();
/**
* Get any cookies that accompanied the request.
*
* @return a read-only map of cookie name (String) to {@link javax.ws.rs.core.Cookie}.
*/
Map<String, Cookie> getCookies();
/**
* Get acceptable encodings.
*
* @return acceptable encodings.
*/
List<String> getEncodings();
/**
* Get the values of a HTTP request header. The returned List is read-only.
*
* @param name the header name, case insensitive.
* @return a read-only list of header values.
*/
List<String> getHeader(String name);
/**
* Get the mutable message headers multivalued map.
*
* @return mutable multivalued map of message headers.
*/
MultivaluedMap<String, Object> getHeaders();
/**
* Returns the property with the given name registered in the current request/response
* exchange context, or {@code null} if there is no property by that name.
* <p>
* A property allows filters and interceptors to exchange
* additional custom information not already provided by this interface.
* </p>
* <p>
* A list of supported properties can be retrieved using {@link #getPropertyNames()}.
* Custom property names should follow the same convention as package names.
* </p>
*
* @param name a {@code String} specifying the name of the property.
* @return an {@code Object} containing the value of the property, or
* {@code null} if no property exists matching the given name.
* @see #getPropertyNames()
*/
Object getProperty(String name);
/**
* Returns an immutable {@link Collection collection} containing the property names
* available within the context of the current request/response exchange context.
* <p>
* Use the {@link #getProperty} method with a property name to get the value of
* a property.
* </p>
*
* @return an immutable {@link Collection collection} of property names.
* @see #getProperty
*/
Collection<String> getPropertyNames();
/**
* Get the request URI.
*
* @return request URI.
*/
URI getUri();
/**
* Add an arbitrary header.
*
* @param name the name of the header
* @param value the value of the header, the header will be serialized
* using a {@link javax.ws.rs.ext.RuntimeDelegate.HeaderDelegate} if
* one is available via {@link javax.ws.rs.ext.RuntimeDelegate#createHeaderDelegate(java.lang.Class)}
* for the class of {@code value} or using its {@code toString} method
* if a header delegate is not available. If {@code value} is {@code null}
* then all current headers of the same name will be removed.
* @return the updated context.
*/
InvocationBuilderContext header(String name, Object value);
/**
* Replaces all existing headers with the newly supplied headers.
*
* @param headers new headers to be set, if {@code null} all existing
* headers will be removed.
* @return the updated context.
*/
InvocationBuilderContext headers(MultivaluedMap<String, Object> headers);
/**
* Set a new property in the context of a request represented by this invocation builder.
* <p>
* The property is available for a later retrieval via {@link ClientRequestContext#getProperty(String)}
* or {@link javax.ws.rs.ext.InterceptorContext#getProperty(String)}.
* If a property with a given name is already set in the request context,
* the existing value of the property will be updated.
* Setting a {@code null} value into a property effectively removes the property
* from the request property bag.
* </p>
*
* @param name property name.
* @param value (new) property value. {@code null} value removes the property
* with the given name.
* @return the updated context.
* @see Invocation#property(String, Object)
*/
InvocationBuilderContext property(String name, Object value);
/**
* Removes a property with the given name from the current request/response
* exchange context. After removal, subsequent calls to {@link #getProperty}
* to retrieve the property value will return {@code null}.
*
* @param name a {@code String} specifying the name of the property to be removed.
*/
void removeProperty(String name);
}
/**
* Whenever an {@link Invocation.Builder} is created, (i.e. when
* {@link WebTarget#request()}, {@link WebTarget#request(String...)},
* {@link WebTarget#request(MediaType...)} is called), this method would be invoked.
*
* @param context the updated {@link InvocationBuilderContext}.
*/
void onNewBuilder(InvocationBuilderContext context);
}