http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java ---------------------------------------------------------------------- diff --git a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java new file mode 100644 index 0000000..bacbe66 --- /dev/null +++ b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java @@ -0,0 +1,1864 @@ +// *************************************************************************************************************************** +// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file * +// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file * +// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance * +// * with the License. You may obtain a copy of the License at * +// * * +// * http://www.apache.org/licenses/LICENSE-2.0 * +// * * +// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an * +// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * +// * specific language governing permissions and limitations under the License. * +// *************************************************************************************************************************** +package org.apache.juneau.rest.client; + +import static org.apache.juneau.parser.ParserContext.*; +import static org.apache.juneau.serializer.SerializerContext.*; + +import java.lang.reflect.*; +import java.net.*; +import java.security.*; +import java.util.*; +import java.util.concurrent.*; +import java.util.logging.*; + +import javax.net.ssl.*; + +import org.apache.http.*; +import org.apache.http.auth.*; +import org.apache.http.client.*; +import org.apache.http.client.CookieStore; +import org.apache.http.client.config.*; +import org.apache.http.client.entity.*; +import org.apache.http.config.*; +import org.apache.http.conn.*; +import org.apache.http.conn.routing.*; +import org.apache.http.conn.socket.*; +import org.apache.http.conn.ssl.*; +import org.apache.http.conn.util.*; +import org.apache.http.cookie.*; +import org.apache.http.impl.client.*; +import org.apache.http.impl.conn.*; +import org.apache.http.protocol.*; +import org.apache.juneau.*; +import org.apache.juneau.internal.*; +import org.apache.juneau.json.*; +import org.apache.juneau.parser.*; +import org.apache.juneau.serializer.*; +import org.apache.juneau.urlencoding.*; + +/** + * Builder class for {@link RestClient} class. + */ +@SuppressWarnings("hiding") +public class RestClientBuilder extends CoreObjectBuilder { + + private HttpClientConnectionManager httpClientConnectionManager; + private HttpClientBuilder httpClientBuilder = createHttpClientBuilder(); + private CloseableHttpClient httpClient; + private boolean keepHttpClientOpen; + + private Class<? extends Serializer> serializerClass = JsonSerializer.class; + private Class<? extends Parser> parserClass = JsonParser.class; + private Serializer serializer; + private Parser parser; + + private Map<String,String> headers = new TreeMap<String,String>(String.CASE_INSENSITIVE_ORDER); + + private List<RestCallInterceptor> interceptors = new ArrayList<RestCallInterceptor>(); + + private String remoteableServletUri; + private Map<Method,String> remoteableServiceUriMap = new ConcurrentHashMap<Method,String>(); + private String rootUrl; + private SSLOpts sslOpts; + private boolean pooled; + + private int retries = 1; + private long retryInterval = -1; + private RetryOn retryOn = RetryOn.DEFAULT; + + /** + * Constructor, default settings. + */ + public RestClientBuilder() { + super(); + } + + /** + * Constructor, default settings. + * <p> + * Shortcut for calling <code><jk>new</jk> RestClientBuilder().serializer(s).parser(p);</code> + * + * @param s The serializer to use for output. + * @param p The parser to use for input. + */ + public RestClientBuilder(Serializer s, Parser p) { + super(); + serializer(s); + parser(p); + } + + /** + * Constructor, default settings. + * <p> + * Shortcut for calling <code><jk>new</jk> RestClientBuilder().serializer(s).parser(p);</code> + * + * @param s The serializer class to use for output. + * @param p The parser class to use for input. + */ + public RestClientBuilder(Class<? extends Serializer> s, Class<? extends Parser> p) { + super(); + serializer(s); + parser(p); + } + + /** + * Constructor. + * @param propertyStore The initial configuration settings for this builder. + */ + public RestClientBuilder(PropertyStore propertyStore) { + super(propertyStore); + } + + @Override /* CoreObjectBuilder */ + public RestClient build() { + try { + CloseableHttpClient httpClient = this.httpClient; + if (httpClient == null) + httpClient = createHttpClient(); + + Serializer s = + this.serializer != null + ? this.serializer.builder().apply(propertyStore).build() + : new SerializerBuilder(propertyStore).build(this.serializerClass); + + Parser p = + this.parser != null + ? this.parser.builder().apply(propertyStore).build() + : new ParserBuilder(propertyStore).build(this.parserClass); + + UrlEncodingSerializer us = new SerializerBuilder(propertyStore).build(UrlEncodingSerializer.class); + + return new RestClient(propertyStore, httpClient, keepHttpClientOpen, s, p, us, headers, interceptors, remoteableServletUri, remoteableServiceUriMap, rootUrl, retryOn, retries, retryInterval); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * Creates an instance of an {@link HttpClient} to be used to handle all HTTP communications with the target server. + * <p> + * This HTTP client is used when the HTTP client is not specified through one of the constructors or the + * {@link #httpClient(CloseableHttpClient, boolean)} method. + * <p> + * Subclasses can override this method to provide specially-configured HTTP clients to handle + * stuff such as SSL/TLS certificate handling, authentication, etc. + * <p> + * The default implementation returns an instance of {@link HttpClient} using the client builder + * returned by {@link #createHttpClientBuilder()}. + * + * @return The HTTP client to use. + * @throws Exception + */ + protected CloseableHttpClient createHttpClient() throws Exception { + // Don't call createConnectionManager() if RestClient.setConnectionManager() was called. + if (httpClientConnectionManager == null) + httpClientBuilder.setConnectionManager(createConnectionManager()); + return httpClientBuilder.build(); + } + + /** + * Creates an instance of an {@link HttpClientBuilder} to be used to create + * the {@link HttpClient}. + * <p> + * Subclasses can override this method to provide their own client builder. + * <p> + * The predefined method returns an {@link HttpClientBuilder} with the following settings: + * <ul> + * <li>Lax redirect strategy. + * <li>The connection manager returned by {@link #createConnectionManager()}. + * </ul> + * + * @return The HTTP client builder to use to create the HTTP client. + */ + protected HttpClientBuilder createHttpClientBuilder() { + HttpClientBuilder b = HttpClientBuilder.create(); + b.setRedirectStrategy(new AllowAllRedirects()); + return b; + } + + /** + * Creates the {@link HttpClientConnectionManager} returned by {@link #createConnectionManager()}. + * <p> + * Subclasses can override this method to provide their own connection manager. + * <p> + * The default implementation returns an instance of a {@link PoolingHttpClientConnectionManager}. + * + * @return The HTTP client builder to use to create the HTTP client. + */ + protected HttpClientConnectionManager createConnectionManager() { + if (sslOpts != null) { + HostnameVerifier hv = null; + switch (sslOpts.getHostVerify()) { + case LAX: hv = new NoopHostnameVerifier(); break; + case DEFAULT: hv = new DefaultHostnameVerifier(); break; + } + + for (String p : StringUtils.split(sslOpts.getProtocols(), ',')) { + try { + TrustManager tm = new SimpleX509TrustManager(sslOpts.getCertValidate() == SSLOpts.CertValidate.LAX); + + SSLContext ctx = SSLContext.getInstance(p); + ctx.init(null, new TrustManager[] { tm }, null); + + // Create a socket to ensure this algorithm is acceptable. + // This will correctly disallow certain configurations (such as SSL_TLS under FIPS) + ctx.getSocketFactory().createSocket().close(); + SSLConnectionSocketFactory sf = new SSLConnectionSocketFactory(ctx, hv); + setSSLSocketFactory(sf); + + Registry<ConnectionSocketFactory> r = RegistryBuilder.<ConnectionSocketFactory> create().register("https", sf).build(); + + return (pooled ? new PoolingHttpClientConnectionManager(r) : new BasicHttpClientConnectionManager(r)); + } catch (Throwable t) {} + } + } + + // Using pooling connection so that this client is threadsafe. + return (pooled ? new PoolingHttpClientConnectionManager() : new BasicHttpClientConnectionManager()); + } + + /** + * Sets the URI of the remoteable services REST servlet for invoking remoteable services. + * + * @param remoteableServletUri The URI of the REST resource implementing a remoteable services servlet. + * (typically an instance of <code>RemoteableServlet</code>). + * @return This object (for method chaining). + */ + public RestClientBuilder remoteableServletUri(String remoteableServletUri) { + this.remoteableServletUri = remoteableServletUri; + return this; + } + + /** + * Set a root URL for this client. + * <p> + * When set, URL strings passed in through the various rest call methods (e.g. {@link RestClient#doGet(Object)} + * will be prefixed with the specified root. + * This root URL is ignored on those methods if you pass in a {@link URL}, {@link URI}, or an absolute URL string. + * + * @param rootUrl The root URL to prefix to relative URL strings. Trailing slashes are trimmed. + * Usually a <code>String<code> but you can also pass in <code>URI</code> and <code>URL</code> objects as well. + * @return This object (for method chaining). + */ + public RestClientBuilder rootUrl(Object rootUrl) { + String s = rootUrl.toString(); + if (s.endsWith("/")) + s = s.replaceAll("\\/$", ""); + this.rootUrl = s; + return this; + } + + /** + * Enable SSL support on this client. + * + * @param opts The SSL configuration options. See {@link SSLOpts} for details. + * This method is a no-op if <code>sslConfig</code> is <jk>null</jk>. + * @return This object (for method chaining). + * @throws KeyStoreException + * @throws NoSuchAlgorithmException + */ + public RestClientBuilder enableSSL(SSLOpts opts) throws KeyStoreException, NoSuchAlgorithmException { + this.sslOpts = opts; + return this; + } + + /** + * Enable LAX SSL support. + * <p> + * Certificate chain validation and hostname verification is disabled. + * + * @return This object (for method chaining). + * @throws KeyStoreException + * @throws NoSuchAlgorithmException + */ + public RestClientBuilder enableLaxSSL() throws KeyStoreException, NoSuchAlgorithmException { + return enableSSL(SSLOpts.LAX); + } + + /** + * Sets the client version by setting the value for the <js>"X-Client-Version"</js> header. + * + * @param version The version string (e.g. <js>"1.2.3"</js>) + * @return This object (for method chaining). + */ + public RestClientBuilder clientVersion(String version) { + return header("X-Client-Version", version); + } + + /** + * Adds an interceptor that gets called immediately after a connection is made. + * + * @param interceptor The interceptor. + * @return This object (for method chaining). + */ + public RestClientBuilder interceptor(RestCallInterceptor interceptor) { + interceptors.add(interceptor); + return this; + } + + /** + * Adds a {@link RestCallLogger} to the list of interceptors on this class. + * + * @param level The log level to log messsages at. + * @param log The logger to log messages to. + * @return This object (for method chaining). + */ + public RestClientBuilder logTo(Level level, Logger log) { + interceptor(new RestCallLogger(level, log)); + return this; + } + + /** + * Make HTTP calls retryable if an error response (>=400) is received. + * + * @param retries The number of retries to attempt. + * @param interval The time in milliseconds between attempts. + * @param retryOn Optional object used for determining whether a retry should be attempted. + * If <jk>null</jk>, uses {@link RetryOn#DEFAULT}. + * @return This object (for method chaining). + */ + public RestClientBuilder retryable(int retries, long interval, RetryOn retryOn) { + this.retries = retries; + this.retryInterval = interval; + this.retryOn = retryOn; + return this; + } + + /** + * When called, the {@link #createConnectionManager()} method will return a {@link PoolingHttpClientConnectionManager} + * instead of a {@link BasicHttpClientConnectionManager}. + * + * @return This object (for method chaining). + */ + public RestClientBuilder pooled() { + this.pooled = true; + return this; + } + + /** + * Sets the serializer used for serializing POJOs to the HTTP request message body. + * + * @param serializer The serializer. + * @return This object (for method chaining). + */ + public RestClientBuilder serializer(Serializer serializer) { + this.serializer = serializer; + return this; + } + + /** + * Same as {@link #serializer(Serializer)}, except takes in a serializer class that + * will be instantiated through a no-arg constructor. + * + * @param serializerClass The serializer class. + * @return This object (for method chaining). + */ + public RestClientBuilder serializer(Class<? extends Serializer> serializerClass) { + this.serializerClass = serializerClass; + return this; + } + + /** + * Sets the parser used for parsing POJOs from the HTTP response message body. + * + * @param parser The parser. + * @return This object (for method chaining). + */ + public RestClientBuilder parser(Parser parser) { + this.parser = parser; + return this; + } + + /** + * Same as {@link #parser(Parser)}, except takes in a parser class that + * will be instantiated through a no-arg constructor. + * + * @param parserClass The parser class. + * @return This object (for method chaining). + */ + public RestClientBuilder parser(Class<? extends Parser> parserClass) { + this.parserClass = parserClass; + return this; + } + + /** + * Set up this client to use BASIC auth. + * + * @param host The auth scope hostname. + * @param port The auth scope port. + * @param user The username. + * @param pw The password. + * @return This object (for method chaining). + */ + public RestClientBuilder basicAuth(String host, int port, String user, String pw) { + AuthScope scope = new AuthScope(host, port); + Credentials up = new UsernamePasswordCredentials(user, pw); + CredentialsProvider p = new BasicCredentialsProvider(); + p.setCredentials(scope, up); + setDefaultCredentialsProvider(p); + return this; + } + + /** + * Sets the internal {@link HttpClient} to use for handling HTTP communications. + * + * @param httpClient The HTTP client. + * @param keepHttpClientOpen Don't close this client when the {@link RestClient#close()} method is called. + * @return This object (for method chaining). + */ + public RestClientBuilder httpClient(CloseableHttpClient httpClient, boolean keepHttpClientOpen) { + this.httpClient = httpClient; + this.keepHttpClientOpen = keepHttpClientOpen; + return this; + } + + + //-------------------------------------------------------------------------------- + // HTTP headers + //-------------------------------------------------------------------------------- + + /** + * Specifies a request header property to add to all requests created by this client. + * + * @param name The HTTP header name. + * @param value The HTTP header value. + * @return This object (for method chaining). + */ + public RestClientBuilder header(String name, Object value) { + this.headers.put(name, value == null ? null : value.toString()); + return this; + } + + /** + * Sets the value for the <code>Accept</code> request header. + * <p> + * This overrides the media type specified on the parser, but is overridden by calling <code>header(<js>"Accept"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder accept(Object value) { + return header("Accept", value); + } + + /** + * Sets the value for the <code>Accept-Charset</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Accept-Charset"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder acceptCharset(Object value) { + return header("Accept-Charset", value); + } + + /** + * Sets the value for the <code>Accept-Encoding</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Accept-Encoding"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder acceptEncoding(Object value) { + return header("Accept-Encoding", value); + } + + /** + * Sets the value for the <code>Accept-Language</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Accept-Language"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder acceptLanguage(Object value) { + return header("Accept-Language", value); + } + + /** + * Sets the value for the <code>Authorization</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Authorization"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder authorization(Object value) { + return header("Authorization", value); + } + + /** + * Sets the value for the <code>Cache-Control</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Cache-Control"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder cacheControl(Object value) { + return header("Cache-Control", value); + } + + /** + * Sets the value for the <code>Connection</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Connection"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder connection(Object value) { + return header("Connection", value); + } + + /** + * Sets the value for the <code>Content-Length</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Content-Length"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder contentLength(Object value) { + return header("Content-Length", value); + } + + /** + * Sets the value for the <code>Content-Type</code> request header. + * <p> + * This overrides the media type specified on the serializer, but is overridden by calling <code>header(<js>"Content-Type"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder contentType(Object value) { + return header("Content-Type", value); + } + + /** + * Sets the value for the <code>Date</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Date"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder date(Object value) { + return header("Date", value); + } + + /** + * Sets the value for the <code>Expect</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Expect"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder expect(Object value) { + return header("Expect", value); + } + + /** + * Sets the value for the <code>Forwarded</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Forwarded"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder forwarded(Object value) { + return header("Forwarded", value); + } + + /** + * Sets the value for the <code>From</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"From"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder from(Object value) { + return header("From", value); + } + + /** + * Sets the value for the <code>Host</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Host"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder host(Object value) { + return header("Host", value); + } + + /** + * Sets the value for the <code>If-Match</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"If-Match"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder ifMatch(Object value) { + return header("If-Match", value); + } + + /** + * Sets the value for the <code>If-Modified-Since</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"If-Modified-Since"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder ifModifiedSince(Object value) { + return header("If-Modified-Since", value); + } + + /** + * Sets the value for the <code>If-None-Match</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"If-None-Match"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder ifNoneMatch(Object value) { + return header("If-None-Match", value); + } + + /** + * Sets the value for the <code>If-Range</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"If-Range"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder ifRange(Object value) { + return header("If-Range", value); + } + + /** + * Sets the value for the <code>If-Unmodified-Since</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"If-Unmodified-Since"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder ifUnmodifiedSince(Object value) { + return header("If-Unmodified-Since", value); + } + + /** + * Sets the value for the <code>Max-Forwards</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Max-Forwards"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder maxForwards(Object value) { + return header("If-Unmodified-Since", value); + } + + /** + * Sets the value for the <code>Origin</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Origin"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder origin(Object value) { + return header("If-Unmodified-Since", value); + } + + /** + * Sets the value for the <code>Pragma</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Pragma"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder pragma(Object value) { + return header("Pragma", value); + } + + /** + * Sets the value for the <code>Proxy-Authorization</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Proxy-Authorization"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder proxyAuthorization(Object value) { + return header("Proxy-Authorization", value); + } + + /** + * Sets the value for the <code>Range</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Range"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder range(Object value) { + return header("Range", value); + } + + /** + * Sets the value for the <code>Referer</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Referer"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder referer(Object value) { + return header("Referer", value); + } + + /** + * Sets the value for the <code>TE</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"TE"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder te(Object value) { + return header("TE", value); + } + + /** + * Sets the value for the <code>User-Agent</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"User-Agent"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder userAgent(Object value) { + return header("User-Agent", value); + } + + /** + * Sets the value for the <code>Upgrade</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Upgrade"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder upgrade(Object value) { + return header("Upgrade", value); + } + + /** + * Sets the value for the <code>Via</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Via"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder via(Object value) { + return header("Via", value); + } + + /** + * Sets the value for the <code>Warning</code> request header. + * <p> + * This is a shortcut for calling <code>header(<js>"Warning"</js>, value);</code> + * + * @param value The new header value. + * @return This object (for method chaining). + */ + public RestClientBuilder warning(Object value) { + return header("Warning", value); + } + + + //-------------------------------------------------------------------------------- + // CoreObject properties + //-------------------------------------------------------------------------------- + + /** + * Sets the {@link SerializerContext#SERIALIZER_maxDepth} property on all serializers in this group. + * + * @param value The new value for this property. + * @return This object (for method chaining). + * @see SerializerContext#SERIALIZER_maxDepth + */ + public RestClientBuilder maxDepth(int value) { + return property(SERIALIZER_maxDepth, value); + } + + /** + * Sets the {@link SerializerContext#SERIALIZER_initialDepth} property on all serializers in this group. + * + * @param value The new value for this property. + * @return This object (for method chaining). + * @see SerializerContext#SERIALIZER_initialDepth + */ + public RestClientBuilder initialDepth(int value) { + return property(SERIALIZER_initialDepth, value); + } + + /** + * Sets the {@link SerializerContext#SERIALIZER_detectRecursions} property on all serializers in this group. + * + * @param value The new value for this property. + * @return This object (for method chaining). + * @see SerializerContext#SERIALIZER_detectRecursions + */ + public RestClientBuilder detectRecursions(boolean value) { + return property(SERIALIZER_detectRecursions, value); + } + + /** + * Sets the {@link SerializerContext#SERIALIZER_ignoreRecursions} property on all serializers in this group. + * + * @param value The new value for this property. + * @return This object (for method chaining). + * @see SerializerContext#SERIALIZER_ignoreRecursions + */ + public RestClientBuilder ignoreRecursions(boolean value) { + return property(SERIALIZER_ignoreRecursions, value); + } + + /** + * Sets the {@link SerializerContext#SERIALIZER_useWhitespace} property on all serializers in this group. + * + * @param value The new value for this property. + * @return This object (for method chaining). + * @see SerializerContext#SERIALIZER_useWhitespace + */ + public RestClientBuilder useWhitespace(boolean value) { + return property(SERIALIZER_useWhitespace, value); + } + + /** + * Sets the {@link SerializerContext#SERIALIZER_addBeanTypeProperties} property on all serializers in this group. + * + * @param value The new value for this property. + * @return This object (for method chaining). + * @see SerializerContext#SERIALIZER_addBeanTypeProperties + */ + public RestClientBuilder addBeanTypeProperties(boolean value) { + return property(SERIALIZER_addBeanTypeProperties, value); + } + + /** + * Sets the {@link SerializerContext#SERIALIZER_quoteChar} property on all serializers in this group. + * + * @param value The new value for this property. + * @return This object (for method chaining). + * @see SerializerContext#SERIALIZER_quoteChar + */ + public RestClientBuilder quoteChar(char value) { + return property(SERIALIZER_quoteChar, value); + } + + /** + * Sets the {@link SerializerContext#SERIALIZER_trimNullProperties} property on all serializers in this group. + * + * @param value The new value for this property. + * @return This object (for method chaining). + * @see SerializerContext#SERIALIZER_trimNullProperties + */ + public RestClientBuilder trimNullProperties(boolean value) { + return property(SERIALIZER_trimNullProperties, value); + } + + /** + * Sets the {@link SerializerContext#SERIALIZER_trimEmptyCollections} property on all serializers in this group. + * + * @param value The new value for this property. + * @return This object (for method chaining). + * @see SerializerContext#SERIALIZER_trimEmptyCollections + */ + public RestClientBuilder trimEmptyCollections(boolean value) { + return property(SERIALIZER_trimEmptyCollections, value); + } + + /** + * Sets the {@link SerializerContext#SERIALIZER_trimEmptyMaps} property on all serializers in this group. + * + * @param value The new value for this property. + * @return This object (for method chaining). + * @see SerializerContext#SERIALIZER_trimEmptyMaps + */ + public RestClientBuilder trimEmptyMaps(boolean value) { + return property(SERIALIZER_trimEmptyMaps, value); + } + + /** + * Sets the {@link SerializerContext#SERIALIZER_trimStrings} property on all serializers in this group. + * + * @param value The new value for this property. + * @return This object (for method chaining). + * @see SerializerContext#SERIALIZER_trimStrings + */ + public RestClientBuilder trimStringsS(boolean value) { + return property(SERIALIZER_trimStrings, value); + } + + /** + * Sets the {@link SerializerContext#SERIALIZER_relativeUriBase} property on all serializers in this group. + * + * @param value The new value for this property. + * @return This object (for method chaining). + * @see SerializerContext#SERIALIZER_relativeUriBase + */ + public RestClientBuilder relativeUriBase(String value) { + return property(SERIALIZER_relativeUriBase, value); + } + + /** + * Sets the {@link SerializerContext#SERIALIZER_absolutePathUriBase} property on all serializers in this group. + * + * @param value The new value for this property. + * @return This object (for method chaining). + * @see SerializerContext#SERIALIZER_absolutePathUriBase + */ + public RestClientBuilder absolutePathUriBase(String value) { + return property(SERIALIZER_absolutePathUriBase, value); + } + + /** + * Sets the {@link SerializerContext#SERIALIZER_sortCollections} property on all serializers in this group. + * + * @param value The new value for this property. + * @return This object (for method chaining). + * @see SerializerContext#SERIALIZER_sortCollections + */ + public RestClientBuilder sortCollections(boolean value) { + return property(SERIALIZER_sortCollections, value); + } + + /** + * Sets the {@link SerializerContext#SERIALIZER_sortMaps} property on all serializers in this group. + * + * @param value The new value for this property. + * @return This object (for method chaining). + * @see SerializerContext#SERIALIZER_sortMaps + */ + public RestClientBuilder sortMaps(boolean value) { + return property(SERIALIZER_sortMaps, value); + } + + /** + * Sets the {@link ParserContext#PARSER_trimStrings} property on all parsers in this group. + * + * @param value The new value for this property. + * @return This object (for method chaining). + * @see ParserContext#PARSER_trimStrings + */ + public RestClientBuilder trimStringsP(boolean value) { + return property(PARSER_trimStrings, value); + } + + /** + * Sets the {@link ParserContext#PARSER_strict} property on all parsers in this group. + * + * @param value The new value for this property. + * @return This object (for method chaining). + * @see ParserContext#PARSER_strict + */ + public RestClientBuilder strict(boolean value) { + return property(PARSER_strict, value); + } + + /** + * Sets the {@link ParserContext#PARSER_inputStreamCharset} property on all parsers in this group. + * + * @param value The new value for this property. + * @return This object (for method chaining). + * @see ParserContext#PARSER_inputStreamCharset + */ + public RestClientBuilder inputStreamCharset(String value) { + return property(PARSER_inputStreamCharset, value); + } + + /** + * Sets the {@link ParserContext#PARSER_fileCharset} property on all parsers in this group. + * + * @param value The new value for this property. + * @return This object (for method chaining). + * @see ParserContext#PARSER_fileCharset + */ + public RestClientBuilder fileCharset(String value) { + return property(PARSER_fileCharset, value); + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder beansRequireDefaultConstructor(boolean value) { + super.beansRequireDefaultConstructor(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder beansRequireSerializable(boolean value) { + super.beansRequireSerializable(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder beansRequireSettersForGetters(boolean value) { + super.beansRequireSettersForGetters(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder beansRequireSomeProperties(boolean value) { + super.beansRequireSomeProperties(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder beanMapPutReturnsOldValue(boolean value) { + super.beanMapPutReturnsOldValue(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder beanConstructorVisibility(Visibility value) { + super.beanConstructorVisibility(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder beanClassVisibility(Visibility value) { + super.beanClassVisibility(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder beanFieldVisibility(Visibility value) { + super.beanFieldVisibility(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder methodVisibility(Visibility value) { + super.methodVisibility(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder useJavaBeanIntrospector(boolean value) { + super.useJavaBeanIntrospector(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder useInterfaceProxies(boolean value) { + super.useInterfaceProxies(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder ignoreUnknownBeanProperties(boolean value) { + super.ignoreUnknownBeanProperties(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder ignoreUnknownNullBeanProperties(boolean value) { + super.ignoreUnknownNullBeanProperties(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder ignorePropertiesWithoutSetters(boolean value) { + super.ignorePropertiesWithoutSetters(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder ignoreInvocationExceptionsOnGetters(boolean value) { + super.ignoreInvocationExceptionsOnGetters(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder ignoreInvocationExceptionsOnSetters(boolean value) { + super.ignoreInvocationExceptionsOnSetters(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder sortProperties(boolean value) { + super.sortProperties(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder notBeanPackages(String...values) { + super.notBeanPackages(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder notBeanPackages(Collection<String> values) { + super.notBeanPackages(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder setNotBeanPackages(String...values) { + super.setNotBeanPackages(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder setNotBeanPackages(Collection<String> values) { + super.setNotBeanPackages(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder removeNotBeanPackages(String...values) { + super.removeNotBeanPackages(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder removeNotBeanPackages(Collection<String> values) { + super.removeNotBeanPackages(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder notBeanClasses(Class<?>...values) { + super.notBeanClasses(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder notBeanClasses(Collection<Class<?>> values) { + super.notBeanClasses(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder setNotBeanClasses(Class<?>...values) { + super.setNotBeanClasses(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder setNotBeanClasses(Collection<Class<?>> values) { + super.setNotBeanClasses(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder removeNotBeanClasses(Class<?>...values) { + super.removeNotBeanClasses(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder removeNotBeanClasses(Collection<Class<?>> values) { + super.removeNotBeanClasses(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder beanFilters(Class<?>...values) { + super.beanFilters(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder beanFilters(Collection<Class<?>> values) { + super.beanFilters(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder setBeanFilters(Class<?>...values) { + super.setBeanFilters(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder setBeanFilters(Collection<Class<?>> values) { + super.setBeanFilters(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder removeBeanFilters(Class<?>...values) { + super.removeBeanFilters(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder removeBeanFilters(Collection<Class<?>> values) { + super.removeBeanFilters(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder pojoSwaps(Class<?>...values) { + super.pojoSwaps(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder pojoSwaps(Collection<Class<?>> values) { + super.pojoSwaps(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder setPojoSwaps(Class<?>...values) { + super.setPojoSwaps(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder setPojoSwaps(Collection<Class<?>> values) { + super.setPojoSwaps(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder removePojoSwaps(Class<?>...values) { + super.removePojoSwaps(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder removePojoSwaps(Collection<Class<?>> values) { + super.removePojoSwaps(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder implClasses(Map<Class<?>,Class<?>> values) { + super.implClasses(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public <T> RestClientBuilder implClass(Class<T> interfaceClass, Class<? extends T> implClass) { + super.implClass(interfaceClass, implClass); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder beanDictionary(Class<?>...values) { + super.beanDictionary(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder beanDictionary(Collection<Class<?>> values) { + super.beanDictionary(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder setBeanDictionary(Class<?>...values) { + super.setBeanDictionary(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder setBeanDictionary(Collection<Class<?>> values) { + super.setBeanDictionary(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder removeFromBeanDictionary(Class<?>...values) { + super.removeFromBeanDictionary(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder removeFromBeanDictionary(Collection<Class<?>> values) { + super.removeFromBeanDictionary(values); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder beanTypePropertyName(String value) { + super.beanTypePropertyName(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder defaultParser(Class<?> value) { + super.defaultParser(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder locale(Locale value) { + super.locale(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder timeZone(TimeZone value) { + super.timeZone(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder mediaType(MediaType value) { + super.mediaType(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder debug(boolean value) { + super.debug(value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder property(String name, Object value) { + super.property(name, value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder properties(Map<String,Object> properties) { + super.properties(properties); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder addToProperty(String name, Object value) { + super.addToProperty(name, value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder putToProperty(String name, Object key, Object value) { + super.putToProperty(name, key, value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder putToProperty(String name, Object value) { + super.putToProperty(name, value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder removeFromProperty(String name, Object value) { + super.removeFromProperty(name, value); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder classLoader(ClassLoader classLoader) { + super.classLoader(classLoader); + return this; + } + + @Override /* CoreObjectBuilder */ + public RestClientBuilder apply(PropertyStore copyFrom) { + super.apply(copyFrom); + return this; + } + + + //------------------------------------------------------------------------------------------------ + // Passthrough methods for HttpClientBuilder. + //------------------------------------------------------------------------------------------------ + + /** + * @param redirectStrategy + * @return This object (for method chaining). + * @see HttpClientBuilder#setRedirectStrategy(RedirectStrategy) + */ + public RestClientBuilder setRedirectStrategy(RedirectStrategy redirectStrategy) { + httpClientBuilder.setRedirectStrategy(redirectStrategy); + return this; + } + + /** + * @param cookieSpecRegistry + * @return This object (for method chaining). + * @see HttpClientBuilder#setDefaultCookieSpecRegistry(Lookup) + */ + public RestClientBuilder setDefaultCookieSpecRegistry(Lookup<CookieSpecProvider> cookieSpecRegistry) { + httpClientBuilder.setDefaultCookieSpecRegistry(cookieSpecRegistry); + return this; + } + + /** + * @param requestExec + * @return This object (for method chaining). + * @see HttpClientBuilder#setRequestExecutor(HttpRequestExecutor) + */ + public RestClientBuilder setRequestExecutor(HttpRequestExecutor requestExec) { + httpClientBuilder.setRequestExecutor(requestExec); + return this; + } + + /** + * @param hostnameVerifier + * @return This object (for method chaining). + * @see HttpClientBuilder#setSSLHostnameVerifier(HostnameVerifier) + */ + public RestClientBuilder setSSLHostnameVerifier(HostnameVerifier hostnameVerifier) { + httpClientBuilder.setSSLHostnameVerifier(hostnameVerifier); + return this; + } + + /** + * @param publicSuffixMatcher + * @return This object (for method chaining). + * @see HttpClientBuilder#setPublicSuffixMatcher(PublicSuffixMatcher) + */ + public RestClientBuilder setPublicSuffixMatcher(PublicSuffixMatcher publicSuffixMatcher) { + httpClientBuilder.setPublicSuffixMatcher(publicSuffixMatcher); + return this; + } + + /** + * @param sslContext + * @return This object (for method chaining). + * @see HttpClientBuilder#setSSLContext(SSLContext) + */ + public RestClientBuilder setSSLContext(SSLContext sslContext) { + httpClientBuilder.setSSLContext(sslContext); + return this; + } + + /** + * @param sslSocketFactory + * @return This object (for method chaining). + * @see HttpClientBuilder#setSSLSocketFactory(LayeredConnectionSocketFactory) + */ + public RestClientBuilder setSSLSocketFactory(LayeredConnectionSocketFactory sslSocketFactory) { + httpClientBuilder.setSSLSocketFactory(sslSocketFactory); + return this; + } + + /** + * @param maxConnTotal + * @return This object (for method chaining). + * @see HttpClientBuilder#setMaxConnTotal(int) + */ + public RestClientBuilder setMaxConnTotal(int maxConnTotal) { + httpClientBuilder.setMaxConnTotal(maxConnTotal); + return this; + } + + /** + * @param maxConnPerRoute + * @return This object (for method chaining). + * @see HttpClientBuilder#setMaxConnPerRoute(int) + */ + public RestClientBuilder setMaxConnPerRoute(int maxConnPerRoute) { + httpClientBuilder.setMaxConnPerRoute(maxConnPerRoute); + return this; + } + + /** + * @param config + * @return This object (for method chaining). + * @see HttpClientBuilder#setDefaultSocketConfig(SocketConfig) + */ + public RestClientBuilder setDefaultSocketConfig(SocketConfig config) { + httpClientBuilder.setDefaultSocketConfig(config); + return this; + } + + /** + * @param config + * @return This object (for method chaining). + * @see HttpClientBuilder#setDefaultConnectionConfig(ConnectionConfig) + */ + public RestClientBuilder setDefaultConnectionConfig(ConnectionConfig config) { + httpClientBuilder.setDefaultConnectionConfig(config); + return this; + } + + /** + * @param connTimeToLive + * @param connTimeToLiveTimeUnit + * @return This object (for method chaining). + * @see HttpClientBuilder#setConnectionTimeToLive(long,TimeUnit) + */ + public RestClientBuilder setConnectionTimeToLive(long connTimeToLive, TimeUnit connTimeToLiveTimeUnit) { + httpClientBuilder.setConnectionTimeToLive(connTimeToLive, connTimeToLiveTimeUnit); + return this; + } + + /** + * @param connManager + * @return This object (for method chaining). + * @see HttpClientBuilder#setConnectionManager(HttpClientConnectionManager) + */ + public RestClientBuilder setConnectionManager(HttpClientConnectionManager connManager) { + this.httpClientConnectionManager = connManager; + httpClientBuilder.setConnectionManager(connManager); + return this; + } + + /** + * @param shared + * @return This object (for method chaining). + * @see HttpClientBuilder#setConnectionManagerShared(boolean) + */ + public RestClientBuilder setConnectionManagerShared(boolean shared) { + httpClientBuilder.setConnectionManagerShared(shared); + return this; + } + + /** + * @param reuseStrategy + * @return This object (for method chaining). + * @see HttpClientBuilder#setConnectionReuseStrategy(ConnectionReuseStrategy) + */ + public RestClientBuilder setConnectionReuseStrategy(ConnectionReuseStrategy reuseStrategy) { + httpClientBuilder.setConnectionReuseStrategy(reuseStrategy); + return this; + } + + /** + * @param keepAliveStrategy + * @return This object (for method chaining). + * @see HttpClientBuilder#setKeepAliveStrategy(ConnectionKeepAliveStrategy) + */ + public RestClientBuilder setKeepAliveStrategy(ConnectionKeepAliveStrategy keepAliveStrategy) { + httpClientBuilder.setKeepAliveStrategy(keepAliveStrategy); + return this; + } + + /** + * @param targetAuthStrategy + * @return This object (for method chaining). + * @see HttpClientBuilder#setTargetAuthenticationStrategy(AuthenticationStrategy) + */ + public RestClientBuilder setTargetAuthenticationStrategy(AuthenticationStrategy targetAuthStrategy) { + httpClientBuilder.setTargetAuthenticationStrategy(targetAuthStrategy); + return this; + } + + /** + * @param proxyAuthStrategy + * @return This object (for method chaining). + * @see HttpClientBuilder#setProxyAuthenticationStrategy(AuthenticationStrategy) + */ + public RestClientBuilder setProxyAuthenticationStrategy(AuthenticationStrategy proxyAuthStrategy) { + httpClientBuilder.setProxyAuthenticationStrategy(proxyAuthStrategy); + return this; + } + + /** + * @param userTokenHandler + * @return This object (for method chaining). + * @see HttpClientBuilder#setUserTokenHandler(UserTokenHandler) + */ + public RestClientBuilder setUserTokenHandler(UserTokenHandler userTokenHandler) { + httpClientBuilder.setUserTokenHandler(userTokenHandler); + return this; + } + + /** + * @return This object (for method chaining). + * @see HttpClientBuilder#disableConnectionState() + */ + public RestClientBuilder disableConnectionState() { + httpClientBuilder.disableConnectionState(); + return this; + } + + /** + * @param schemePortResolver + * @return This object (for method chaining). + * @see HttpClientBuilder#setSchemePortResolver(SchemePortResolver) + */ + public RestClientBuilder setSchemePortResolver(SchemePortResolver schemePortResolver) { + httpClientBuilder.setSchemePortResolver(schemePortResolver); + return this; + } + + /** + * @param userAgent + * @return This object (for method chaining). + * @see HttpClientBuilder#setUserAgent(String) + */ + public RestClientBuilder setUserAgent(String userAgent) { + httpClientBuilder.setUserAgent(userAgent); + return this; + } + + /** + * @param defaultHeaders + * @return This object (for method chaining). + * @see HttpClientBuilder#setDefaultHeaders(Collection) + */ + public RestClientBuilder setDefaultHeaders(Collection<? extends Header> defaultHeaders) { + httpClientBuilder.setDefaultHeaders(defaultHeaders); + return this; + } + + /** + * @param itcp + * @return This object (for method chaining). + * @see HttpClientBuilder#addInterceptorFirst(HttpResponseInterceptor) + */ + public RestClientBuilder addInterceptorFirst(HttpResponseInterceptor itcp) { + httpClientBuilder.addInterceptorFirst(itcp); + return this; + } + + /** + * @param itcp + * @return This object (for method chaining). + * @see HttpClientBuilder#addInterceptorLast(HttpResponseInterceptor) + */ + public RestClientBuilder addInterceptorLast(HttpResponseInterceptor itcp) { + httpClientBuilder.addInterceptorLast(itcp); + return this; + } + + /** + * @param itcp + * @return This object (for method chaining). + * @see HttpClientBuilder#addInterceptorFirst(HttpRequestInterceptor) + */ + public RestClientBuilder addInterceptorFirst(HttpRequestInterceptor itcp) { + httpClientBuilder.addInterceptorFirst(itcp); + return this; + } + + /** + * @param itcp + * @return This object (for method chaining). + * @see HttpClientBuilder#addInterceptorLast(HttpRequestInterceptor) + */ + public RestClientBuilder addInterceptorLast(HttpRequestInterceptor itcp) { + httpClientBuilder.addInterceptorLast(itcp); + return this; + } + + /** + * @return This object (for method chaining). + * @see HttpClientBuilder#disableCookieManagement() + */ + public RestClientBuilder disableCookieManagement() { + httpClientBuilder.disableCookieManagement(); + return this; + } + + /** + * @return This object (for method chaining). + * @see HttpClientBuilder#disableContentCompression() + */ + public RestClientBuilder disableContentCompression() { + httpClientBuilder.disableContentCompression(); + return this; + } + + /** + * @return This object (for method chaining). + * @see HttpClientBuilder#disableAuthCaching() + */ + public RestClientBuilder disableAuthCaching() { + httpClientBuilder.disableAuthCaching(); + return this; + } + + /** + * @param httpprocessor + * @return This object (for method chaining). + * @see HttpClientBuilder#setHttpProcessor(HttpProcessor) + */ + public RestClientBuilder setHttpProcessor(HttpProcessor httpprocessor) { + httpClientBuilder.setHttpProcessor(httpprocessor); + return this; + } + + /** + * @param retryHandler + * @return This object (for method chaining). + * @see HttpClientBuilder#setRetryHandler(HttpRequestRetryHandler) + */ + public RestClientBuilder setRetryHandler(HttpRequestRetryHandler retryHandler) { + httpClientBuilder.setRetryHandler(retryHandler); + return this; + } + + /** + * @return This object (for method chaining). + * @see HttpClientBuilder#disableAutomaticRetries() + */ + public RestClientBuilder disableAutomaticRetries() { + httpClientBuilder.disableAutomaticRetries(); + return this; + } + + /** + * @param proxy + * @return This object (for method chaining). + * @see HttpClientBuilder#setProxy(HttpHost) + */ + public RestClientBuilder setProxy(HttpHost proxy) { + httpClientBuilder.setProxy(proxy); + return this; + } + + /** + * @param routePlanner + * @return This object (for method chaining). + * @see HttpClientBuilder#setRoutePlanner(HttpRoutePlanner) + */ + public RestClientBuilder setRoutePlanner(HttpRoutePlanner routePlanner) { + httpClientBuilder.setRoutePlanner(routePlanner); + return this; + } + + /** + * @return This object (for method chaining). + * @see HttpClientBuilder#disableRedirectHandling() + */ + public RestClientBuilder disableRedirectHandling() { + httpClientBuilder.disableRedirectHandling(); + return this; + } + + /** + * @param connectionBackoffStrategy + * @return This object (for method chaining). + * @see HttpClientBuilder#setConnectionBackoffStrategy(ConnectionBackoffStrategy) + */ + public RestClientBuilder setConnectionBackoffStrategy(ConnectionBackoffStrategy connectionBackoffStrategy) { + httpClientBuilder.setConnectionBackoffStrategy(connectionBackoffStrategy); + return this; + } + + /** + * @param backoffManager + * @return This object (for method chaining). + * @see HttpClientBuilder#setBackoffManager(BackoffManager) + */ + public RestClientBuilder setBackoffManager(BackoffManager backoffManager) { + httpClientBuilder.setBackoffManager(backoffManager); + return this; + } + + /** + * @param serviceUnavailStrategy + * @return This object (for method chaining). + * @see HttpClientBuilder#setServiceUnavailableRetryStrategy(ServiceUnavailableRetryStrategy) + */ + public RestClientBuilder setServiceUnavailableRetryStrategy(ServiceUnavailableRetryStrategy serviceUnavailStrategy) { + httpClientBuilder.setServiceUnavailableRetryStrategy(serviceUnavailStrategy); + return this; + } + + /** + * @param cookieStore + * @return This object (for method chaining). + * @see HttpClientBuilder#setDefaultCookieStore(CookieStore) + */ + public RestClientBuilder setDefaultCookieStore(CookieStore cookieStore) { + httpClientBuilder.setDefaultCookieStore(cookieStore); + return this; + } + + /** + * @param credentialsProvider + * @return This object (for method chaining). + * @see HttpClientBuilder#setDefaultCredentialsProvider(CredentialsProvider) + */ + public RestClientBuilder setDefaultCredentialsProvider(CredentialsProvider credentialsProvider) { + httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); + return this; + } + + /** + * @param authSchemeRegistry + * @return This object (for method chaining). + * @see HttpClientBuilder#setDefaultAuthSchemeRegistry(Lookup) + */ + public RestClientBuilder setDefaultAuthSchemeRegistry(Lookup<AuthSchemeProvider> authSchemeRegistry) { + httpClientBuilder.setDefaultAuthSchemeRegistry(authSchemeRegistry); + return this; + } + + /** + * @param contentDecoderMap + * @return This object (for method chaining). + * @see HttpClientBuilder#setContentDecoderRegistry(Map) + */ + public RestClientBuilder setContentDecoderRegistry(Map<String,InputStreamFactory> contentDecoderMap) { + httpClientBuilder.setContentDecoderRegistry(contentDecoderMap); + return this; + } + + /** + * @param config + * @return This object (for method chaining). + * @see HttpClientBuilder#setDefaultRequestConfig(RequestConfig) + */ + public RestClientBuilder setDefaultRequestConfig(RequestConfig config) { + httpClientBuilder.setDefaultRequestConfig(config); + return this; + } + + /** + * @return This object (for method chaining). + * @see HttpClientBuilder#useSystemProperties() + */ + public RestClientBuilder useSystemProperties() { + httpClientBuilder.useSystemProperties(); + return this; + } + + /** + * @return This object (for method chaining). + * @see HttpClientBuilder#evictExpiredConnections() + */ + public RestClientBuilder evictExpiredConnections() { + httpClientBuilder.evictExpiredConnections(); + return this; + } + + /** + * @param maxIdleTime + * @param maxIdleTimeUnit + * @return This object (for method chaining). + * @see HttpClientBuilder#evictIdleConnections(long,TimeUnit) + */ + public RestClientBuilder evictIdleConnections(long maxIdleTime, TimeUnit maxIdleTimeUnit) { + httpClientBuilder.evictIdleConnections(maxIdleTime, maxIdleTimeUnit); + return this; + } +}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RetryOn.java ---------------------------------------------------------------------- diff --git a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RetryOn.java b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RetryOn.java index 34024c7..6a1c542 100644 --- a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RetryOn.java +++ b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RetryOn.java @@ -28,6 +28,16 @@ public interface RetryOn { }; /** + * Default RetryOn that returns <jk>true</jk> if the HTTP connection could not be made. + */ + public static final RetryOn CONNECTION_LOST = new RetryOn() { + @Override /* RetryOn */ + public boolean onCode(int httpResponseCode) { + return httpResponseCode <= 0; + } + }; + + /** * Subclasses should override this method to determine whether the HTTP response is retryable. * * @param httpResponseCode The HTTP response code. http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/SSLOpts.java ---------------------------------------------------------------------- diff --git a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/SSLOpts.java b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/SSLOpts.java index 52f5766..e0041da 100644 --- a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/SSLOpts.java +++ b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/SSLOpts.java @@ -15,7 +15,7 @@ package org.apache.juneau.rest.client; import org.apache.juneau.internal.*; /** - * SSL configuration options that get passed to {@link RestClient#enableSSL(SSLOpts)}. + * SSL configuration options that get passed to {@link RestClientBuilder#enableSSL(SSLOpts)}. */ public class SSLOpts { http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/SerializedNameValuePair.java ---------------------------------------------------------------------- diff --git a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/SerializedNameValuePair.java b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/SerializedNameValuePair.java index 17a7dde..f90c393 100644 --- a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/SerializedNameValuePair.java +++ b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/SerializedNameValuePair.java @@ -12,12 +12,13 @@ // *************************************************************************************************************************** package org.apache.juneau.rest.client; -import static org.apache.juneau.urlencoding.UonSerializerContext.*; +import static org.apache.juneau.uon.UonSerializerContext.*; import java.io.*; import org.apache.http.*; import org.apache.juneau.*; +import org.apache.juneau.uon.*; import org.apache.juneau.urlencoding.*; /** http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/package.html ---------------------------------------------------------------------- diff --git a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/package.html b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/package.html index 55797bb..8e30aaa 100644 --- a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/package.html +++ b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/package.html @@ -115,7 +115,7 @@ <jc>// Examples below use the Juneau Address Book resource example</jc> <jc>// Create a reusable client with JSON support</jc> - RestClient client = <jk>new</jk> RestClient(JsonSerializer.<jk>class</jk>, JsonParser.<jk>class</jk>); + RestClient client = <jk>new</jk> RestClientBuilder().build(); <jc>// GET request, ignoring output</jc> <jk>try</jk> { @@ -185,7 +185,7 @@ .getResponse(Boolean.<jk>class</jk>); <jc>// GET request, getting a filtered object</jc> - client.getParser().addPojoSwaps(CalendarSwap.<jsf>ISO8601</jsf>.<jk>class</jk>); + client = <jk>new</jk> RestClientBuilder().pojoSwaps(CalendarSwap.<jsf>ISO8601</jsf>.<jk>class</jk>).build(); Calendar birthDate = client.doGet(<js>"http://localhost:9080/sample/addressBook/0/birthDate"</js>) .getResponse(GregorianCalendar.<jk>class</jk>); @@ -213,7 +213,7 @@ <h3 class='topic' onclick='toggle(this)'>1.1 - SSL Support</h3> <div class='topic'> <p> - The simplest way to enable SSL support in the client is to use the {@link org.apache.juneau.rest.client.RestClient#enableSSL(SSLOpts)} method + The simplest way to enable SSL support in the client is to use the {@link org.apache.juneau.rest.client.RestClientBuilder#enableSSL(SSLOpts)} method and one of the predefined {@link org.apache.juneau.rest.client.SSLOpts} instances: </p> <ul> @@ -223,18 +223,18 @@ <h6 class='topic'>Example:</h6> <p class='bcode'> <jc>// Create a client that ignores self-signed or otherwise invalid certificates.</jc> - RestClient restClient = <jk>new</jk> RestClient() + RestClientBuilder builder = <jk>new</jk> RestClientBuilder() .enableSSL(SSLOpts.<jsf>LAX</jsf>); <jc>// ...or...</jc> - RestClient restClient = <jk>new</jk> RestClient() + RestClientBuilder builder = <jk>new</jk> RestClientBuilder() .enableLaxSSL(); </p> <p> This is functionally equivalent to the following: </p> <p class='bcode'> - RestClient restClient = <jk>new</jk> RestClient(); + RestClientBuilder builder = <jk>new</jk> RestClientBuilder(); HostnameVerifier hv = <jk>new</jk> NoopHostnameVerifier(); TrustManager tm = <jk>new</jk> SimpleX509TrustManager(<jk>true</jk>); @@ -243,9 +243,9 @@ SSLContext ctx = SSLContext.<jsm>getInstance</jsm>(p); ctx.init(<jk>null</jk>, <jk>new</jk> TrustManager[] { tm }, <jk>null</jk>); SSLConnectionSocketFactory sf = <jk>new</jk> SSLConnectionSocketFactory(ctx, hv); - restClient.setSSLSocketFactory(sf); + builder.setSSLSocketFactory(sf); Registry<ConnectionSocketFactory> r = RegistryBuilder.<ConnectionSocketFactory><jsm>.create</jsm>().register(<js>"https"</js>, sf).build(); - restClient.setConnectionManager(<jk>new</jk> PoolingHttpClientConnectionManager(r)); + builder.setConnectionManager(<jk>new</jk> PoolingHttpClientConnectionManager(r)); } </p> <p> @@ -289,25 +289,26 @@ <h4 class='topic' onclick='toggle(this)'>1.2.1 - BASIC Authentication</h4> <div class='topic'> <p> - The {@link org.apache.juneau.rest.client.RestClient#setBasicAuth(String,int,String,String)} method can be used to quickly enable + The {@link org.apache.juneau.rest.client.RestClientBuilder#basicAuth(String,int,String,String)} method can be used to quickly enable BASIC authentication support. </p> <h6 class='topic'>Example:</h6> <p class='bcode'> <jc>// Create a client that performs BASIC authentication using the specified user/pw.</jc> - RestClient restClient = <jk>new</jk> RestClient() - .setBasicAuth(<jsf>HOST</jsf>, <jsf>PORT</jsf>, <jsf>USER</jsf>, <jsf>PW</jsf>); + RestClient restClient = <jk>new</jk> RestClientBuilder() + .setBasicAuth(<jsf>HOST</jsf>, <jsf>PORT</jsf>, <jsf>USER</jsf>, <jsf>PW</jsf>) + .build(); </p> <p> This is functionally equivalent to the following: </p> <p class='bcode'> - RestClient restClient = <jk>new</jk> RestClient(); + RestClientBuilder builder = <jk>new</jk> RestClientBuilder(); AuthScope scope = <jk>new</jk> AuthScope(<jsf>HOST</jsf>, <jsf>PORT</jsf>); Credentials up = <jk>new</jk> UsernamePasswordCredentials(<jsf>USER</jsf>, <jsf>PW</jsf>); CredentialsProvider p = <jk>new</jk> BasicCredentialsProvider(); p.setCredentials(scope, up); - restClient.setDefaultCredentialsProvider(p); + builder.setDefaultCredentialsProvider(p); </p> </div> @@ -316,10 +317,10 @@ <h4 class='topic' onclick='toggle(this)'>1.2.2 - FORM-based Authentication</h4> <div class='topic'> <p> - The {@link org.apache.juneau.rest.client.RestClient} class does not itself provide FORM-based authentication since there + The {@link org.apache.juneau.rest.client.RestClientBuilder} class does not itself provide FORM-based authentication since there is no standard way of providing such support. Typically, to perform FORM-based or other types of authentication, you'll want to create your own - subclass of {@link org.apache.juneau.rest.client.RestClient} and override the {@link org.apache.juneau.rest.client.RestClient#createHttpClient()} + subclass of {@link org.apache.juneau.rest.client.RestClientBuilder} and override the {@link org.apache.juneau.rest.client.RestClientBuilder#createHttpClient()} method to provide an authenticated client. </p> <p> @@ -330,14 +331,14 @@ <jd>/** * Constructor. */</jd> - <jk>public</jk> JazzRestClient(URI jazzUri, String user, String pw) <jk>throws</jk> IOException { + <jk>public</jk> JazzRestClientBuilder(URI jazzUri, String user, String pw) <jk>throws</jk> IOException { ... } <jd>/** * Override the createHttpClient() method to return an authenticated client. */</jd> - <ja>@Override</ja> <jc>/* RestClient */</jc> + <ja>@Override</ja> <jc>/* RestClientBuilder */</jc> <jk>protected</jk> CloseableHttpClient createHttpClient() <jk>throws</jk> Exception { CloseableHttpClient client = <jk>super</jk>.createHttpClient(); formBasedAuthenticate(client); @@ -411,14 +412,14 @@ <jd>/** * Constructor. */</jd> - <jk>public</jk> JazzRestClient(URI jazzUri, String user, String pw) <jk>throws</jk> IOException { + <jk>public</jk> JazzRestClientBuilder(URI jazzUri, String user, String pw) <jk>throws</jk> IOException { ... } <jd>/** * Override the createHttpClient() method to return an authenticated client. */</jd> - <ja>@Override</ja> <jc>/* RestClient */</jc> + <ja>@Override</ja> <jc>/* RestClientBuilder */</jc> <jk>protected</jk> CloseableHttpClient createHttpClient() <jk>throws</jk> Exception { CloseableHttpClient client = <jk>super</jk>.createHttpClient(); oidcAuthenticate(client); @@ -557,7 +558,7 @@ .run(); </p> <p> - These convenience methods are specialized methods that use the {@link org.apache.juneau.rest.client.RestCall#addResponsePattern(ResponsePattern)} + These convenience methods are specialized methods that use the {@link org.apache.juneau.rest.client.RestCall#responsePattern(ResponsePattern)} method which uses regular expression matching against the response body. This method can be used to search for arbitrary patterns in the response body. </p> @@ -631,7 +632,7 @@ <h3 class='topic' onclick='toggle(this)'>1.5 - Logging</h3> <div class='topic'> <p> - Use the {@link org.apache.juneau.rest.client.RestClient#logTo(Level,Logger)} and {@link org.apache.juneau.rest.client.RestCall#logTo(Level,Logger)} methods + Use the {@link org.apache.juneau.rest.client.RestClientBuilder#logTo(Level,Logger)} and {@link org.apache.juneau.rest.client.RestCall#logTo(Level,Logger)} methods to log HTTP calls. These methods will cause the HTTP request and response headers and body to be logged to the specified logger. </p> @@ -645,7 +646,7 @@ </p> <p> Customized logging can be handled by subclassing the {@link org.apache.juneau.rest.client.RestCallLogger} class and using the - {@link org.apache.juneau.rest.client.RestCall#addInterceptor(RestCallInterceptor)} method. + {@link org.apache.juneau.rest.client.RestCall#interceptor(RestCallInterceptor)} method. </p> </div> @@ -654,7 +655,7 @@ <h3 class='topic' onclick='toggle(this)'>1.6 - Interceptors</h3> <div class='topic'> <p> - The {@link org.apache.juneau.rest.client.RestClient#addInterceptor(RestCallInterceptor)} and {@link org.apache.juneau.rest.client.RestCall#addInterceptor(RestCallInterceptor)} methods + The {@link org.apache.juneau.rest.client.RestClientBuilder#interceptor(RestCallInterceptor)} and {@link org.apache.juneau.rest.client.RestCall#interceptor(RestCallInterceptor)} methods can be used to intercept responses during specific connection lifecycle events. </p> <p> @@ -763,7 +764,7 @@ </p> <p> Proxy interfaces are retrieved using the {@link org.apache.juneau.rest.client.RestClient#getRemoteableProxy(Class)} method. - The {@link org.apache.juneau.rest.client.RestClient#setRemoteableServletUri(String)} method is used to specify the location + The {@link org.apache.juneau.rest.client.RestClientBuilder#remoteableServletUri(String)} method is used to specify the location of the remoteable services servlet running on the server. The remoteable servlet is a specialized subclass of {@link org.apache.juneau.rest.RestServlet} that provides a full-blown REST interface for calling interfaces remotely. @@ -781,8 +782,9 @@ </p> <p class='bcode'> <jc>// Create a RestClient using JSON for serialization, and point to the server-side remoteable servlet.</jc> - RestClient client = <jk>new</jk> RestClient(JsonSerializer.<jk>class</jk>, JsonParser.<jk>class</jk>) - .setRemoteableServletUri(<js>"https://localhost:9080/juneau/sample/remoteable"</js>); + RestClient client = <jk>new</jk> RestClientBuilder() + .remoteableServletUri(<js>"https://localhost:9080/juneau/sample/remoteable"</js>) + .build(); <jc>// Create a proxy interface.</jc> IAddressBook ab = client.getRemoteableProxy(IAddressBook.<jk>class</jk>); @@ -818,28 +820,30 @@ <h3 class='topic' onclick='toggle(this)'>1.8 - Other Useful Methods</h3> <div class='topic'> <p> - The {@link org.apache.juneau.rest.client.RestClient#setRootUrl(Object)} method can be used to specify a root URL on + The {@link org.apache.juneau.rest.client.RestClientBuilder#rootUrl(Object)} method can be used to specify a root URL on all requests so that you don't have to use absolute paths on individual calls. </p> <p class='bcode'> <jc>// Create a rest client with a root URL</jc> - RestClient rc = <jk>new</jk> RestClient().setRootUrl(<js>"http://localhost:9080/foobar"</js>); + RestClient rc = <jk>new</jk> RestClientBuilder().rootUrl(<js>"http://localhost:9080/foobar"</js>).build(); String r = rc.doGet(<js>"/baz"</js>).getResponseAsString(); <jc>// Gets "http://localhost:9080/foobar/baz"</jc> </p> <p> - The {@link org.apache.juneau.rest.client.RestClient#setProperty(String,Object)} method can be used to set serializer + The {@link org.apache.juneau.rest.client.RestClientBuilder#property(String,Object)} method can be used to set serializer and parser properties. For example, if you're parsing a response into POJOs and you want to ignore fields that aren't on the POJOs, you can use the {@link org.apache.juneau.BeanContext#BEAN_ignoreUnknownBeanProperties} property. </p> <p class='bcode'> <jc>// Create a rest client that ignores unknown fields in the response</jc> - RestClient rc = <jk>new</jk> RestClient(JsonSerializer.<jk>class</jk>, JsonParser.<jk>class</jk>) - .setProperty(<jsf>BEAN_ignoreUnknownBeanProperties</jsf>, <jk>true</jk>); + RestClient rc = <jk>new</jk> RestClientBuilder() + .property(<jsf>BEAN_ignoreUnknownBeanProperties</jsf>, <jk>true</jk>) + <jc>// or .ignoreUnknownBeanProperties(true)</jc> + .build(); MyPojo myPojo = rc.doGet(<jsf>URL</jsf>).getResponse(MyPojo.<jk>class</jk>); </p> <p> - The {@link org.apache.juneau.rest.client.RestCall#setRetryable(int,long,RetryOn)} method can be used to automatically + The {@link org.apache.juneau.rest.client.RestCall#retryable(int,long,RetryOn)} method can be used to automatically retry requests on failures. This can be particularly useful if you're attempting to connect to a REST resource that may be in the process of still initializing. @@ -848,7 +852,7 @@ <jc>// Create a rest call that retries every 10 seconds for up to 30 minutes as long as a connection fails // or a 400+ is received.</jc> restClient.doGet(<jsf>URL</jsf>) - .setRetryable(180, 10000, RetryOn.<jsf>DEFAULT</jsf>) + .retryable(180, 10000, RetryOn.<jsf>DEFAULT</jsf>) .run(); </p> </div> http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BaseProvider.java ---------------------------------------------------------------------- diff --git a/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BaseProvider.java b/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BaseProvider.java index 1a26708..4ee84be 100644 --- a/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BaseProvider.java +++ b/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/BaseProvider.java @@ -35,8 +35,8 @@ import org.apache.juneau.serializer.*; */ public class BaseProvider implements MessageBodyReader<Object>, MessageBodyWriter<Object> { - private SerializerGroup serializers = new SerializerGroup(); - private ParserGroup parsers = new ParserGroup(); + private SerializerGroup serializers; + private ParserGroup parsers; private ObjectMap properties = new ObjectMap(); /** @@ -46,14 +46,24 @@ public class BaseProvider implements MessageBodyReader<Object>, MessageBodyWrite try { properties = new ObjectMap(); JuneauProvider jp = getClass().getAnnotation(JuneauProvider.class); - serializers.append(jp.serializers()); - parsers.append(jp.parsers()); + for (Property p : jp.properties()) properties.put(p.name(), p.value()); - serializers.addBeanFilters(jp.beanFilters()); - parsers.addBeanFilters(jp.beanFilters()); - serializers.addPojoSwaps(jp.pojoSwaps()); - parsers.addPojoSwaps(jp.pojoSwaps()); + + serializers = new SerializerGroupBuilder() + .append(jp.serializers()) + .beanFilters(jp.beanFilters()) + .pojoSwaps(jp.pojoSwaps()) + .properties(properties) + .build(); + + parsers = new ParserGroupBuilder() + .append(jp.parsers()) + .beanFilters(jp.beanFilters()) + .pojoSwaps(jp.pojoSwaps()) + .properties(properties) + .build(); + } catch (Exception e) { throw new RuntimeException(e); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/DefaultProvider.java ---------------------------------------------------------------------- diff --git a/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/DefaultProvider.java b/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/DefaultProvider.java index 92cc4a1..1407508 100644 --- a/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/DefaultProvider.java +++ b/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/DefaultProvider.java @@ -31,8 +31,8 @@ import org.apache.juneau.xml.*; "application/json", "text/json", // JsonSerializer "application/json+simple", "text/json+simple", // JsonSerializer.Simple "application/json+schema", // JsonSchemaSerializer - "text/xml", // XmlDocSerializer - "text/xml+simple", // XmlDocSerializer.Simple + "text/xml", // XmlDocSerializer.Ns + "text/xml+simple", // XmlDocSerializer "text/xml+schema", // XmlSchemaDocSerializer "text/html", // HtmlDocSerializer "application/x-www-form-urlencoded", // UrlEncodingSerializer @@ -51,20 +51,19 @@ import org.apache.juneau.xml.*; JsonSerializer.class, JsonSerializer.Simple.class, JsonSchemaSerializer.class, + XmlDocSerializer.Ns.class, XmlDocSerializer.class, - XmlDocSerializer.Simple.class, XmlSchemaDocSerializer.class, HtmlDocSerializer.class, UrlEncodingSerializer.class, SoapXmlSerializer.class, - JavaSerializedObjectSerializer.class + JsoSerializer.class }, parsers={ JsonParser.class, XmlParser.class, HtmlParser.class, UrlEncodingParser.class, - JavaSerializedObjectParser.class } ) public final class DefaultProvider extends BaseProvider {} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/rdf/DefaultJenaProvider.java ---------------------------------------------------------------------- diff --git a/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/rdf/DefaultJenaProvider.java b/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/rdf/DefaultJenaProvider.java index e4208c9..5c60247 100644 --- a/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/rdf/DefaultJenaProvider.java +++ b/juneau-rest-jaxrs/src/main/java/org/apache/juneau/rest/jaxrs/rdf/DefaultJenaProvider.java @@ -33,8 +33,8 @@ import org.apache.juneau.xml.*; "application/json", "text/json", // JsonSerializer "application/json+simple","text/json+simple", // JsonSerializer.Simple "application/json+schema","text/json+schema", // JsonSchemaSerializer - "text/xml", // XmlDocSerializer - "text/xml+simple", // XmlDocSerializer.Simple + "text/xml", // XmlDocSerializer.Ns + "text/xml+simple", // XmlDocSerializer "text/xml+schema", // XmlSchemaDocSerializer "text/html", // HtmlDocSerializer "application/x-www-form-urlencoded", // UrlEncodingSerializer @@ -62,8 +62,7 @@ import org.apache.juneau.xml.*; JsonSerializer.class, JsonSerializer.Simple.class, JsonSchemaSerializer.class, - XmlDocSerializer.class, - XmlDocSerializer.Simple.class, + XmlDocSerializer.Ns.class, XmlSchemaDocSerializer.class, HtmlDocSerializer.class, UrlEncodingSerializer.class, @@ -73,7 +72,7 @@ import org.apache.juneau.xml.*; RdfSerializer.NTriple.class, RdfSerializer.Turtle.class, RdfSerializer.N3.class, - JavaSerializedObjectSerializer.class + JsoSerializer.class }, parsers={ JsonParser.class, @@ -83,8 +82,7 @@ import org.apache.juneau.xml.*; RdfParser.Xml.class, RdfParser.NTriple.class, RdfParser.Turtle.class, - RdfParser.N3.class, - JavaSerializedObjectParser.class, + RdfParser.N3.class } ) public final class DefaultJenaProvider extends BaseProvider {} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/AcceptCharsetResource.java ---------------------------------------------------------------------- diff --git a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/AcceptCharsetResource.java b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/AcceptCharsetResource.java index f1d04fa..ee3a172 100644 --- a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/AcceptCharsetResource.java +++ b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/AcceptCharsetResource.java @@ -56,6 +56,11 @@ public class AcceptCharsetResource extends RestServlet { @Consumes("text/plain") public static class TestParser extends InputStreamParser { + + public TestParser(PropertyStore propertyStore) { + super(propertyStore); + } + @SuppressWarnings("unchecked") @Override /* Parser */ protected <T> T doParse(ParserSession session, ClassMeta<T> type) throws Exception { @@ -65,6 +70,11 @@ public class AcceptCharsetResource extends RestServlet { @Produces("text/plain") public static class TestSerializer extends OutputStreamSerializer { + + public TestSerializer(PropertyStore propertyStore) { + super(propertyStore); + } + @Override /* Serializer */ protected void doSerialize(SerializerSession session, Object o) throws Exception { Writer w = new OutputStreamWriter(session.getOutputStream()); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/CharsetEncodingsResource.java ---------------------------------------------------------------------- diff --git a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/CharsetEncodingsResource.java b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/CharsetEncodingsResource.java index 539f88d..4f9e6f3 100644 --- a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/CharsetEncodingsResource.java +++ b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/CharsetEncodingsResource.java @@ -33,6 +33,11 @@ public class CharsetEncodingsResource extends RestServlet { @Consumes("text/p") public static class CtParser extends ReaderParser { + + public CtParser(PropertyStore propertyStore) { + super(propertyStore); + } + @SuppressWarnings("unchecked") @Override /* Parser */ protected <T> T doParse(ParserSession session, ClassMeta<T> type) throws Exception { @@ -42,6 +47,11 @@ public class CharsetEncodingsResource extends RestServlet { @Produces("text/s") public static class ASerializer extends WriterSerializer { + + public ASerializer(PropertyStore propertyStore) { + super(propertyStore); + } + @Override /* Serializer */ protected void doSerialize(SerializerSession session, Object o) throws Exception { session.getWriter().write(o.toString()); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/95e832e1/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/DefaultContentTypesResource.java ---------------------------------------------------------------------- diff --git a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/DefaultContentTypesResource.java b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/DefaultContentTypesResource.java index 01dd128..73544e7 100644 --- a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/DefaultContentTypesResource.java +++ b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/DefaultContentTypesResource.java @@ -34,22 +34,22 @@ public class DefaultContentTypesResource extends RestServlet { private static final long serialVersionUID = 1L; @Consumes("text/p1") - public static class P1 extends DummyParser { public P1() {super("p1");}} + public static class P1 extends DummyParser { public P1(PropertyStore ps) {super(ps, "p1");}} @Consumes("text/p2") - public static class P2 extends DummyParser { public P2() {super("p2");}} + public static class P2 extends DummyParser { public P2(PropertyStore ps) {super(ps, "p2");}} @Consumes("text/p3") - public static class P3 extends DummyParser { public P3() {super("p3");}} + public static class P3 extends DummyParser { public P3(PropertyStore ps) {super(ps, "p3");}} @Produces("text/s1") - public static class S1 extends DummySerializer { public S1() {super("s1");}} + public static class S1 extends DummySerializer { public S1(PropertyStore ps) {super(ps, "s1");}} @Produces("text/s2") - public static class S2 extends DummySerializer { public S2() {super("s2");}} + public static class S2 extends DummySerializer { public S2(PropertyStore ps) {super(ps, "s2");}} @Produces("text/s3") - public static class S3 extends DummySerializer { public S3() {super("s3");}} + public static class S3 extends DummySerializer { public S3(PropertyStore ps) {super(ps, "s3");}} /** * Test that default Accept and Content-Type headers on servlet annotation are picked up. @@ -104,10 +104,14 @@ public class DefaultContentTypesResource extends RestServlet { } public static class DummyParser extends ReaderParser { + private String name; - private DummyParser(String name) { + + private DummyParser(PropertyStore propertyStore, String name) { + super(propertyStore); this.name = name; } + @SuppressWarnings("unchecked") @Override /* Parser */ protected <T> T doParse(ParserSession session, ClassMeta<T> type) throws Exception { @@ -116,10 +120,14 @@ public class DefaultContentTypesResource extends RestServlet { } public static class DummySerializer extends WriterSerializer { + private String name; - private DummySerializer(String name) { + + private DummySerializer(PropertyStore propertyStore, String name) { + super(propertyStore); this.name = name; } + @Override /* Serializer */ protected void doSerialize(SerializerSession session, Object output) throws Exception { session.getWriter().write(name + "/" + output);
