001// ***************************************************************************************************************************
002// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
003// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
004// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
005// * with the License.  You may obtain a copy of the License at                                                              *
006// *                                                                                                                         *
007// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
008// *                                                                                                                         *
009// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
010// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
011// * specific language governing permissions and limitations under the License.                                              *
012// ***************************************************************************************************************************
013package org.apache.juneau.rest.client;
014
015import static org.apache.juneau.internal.StringUtils.*;
016import static org.apache.juneau.parser.InputStreamParser.*;
017import static org.apache.juneau.parser.ReaderParser.*;
018import static org.apache.juneau.rest.client.RestClient.*;
019import static org.apache.juneau.BeanTraverseContext.*;
020import static org.apache.juneau.serializer.OutputStreamSerializer.*;
021import static org.apache.juneau.serializer.WriterSerializer.*;
022import static org.apache.juneau.uon.UonSerializer.*;
023
024import java.lang.reflect.*;
025import java.net.*;
026import java.security.*;
027import java.util.*;
028import java.util.concurrent.*;
029import java.util.logging.*;
030
031import javax.net.ssl.*;
032
033import org.apache.http.*;
034import org.apache.http.auth.*;
035import org.apache.http.client.*;
036import org.apache.http.client.CookieStore;
037import org.apache.http.client.config.*;
038import org.apache.http.client.entity.*;
039import org.apache.http.config.*;
040import org.apache.http.conn.*;
041import org.apache.http.conn.routing.*;
042import org.apache.http.conn.socket.*;
043import org.apache.http.conn.ssl.*;
044import org.apache.http.conn.util.*;
045import org.apache.http.cookie.*;
046import org.apache.http.impl.client.*;
047import org.apache.http.impl.conn.*;
048import org.apache.http.protocol.*;
049import org.apache.juneau.*;
050import org.apache.juneau.html.*;
051import org.apache.juneau.http.*;
052import org.apache.juneau.httppart.*;
053import org.apache.juneau.internal.*;
054import org.apache.juneau.json.*;
055import org.apache.juneau.msgpack.*;
056import org.apache.juneau.oapi.*;
057import org.apache.juneau.parser.*;
058import org.apache.juneau.plaintext.*;
059import org.apache.juneau.rest.client.mock.*;
060import org.apache.juneau.serializer.*;
061import org.apache.juneau.uon.*;
062import org.apache.juneau.urlencoding.*;
063import org.apache.juneau.utils.*;
064import org.apache.juneau.xml.*;
065
066/**
067 * Builder class for the {@link RestClient} class.
068 *
069 * <p>
070 * Instances of this class are created by the following methods:
071 * <ul>
072 *    <li>{@link RestClient#create()} - Create from scratch.
073 *    <li>{@link RestClient#create(Serializer,Parser)} - Create from scratch using specified serializer/parser.
074 *    <li>{@link RestClient#create(Class,Class)} - Create from scratch using specified serializer/parser classes.
075 *    <li>{@link RestClient#builder()} - Copy settings from an existing client.
076 * </ul>
077 *
078 * <h5 class='section'>See Also:</h5>
079 * <ul>
080 *    <li class='link'>{@doc juneau-rest-client}
081 * </ul>
082 */
083public class RestClientBuilder extends BeanContextBuilder {
084
085   private HttpClientConnectionManager httpClientConnectionManager;
086   private HttpClientBuilder httpClientBuilder;
087   private CloseableHttpClient httpClient;
088   private boolean enableSsl = false;
089   private HostnameVerifier hostnameVerifier;
090   private KeyManager[] keyManagers;
091   private TrustManager[] trustManagers;
092   private SecureRandom secureRandom;
093   private String[] sslProtocols, cipherSuites;
094   private boolean pooled;
095
096   /**
097    * Constructor.
098    * @param ps
099    *    Initial configuration properties for this builder.
100    *    <br>Can be <jk>null</jk>.
101    * @param httpClientBuilder
102    *    The HTTP client builder to use for this REST client builder.
103    *    <br>Can be <jk>null</jk> to just call {@link #createHttpClientBuilder()} to instantiate it again.
104    */
105   protected RestClientBuilder(PropertyStore ps, HttpClientBuilder httpClientBuilder) {
106      super(ps);
107      this.httpClientBuilder = httpClientBuilder != null ? httpClientBuilder : createHttpClientBuilder();
108   }
109
110   @SuppressWarnings("resource")
111   @Override /* ContextBuilder */
112   public RestClient build() {
113      try {
114         CloseableHttpClient c = httpClient != null ? httpClient : createHttpClient();
115         PropertyStore ps = psb.build();
116
117         return new RestClient(ps, httpClientBuilder, c);
118      } catch (Exception e) {
119         throw new RuntimeException(e);
120      }
121   }
122
123   /**
124    * Convenience method for specifying JSON as the transmission media type.
125    *
126    * <p>
127    * Identical to calling <code>serializer(JsonSerializer.<jk>class</jk>).parser(JsonParser.<jk>class</jk>)</code>.
128    *
129    * @return This object (for method chaining).
130    */
131   public RestClientBuilder json() {
132      return serializer(JsonSerializer.class).parser(JsonParser.class);
133   }
134
135   /**
136    * Convenience method for specifying Simple JSON as the transmission media type.
137    *
138    * <p>
139    * Identical to calling <code>serializer(SimpleJsonSerializer.<jk>class</jk>).parser(JsonParser.<jk>class</jk>)</code>.
140    *
141    * @return This object (for method chaining).
142    */
143   public RestClientBuilder simpleJson() {
144      return serializer(SimpleJsonSerializer.class).parser(JsonParser.class);
145   }
146
147   /**
148    * Convenience method for specifying XML as the transmission media type.
149    *
150    * <p>
151    * Identical to calling <code>serializer(XmlSerializer.<jk>class</jk>).parser(XmlParser.<jk>class</jk>)</code>.
152    *
153    * @return This object (for method chaining).
154    */
155   public RestClientBuilder xml() {
156      return serializer(XmlSerializer.class).parser(XmlParser.class);
157   }
158
159   /**
160    * Convenience method for specifying HTML as the transmission media type.
161    *
162    * <p>
163    * Identical to calling <code>serializer(HtmlSerializer.<jk>class</jk>).parser(HtmlParser.<jk>class</jk>)</code>.
164    *
165    * @return This object (for method chaining).
166    */
167   public RestClientBuilder html() {
168      return serializer(HtmlSerializer.class).parser(HtmlParser.class);
169   }
170
171   /**
172    * Convenience method for specifying plain-text as the transmission media type.
173    *
174    * <p>
175    * Identical to calling <code>serializer(PlainTextSerializer.<jk>class</jk>).parser(PlainTextParser.<jk>class</jk>)</code>.
176    *
177    * @return This object (for method chaining).
178    */
179   public RestClientBuilder plainText() {
180      return serializer(PlainTextSerializer.class).parser(PlainTextParser.class);
181   }
182
183   /**
184    * Convenience method for specifying MessagePack as the transmission media type.
185    *
186    * <p>
187    * Identical to calling <code>serializer(MsgPackSerializer.<jk>class</jk>).parser(MsgPackParser.<jk>class</jk>)</code>.
188    *
189    * @return This object (for method chaining).
190    */
191   public RestClientBuilder msgpack() {
192      return serializer(MsgPackSerializer.class).parser(MsgPackParser.class);
193   }
194
195   /**
196    * Convenience method for specifying UON as the transmission media type.
197    *
198    * <p>
199    * Identical to calling <code>serializer(UonSerializer.<jk>class</jk>).parser(UonParser.<jk>class</jk>)</code>.
200    *
201    * @return This object (for method chaining).
202    */
203   public RestClientBuilder uon() {
204      return serializer(UonSerializer.class).parser(UonParser.class);
205   }
206
207   /**
208    * Convenience method for specifying URL-Encoding as the transmission media type.
209    *
210    * <p>
211    * Identical to calling <code>serializer(UrlEncodingSerializer.<jk>class</jk>).parser(UrlEncodingParser.<jk>class</jk>)</code>.
212    *
213    * @return This object (for method chaining).
214    */
215   public RestClientBuilder urlEnc() {
216      return serializer(UrlEncodingSerializer.class).parser(UrlEncodingParser.class);
217   }
218
219   /**
220    * Convenience method for specifying URL-Encoding as the transmission media type.
221    *
222    * <p>
223    * Identical to calling <code>serializer(OpenApiSerializer.<jk>class</jk>).parser(OpenApiParser.<jk>class</jk>)</code>.
224    *
225    * @return This object (for method chaining).
226    */
227   public RestClientBuilder openapi() {
228      return serializer(OpenApiSerializer.class).parser(OpenApiParser.class);
229   }
230
231   /**
232    * Creates an instance of an {@link HttpClient} to be used to handle all HTTP communications with the target server.
233    *
234    * <p>
235    * This HTTP client is used when the HTTP client is not specified through one of the constructors or the
236    * {@link #httpClient(CloseableHttpClient, boolean)} method.
237    *
238    * <p>
239    * Subclasses can override this method to provide specially-configured HTTP clients to handle stuff such as
240    * SSL/TLS certificate handling, authentication, etc.
241    *
242    * <p>
243    * The default implementation returns an instance of {@link HttpClient} using the client builder returned by
244    * {@link #createHttpClientBuilder()}.
245    *
246    * @return The HTTP client to use.
247    * @throws Exception
248    */
249   protected CloseableHttpClient createHttpClient() throws Exception {
250      // Don't call createConnectionManager() if RestClient.setConnectionManager() was called.
251      if (httpClientConnectionManager == null)
252         httpClientBuilder.setConnectionManager(createConnectionManager());
253      else
254         httpClientBuilder.setConnectionManager(httpClientConnectionManager);
255      return httpClientBuilder.build();
256   }
257
258   /**
259    * Creates an instance of an {@link HttpClientBuilder} to be used to create the {@link HttpClient}.
260    *
261    * <p>
262    * Subclasses can override this method to provide their own client builder.
263    *
264    * <p>
265    * The predefined method returns an {@link HttpClientBuilder} with the following settings:
266    * <ul>
267    *    <li>Lax redirect strategy.
268    *    <li>The connection manager returned by {@link #createConnectionManager()}.
269    * </ul>
270    *
271    * @return The HTTP client builder to use to create the HTTP client.
272    */
273   protected HttpClientBuilder createHttpClientBuilder() {
274      HttpClientBuilder b = HttpClientBuilder.create();
275      b.setRedirectStrategy(new AllowAllRedirects());
276      return b;
277   }
278
279   /**
280    * Creates the {@link HttpClientConnectionManager} returned by {@link #createConnectionManager()}.
281    *
282    * <p>
283    * Subclasses can override this method to provide their own connection manager.
284    *
285    * <p>
286    * The default implementation returns an instance of a {@link PoolingHttpClientConnectionManager}.
287    *
288    * @return The HTTP client builder to use to create the HTTP client.
289    * @throws NoSuchAlgorithmException
290    * @throws KeyManagementException
291    */
292   @SuppressWarnings("resource")
293   protected HttpClientConnectionManager createConnectionManager() throws KeyManagementException, NoSuchAlgorithmException {
294      if (enableSsl) {
295
296         HostnameVerifier hv = hostnameVerifier != null ? hostnameVerifier : new DefaultHostnameVerifier();
297         TrustManager[] tm = trustManagers;
298         String[] sslp = sslProtocols == null ? getDefaultProtocols() : sslProtocols;
299         SecureRandom sr = secureRandom;
300         KeyManager[] km = keyManagers;
301         String[] cs = cipherSuites;
302
303         RegistryBuilder<ConnectionSocketFactory> rb = RegistryBuilder.<ConnectionSocketFactory>create();
304         rb.register("http", PlainConnectionSocketFactory.getSocketFactory());
305
306         SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom().build();
307         sslContext.init(km, tm, sr);
308
309         SSLConnectionSocketFactory sslcsf = new SSLConnectionSocketFactory(sslContext, sslp, cs, hv);
310         rb.register("https", sslcsf).build();
311
312         return (pooled ? new PoolingHttpClientConnectionManager(rb.build()) : new BasicHttpClientConnectionManager(rb.build()));
313      }
314
315      // Using pooling connection so that this client is threadsafe.
316      return (pooled ? new PoolingHttpClientConnectionManager() : new BasicHttpClientConnectionManager());
317   }
318
319   /**
320    * Enable SSL support on this client.
321    *
322    * <p>
323    * Used in conjunction with the following methods for setting up SSL parameters:
324    * <ul class='doctree'>
325    *    <li class='jf'>{@link #sslProtocols(String...)}
326    *    <li class='jf'>{@link #cipherSuites(String...)}
327    *    <li class='jf'>{@link #hostnameVerifier(HostnameVerifier)}
328    *    <li class='jf'>{@link #keyManagers(KeyManager...)}
329    *    <li class='jf'>{@link #trustManagers(TrustManager...)}
330    *    <li class='jf'>{@link #secureRandom(SecureRandom)}
331    * </ul>
332    *
333    * @return This object (for method chaining).
334    * @throws KeyStoreException
335    * @throws NoSuchAlgorithmException
336    */
337   public RestClientBuilder enableSSL() throws KeyStoreException, NoSuchAlgorithmException {
338      this.enableSsl = true;
339      return this;
340   }
341
342   /**
343    * Enable LARestClientBuilder SSL support.
344    *
345    * <p>
346    * Same as calling the following:
347    * <p class='bcode w800'>
348    *    builder
349    *       .enableSSL()
350    *       .hostnameVerifier(<jk>new</jk> NoopHostnameVerifier())
351    *       .trustManagers(<jk>new</jk> SimpleX509TrustManager(<jk>true</jk>));
352    * </p>
353    *
354    * @return This object (for method chaining).
355    * @throws KeyStoreException
356    * @throws NoSuchAlgorithmException
357    */
358   public RestClientBuilder enableLaxSSL() throws KeyStoreException, NoSuchAlgorithmException {
359      this.enableSsl = true;
360      hostnameVerifier(new NoopHostnameVerifier());
361      trustManagers(new SimpleX509TrustManager(true));
362      return this;
363   }
364
365   /**
366    * Supported SSL protocols.
367    *
368    * <p>
369    * This is the value passed to the <code>supportedProtocols</code> parameter of the
370    * {@link SSLConnectionSocketFactory#SSLConnectionSocketFactory(SSLContext,String[],String[],HostnameVerifier)}
371    * constructor.
372    *
373    * <p>
374    * The default value is taken from the system property <js>"transport.client.protocol"</js>.
375    * <br>If system property is not defined, defaults to <code>{<js>"SSL_TLS"</js>,<js>"TLS"</js>,<js>"SSL"</js>}</code>.
376    *
377    * <p>
378    * This method is effectively ignored if {@link #enableSSL()} has not been called or the client connection manager
379    * has been defined via {@link #httpClientConnectionManager(HttpClientConnectionManager)}.
380    *
381    * @param sslProtocols The supported SSL protocols.
382    * @return This object (for method chaining).
383    */
384   public RestClientBuilder sslProtocols(String...sslProtocols) {
385      this.sslProtocols = sslProtocols;
386      return this;
387   }
388
389   /**
390    * Supported cipher suites.
391    *
392    * <p>
393    * This is the value passed to the <code>supportedCipherSuites</code> parameter of the
394    * {@link SSLConnectionSocketFactory#SSLConnectionSocketFactory(SSLContext,String[],String[],HostnameVerifier)}
395    * constructor.
396    *
397    * <p>
398    * The default value is <jk>null</jk>.
399    *
400    * <p>
401    * This method is effectively ignored if {@link #enableSSL()} has not been called or the client connection manager
402    * has been defined via {@link #httpClientConnectionManager(HttpClientConnectionManager)}.
403    *
404    * @param cipherSuites The supported cipher suites.
405    * @return This object (for method chaining).
406    */
407   public RestClientBuilder cipherSuites(String...cipherSuites) {
408      this.cipherSuites = cipherSuites;
409      return this;
410   }
411
412   /**
413    * Hostname verifier.
414    *
415    * <p>
416    * This is the value passed to the <code>hostnameVerifier</code> parameter of the
417    * {@link SSLConnectionSocketFactory#SSLConnectionSocketFactory(SSLContext,String[],String[],HostnameVerifier)}
418    * constructor.
419    *
420    * <p>
421    * The default value is <jk>null</jk>.
422    *
423    * <p>
424    * This method is effectively ignored if {@link #enableSSL()} has not been called or the client connection manager
425    * has been defined via {@link #httpClientConnectionManager(HttpClientConnectionManager)}.
426    *
427    * @param hostnameVerifier The hostname verifier.
428    * @return This object (for method chaining).
429    */
430   public RestClientBuilder hostnameVerifier(HostnameVerifier hostnameVerifier) {
431      this.hostnameVerifier = hostnameVerifier;
432      return this;
433   }
434
435   /**
436    * Key managers.
437    *
438    * <p>
439    * This is the value passed to the <code>keyManagers</code> parameter of the
440    * {@link SSLContext#init(KeyManager[],TrustManager[],SecureRandom)} method.
441    *
442    * <p>
443    * The default value is <jk>null</jk>.
444    *
445    * <p>
446    * This method is effectively ignored if {@link #enableSSL()} has not been called or the client connection manager
447    * has been defined via {@link #httpClientConnectionManager(HttpClientConnectionManager)}.
448    *
449    * @param keyManagers The key managers.
450    * @return This object (for method chaining).
451    */
452   public RestClientBuilder keyManagers(KeyManager...keyManagers) {
453      this.keyManagers = keyManagers;
454      return this;
455   }
456
457   /**
458    * Trust managers.
459    *
460    * <p>
461    * This is the value passed to the <code>trustManagers</code> parameter of the
462    * {@link SSLContext#init(KeyManager[],TrustManager[],SecureRandom)} method.
463    *
464    * <p>
465    * The default value is <jk>null</jk>.
466    *
467    * <p>
468    * This method is effectively ignored if {@link #enableSSL()} has not been called or the client connection manager
469    * has been defined via {@link #httpClientConnectionManager(HttpClientConnectionManager)}.
470    *
471    * @param trustManagers The trust managers.
472    * @return This object (for method chaining).
473    */
474   public RestClientBuilder trustManagers(TrustManager...trustManagers) {
475      this.trustManagers = trustManagers;
476      return this;
477   }
478
479   /**
480    * Trust managers.
481    *
482    * <p>
483    * This is the value passed to the <code>random</code> parameter of the
484    * {@link SSLContext#init(KeyManager[],TrustManager[],SecureRandom)} method.
485    *
486    * <p>
487    * The default value is <jk>null</jk>.
488    *
489    * <p>
490    * This method is effectively ignored if {@link #enableSSL()} has not been called or the client connection manager
491    * has been defined via {@link #httpClientConnectionManager(HttpClientConnectionManager)}.
492    *
493    * @param secureRandom The random number generator.
494    * @return This object (for method chaining).
495    */
496   public RestClientBuilder secureRandom(SecureRandom secureRandom) {
497      this.secureRandom = secureRandom;
498      return this;
499   }
500
501   /**
502    * Sets the client version by setting the value for the <js>"X-Client-Version"</js> header.
503    *
504    * @param version The version string (e.g. <js>"1.2.3"</js>)
505    * @return This object (for method chaining).
506    */
507   public RestClientBuilder clientVersion(String version) {
508      return header("X-Client-Version", version);
509   }
510
511   /**
512    * Adds a {@link RestCallLogger} to the list of interceptors on this class.
513    *
514    * @param level The log level to log messages at.
515    * @param log The logger to log messages to.
516    * @return This object (for method chaining).
517    */
518   public RestClientBuilder logTo(Level level, Logger log) {
519      return interceptors(new RestCallLogger(level, log));
520   }
521
522   /**
523    * When called, the {@link #createConnectionManager()} method will return a {@link PoolingHttpClientConnectionManager}
524    * instead of a {@link BasicHttpClientConnectionManager}.
525    *
526    * @return This object (for method chaining).
527    */
528   public RestClientBuilder pooled() {
529      this.pooled = true;
530      return this;
531   }
532
533   /**
534    * Set up this client to use BASIC auth.
535    *
536    * @param host The auth scope hostname.
537    * @param port The auth scope port.
538    * @param user The username.
539    * @param pw The password.
540    * @return This object (for method chaining).
541    */
542   public RestClientBuilder basicAuth(String host, int port, String user, String pw) {
543      AuthScope scope = new AuthScope(host, port);
544      Credentials up = new UsernamePasswordCredentials(user, pw);
545      CredentialsProvider p = new BasicCredentialsProvider();
546      p.setCredentials(scope, up);
547      defaultCredentialsProvider(p);
548      return this;
549   }
550
551   /**
552    * Sets the internal {@link HttpClient} to use for handling HTTP communications.
553    *
554    * @param httpClient The HTTP client.
555    * @param keepHttpClientOpen Don't close this client when the {@link RestClient#close()} method is called.
556    * @return This object (for method chaining).
557    */
558   public RestClientBuilder httpClient(CloseableHttpClient httpClient, boolean keepHttpClientOpen) {
559      this.httpClient = httpClient;
560      set(RESTCLIENT_keepHttpClientOpen, keepHttpClientOpen);
561      return this;
562   }
563
564   /**
565    * Sets the internal {@link HttpClientConnectionManager}.
566    *
567    * @param httpClientConnectionManager The HTTP client connection manager.
568    * @return This object (for method chaining).
569    */
570   public RestClientBuilder httpClientConnectionManager(HttpClientConnectionManager httpClientConnectionManager) {
571      this.httpClientConnectionManager = httpClientConnectionManager;
572      return this;
573   }
574
575   /**
576    * Sets a mock connection used to construct a connection manager for working against mocked REST interfaces.
577    *
578    * <h5 class='section'>See Also:</h5>
579    * <ul>
580    *    <li class='link'>{@doc juneau-rest-client.UnitTesting}
581    * </ul>
582    *
583    * @param c The mock connection.
584    * @return This object (for method chaining).
585    */
586   public RestClientBuilder mockHttpConnection(MockHttpConnection c) {
587      rootUrl("http://localhost");
588      return httpClientConnectionManager(new MockHttpClientConnectionManager(c));
589   }
590
591
592   //-----------------------------------------------------------------------------------------------------------------
593   // HTTP headers
594   //-----------------------------------------------------------------------------------------------------------------
595
596   /**
597    * Sets the value for the <code>Accept</code> request header.
598    *
599    * <p>
600    * This overrides the media type specified on the parser, but is overridden by calling
601    * <code>header(<js>"Accept"</js>, value);</code>
602    *
603    * @param value The new header value.
604    * @return This object (for method chaining).
605    */
606   public RestClientBuilder accept(Object value) {
607      return header("Accept", value);
608   }
609
610   /**
611    * Sets the value for the <code>Accept-Charset</code> request header.
612    *
613    * <p>
614    * This is a shortcut for calling <code>header(<js>"Accept-Charset"</js>, value);</code>
615    *
616    * @param value The new header value.
617    * @return This object (for method chaining).
618    */
619   public RestClientBuilder acceptCharset(Object value) {
620      return header("Accept-Charset", value);
621   }
622
623   /**
624    * Sets the value for the <code>Accept-Encoding</code> request header.
625    *
626    * <p>
627    * This is a shortcut for calling <code>header(<js>"Accept-Encoding"</js>, value);</code>
628    *
629    * @param value The new header value.
630    * @return This object (for method chaining).
631    */
632   public RestClientBuilder acceptEncoding(Object value) {
633      return header("Accept-Encoding", value);
634   }
635
636   /**
637    * Sets the value for the <code>Accept-Language</code> request header.
638    *
639    * <p>
640    * This is a shortcut for calling <code>header(<js>"Accept-Language"</js>, value);</code>
641    *
642    * @param value The new header value.
643    * @return This object (for method chaining).
644    */
645   public RestClientBuilder acceptLanguage(Object value) {
646      return header("Accept-Language", value);
647   }
648
649   /**
650    * Sets the value for the <code>Authorization</code> request header.
651    *
652    * <p>
653    * This is a shortcut for calling <code>header(<js>"Authorization"</js>, value);</code>
654    *
655    * @param value The new header value.
656    * @return This object (for method chaining).
657    */
658   public RestClientBuilder authorization(Object value) {
659      return header("Authorization", value);
660   }
661
662   /**
663    * Sets the value for the <code>Cache-Control</code> request header.
664    *
665    * <p>
666    * This is a shortcut for calling <code>header(<js>"Cache-Control"</js>, value);</code>
667    *
668    * @param value The new header value.
669    * @return This object (for method chaining).
670    */
671   public RestClientBuilder cacheControl(Object value) {
672      return header("Cache-Control", value);
673   }
674
675   /**
676    * Sets the value for the <code>Connection</code> request header.
677    *
678    * <p>
679    * This is a shortcut for calling <code>header(<js>"Connection"</js>, value);</code>
680    *
681    * @param value The new header value.
682    * @return This object (for method chaining).
683    */
684   public RestClientBuilder connection(Object value) {
685      return header("Connection", value);
686   }
687
688   /**
689    * Sets the value for the <code>Content-Length</code> request header.
690    *
691    * <p>
692    * This is a shortcut for calling <code>header(<js>"Content-Length"</js>, value);</code>
693    *
694    * @param value The new header value.
695    * @return This object (for method chaining).
696    */
697   public RestClientBuilder contentLength(Object value) {
698      return header("Content-Length", value);
699   }
700
701   /**
702    * Sets the value for the <code>Content-Type</code> request header.
703    *
704    * <p>
705    * This overrides the media type specified on the serializer, but is overridden by calling
706    * <code>header(<js>"Content-Type"</js>, value);</code>
707    *
708    * @param value The new header value.
709    * @return This object (for method chaining).
710    */
711   public RestClientBuilder contentType(Object value) {
712      return header("Content-Type", value);
713   }
714
715   /**
716    * Sets the value for the <code>Date</code> request header.
717    *
718    * <p>
719    * This is a shortcut for calling <code>header(<js>"Date"</js>, value);</code>
720    *
721    * @param value The new header value.
722    * @return This object (for method chaining).
723    */
724   public RestClientBuilder date(Object value) {
725      return header("Date", value);
726   }
727
728   /**
729    * Sets the value for the <code>Expect</code> request header.
730    *
731    * <p>
732    * This is a shortcut for calling <code>header(<js>"Expect"</js>, value);</code>
733    *
734    * @param value The new header value.
735    * @return This object (for method chaining).
736    */
737   public RestClientBuilder expect(Object value) {
738      return header("Expect", value);
739   }
740
741   /**
742    * Sets the value for the <code>Forwarded</code> request header.
743    *
744    * <p>
745    * This is a shortcut for calling <code>header(<js>"Forwarded"</js>, value);</code>
746    *
747    * @param value The new header value.
748    * @return This object (for method chaining).
749    */
750   public RestClientBuilder forwarded(Object value) {
751      return header("Forwarded", value);
752   }
753
754   /**
755    * Sets the value for the <code>From</code> request header.
756    *
757    * <p>
758    * This is a shortcut for calling <code>header(<js>"From"</js>, value);</code>
759    *
760    * @param value The new header value.
761    * @return This object (for method chaining).
762    */
763   public RestClientBuilder from(Object value) {
764      return header("From", value);
765   }
766
767   /**
768    * Sets the value for the <code>Host</code> request header.
769    *
770    * <p>
771    * This is a shortcut for calling <code>header(<js>"Host"</js>, value);</code>
772    *
773    * @param value The new header value.
774    * @return This object (for method chaining).
775    */
776   public RestClientBuilder host(Object value) {
777      return header("Host", value);
778   }
779
780   /**
781    * Sets the value for the <code>If-Match</code> request header.
782    *
783    * <p>
784    * This is a shortcut for calling <code>header(<js>"If-Match"</js>, value);</code>
785    *
786    * @param value The new header value.
787    * @return This object (for method chaining).
788    */
789   public RestClientBuilder ifMatch(Object value) {
790      return header("If-Match", value);
791   }
792
793   /**
794    * Sets the value for the <code>If-Modified-Since</code> request header.
795    *
796    * <p>
797    * This is a shortcut for calling <code>header(<js>"If-Modified-Since"</js>, value);</code>
798    *
799    * @param value The new header value.
800    * @return This object (for method chaining).
801    */
802   public RestClientBuilder ifModifiedSince(Object value) {
803      return header("If-Modified-Since", value);
804   }
805
806   /**
807    * Sets the value for the <code>If-None-Match</code> request header.
808    *
809    * <p>
810    * This is a shortcut for calling <code>header(<js>"If-None-Match"</js>, value);</code>
811    *
812    * @param value The new header value.
813    * @return This object (for method chaining).
814    */
815   public RestClientBuilder ifNoneMatch(Object value) {
816      return header("If-None-Match", value);
817   }
818
819   /**
820    * Sets the value for the <code>If-Range</code> request header.
821    *
822    * <p>
823    * This is a shortcut for calling <code>header(<js>"If-Range"</js>, value);</code>
824    *
825    * @param value The new header value.
826    * @return This object (for method chaining).
827    */
828   public RestClientBuilder ifRange(Object value) {
829      return header("If-Range", value);
830   }
831
832   /**
833    * Sets the value for the <code>If-Unmodified-Since</code> request header.
834    *
835    * <p>
836    * This is a shortcut for calling <code>header(<js>"If-Unmodified-Since"</js>, value);</code>
837    *
838    * @param value The new header value.
839    * @return This object (for method chaining).
840    */
841   public RestClientBuilder ifUnmodifiedSince(Object value) {
842      return header("If-Unmodified-Since", value);
843   }
844
845   /**
846    * Sets the value for the <code>Max-Forwards</code> request header.
847    *
848    * <p>
849    * This is a shortcut for calling <code>header(<js>"Max-Forwards"</js>, value);</code>
850    *
851    * @param value The new header value.
852    * @return This object (for method chaining).
853    */
854   public RestClientBuilder maxForwards(Object value) {
855      return header("If-Unmodified-Since", value);
856   }
857
858   /**
859    * When called, <code>No-Trace: true</code> is added to requests.
860    *
861    * <p>
862    * This gives the opportunity for the servlet to not log errors on invalid requests.
863    * This is useful for testing purposes when you don't want your log file to show lots of errors that are simply the
864    * results of testing.
865    *
866    * @return This object (for method chaining).
867    */
868   public RestClientBuilder noTrace() {
869      return header("No-Trace", true);
870   }
871
872   /**
873    * Sets the value for the <code>Origin</code> request header.
874    *
875    * <p>
876    * This is a shortcut for calling <code>header(<js>"Origin"</js>, value);</code>
877    *
878    * @param value The new header value.
879    * @return This object (for method chaining).
880    */
881   public RestClientBuilder origin(Object value) {
882      return header("If-Unmodified-Since", value);
883   }
884
885   /**
886    * Sets the value for the <code>Pragma</code> request header.
887    *
888    * <p>
889    * This is a shortcut for calling <code>header(<js>"Pragma"</js>, value);</code>
890    *
891    * @param value The new header value.
892    * @return This object (for method chaining).
893    */
894   public RestClientBuilder pragma(Object value) {
895      return header("Pragma", value);
896   }
897
898   /**
899    * Sets the value for the <code>Proxy-Authorization</code> request header.
900    *
901    * <p>
902    * This is a shortcut for calling <code>header(<js>"Proxy-Authorization"</js>, value);</code>
903    *
904    * @param value The new header value.
905    * @return This object (for method chaining).
906    */
907   public RestClientBuilder proxyAuthorization(Object value) {
908      return header("Proxy-Authorization", value);
909   }
910
911   /**
912    * Sets the value for the <code>Range</code> request header.
913    *
914    * <p>
915    * This is a shortcut for calling <code>header(<js>"Range"</js>, value);</code>
916    *
917    * @param value The new header value.
918    * @return This object (for method chaining).
919    */
920   public RestClientBuilder range(Object value) {
921      return header("Range", value);
922   }
923
924   /**
925    * Sets the value for the <code>Referer</code> request header.
926    *
927    * <p>
928    * This is a shortcut for calling <code>header(<js>"Referer"</js>, value);</code>
929    *
930    * @param value The new header value.
931    * @return This object (for method chaining).
932    */
933   public RestClientBuilder referer(Object value) {
934      return header("Referer", value);
935   }
936
937   /**
938    * Sets the value for the <code>TE</code> request header.
939    *
940    * <p>
941    * This is a shortcut for calling <code>header(<js>"TE"</js>, value);</code>
942    *
943    * @param value The new header value.
944    * @return This object (for method chaining).
945    */
946   public RestClientBuilder te(Object value) {
947      return header("TE", value);
948   }
949
950   /**
951    * Sets the value for the <code>User-Agent</code> request header.
952    *
953    * <p>
954    * This is a shortcut for calling <code>header(<js>"User-Agent"</js>, value);</code>
955    *
956    * @param value The new header value.
957    * @return This object (for method chaining).
958    */
959   public RestClientBuilder userAgent(Object value) {
960      return header("User-Agent", value);
961   }
962
963   /**
964    * Sets the value for the <code>Upgrade</code> request header.
965    *
966    * <p>
967    * This is a shortcut for calling <code>header(<js>"Upgrade"</js>, value);</code>
968    *
969    * @param value The new header value.
970    * @return This object (for method chaining).
971    */
972   public RestClientBuilder upgrade(Object value) {
973      return header("Upgrade", value);
974   }
975
976   /**
977    * Sets the value for the <code>Via</code> request header.
978    *
979    * <p>
980    * This is a shortcut for calling <code>header(<js>"Via"</js>, value);</code>
981    *
982    * @param value The new header value.
983    * @return This object (for method chaining).
984    */
985   public RestClientBuilder via(Object value) {
986      return header("Via", value);
987   }
988
989   /**
990    * Sets the value for the <code>Warning</code> request header.
991    *
992    * <p>
993    * This is a shortcut for calling <code>header(<js>"Warning"</js>, value);</code>
994    *
995    * @param value The new header value.
996    * @return This object (for method chaining).
997    */
998   public RestClientBuilder warning(Object value) {
999      return header("Warning", value);
1000   }
1001
1002
1003   //-----------------------------------------------------------------------------------------------------------------
1004   // Properties
1005   //-----------------------------------------------------------------------------------------------------------------
1006
1007   /**
1008    * Configuration property:  Executor service.
1009    *
1010    * <p>
1011    * Defines the executor service to use when calling future methods on the {@link RestCall} class.
1012    *
1013    * <p>
1014    * This executor service is used to create {@link Future} objects on the following methods:
1015    * <ul>
1016    *    <li>{@link RestCall#runFuture()}
1017    *    <li>{@link RestCall#getResponseFuture(Class)}
1018    *    <li>{@link RestCall#getResponseFuture(Type,Type...)}
1019    *    <li>{@link RestCall#getResponseAsString()}
1020    * </ul>
1021    *
1022    * <p>
1023    * The default executor service is a single-threaded {@link ThreadPoolExecutor} with a 30 second timeout
1024    * and a queue size of 10.
1025    *
1026    * <h5 class='section'>See Also:</h5>
1027    * <ul>
1028    *    <li class='jf'>{@link RestClient#RESTCLIENT_executorService}
1029    *    <li class='jf'>{@link RestClient#RESTCLIENT_executorServiceShutdownOnClose}
1030    * </ul>
1031    *
1032    * @param executorService The executor service.
1033    * @param shutdownOnClose Call {@link ExecutorService#shutdown()} when {@link RestClient#close()} is called.
1034    * @return This object (for method chaining).
1035    */
1036   public RestClientBuilder executorService(ExecutorService executorService, boolean shutdownOnClose) {
1037      set(RESTCLIENT_executorService, executorService);
1038      set(RESTCLIENT_executorServiceShutdownOnClose, shutdownOnClose);
1039      return this;
1040   }
1041
1042   /**
1043    * Configuration property:  Request headers.
1044    *
1045    * <h5 class='section'>See Also:</h5>
1046    * <ul>
1047    *    <li class='jf'>{@link RestClient#RESTCLIENT_headers}
1048    * </ul>
1049    *
1050    * @param key The header name.
1051    * @param value The header value.
1052    * @return This object (for method chaining).
1053    */
1054   public RestClientBuilder header(String key, Object value) {
1055      return addTo(RESTCLIENT_headers, key, value);
1056   }
1057
1058   /**
1059    * Configuration property:  Keep HttpClient open.
1060    *
1061    * <p>
1062    * Don't close this client when the {@link RestClient#close()} method is called.
1063    *
1064    * <h5 class='section'>See Also:</h5>
1065    * <ul>
1066    *    <li class='jf'>{@link RestClient#RESTCLIENT_keepHttpClientOpen}
1067    * </ul>
1068    *
1069    * @param value
1070    *    The new value for this property.
1071    *    <br>The default value is <jk>false</jk>.
1072    * @return This object (for method chaining).
1073    */
1074   public RestClientBuilder keepHttpClientOpen(boolean value) {
1075      return set(RESTCLIENT_keepHttpClientOpen, value);
1076   }
1077
1078   /**
1079    * Configuration property:  Call interceptors.
1080    *
1081    * <p>
1082    * Adds an interceptor that gets called immediately after a connection is made.
1083    *
1084    * <h5 class='section'>See Also:</h5>
1085    * <ul>
1086    *    <li class='jf'>{@link RestClient#RESTCLIENT_interceptors}
1087    * </ul>
1088    *
1089    * @param value The values to add to this setting.
1090    * @return This object (for method chaining).
1091    */
1092   public RestClientBuilder interceptors(RestCallInterceptor...value) {
1093      return addTo(RESTCLIENT_interceptors, value);
1094   }
1095
1096   /**
1097    * Configuration property:  Parser.
1098    *
1099    * <p>
1100    * The parser to use for parsing POJOs in response bodies.
1101    *
1102    * <h5 class='section'>See Also:</h5>
1103    * <ul>
1104    *    <li class='jf'>{@link RestClient#RESTCLIENT_parser}
1105    * </ul>
1106    *
1107    * @param value
1108    *    The new value for this setting.
1109    *    <br>The default value is {@link JsonParser#DEFAULT}.
1110    * @return This object (for method chaining).
1111    */
1112   public RestClientBuilder parser(Class<? extends Parser> value) {
1113      return set(RESTCLIENT_parser, value);
1114   }
1115
1116   /**
1117    * Configuration property:  Parser.
1118    *
1119    * <p>
1120    * Same as {@link #parser(Parser)} except takes in a parser instance.
1121    *
1122    * <h5 class='section'>See Also:</h5>
1123    * <ul>
1124    *    <li class='jf'>{@link RestClient#RESTCLIENT_parser}
1125    * </ul>
1126    *
1127    * @param value
1128    *    The new value for this setting.
1129    *    <br>The default value is {@link JsonParser#DEFAULT}.
1130    * @return This object (for method chaining).
1131    */
1132   public RestClientBuilder parser(Parser value) {
1133      return set(RESTCLIENT_parser, value);
1134   }
1135
1136   /**
1137    * Configuration property:  Part parser.
1138    *
1139    * <p>
1140    * The parser to use for parsing POJOs from form data, query parameters, headers, and path variables.
1141    *
1142    * <h5 class='section'>See Also:</h5>
1143    * <ul>
1144    *    <li class='jf'>{@link RestClient#RESTCLIENT_partParser}
1145    * </ul>
1146    *
1147    * @param value
1148    *    The new value for this setting.
1149    *    <br>The default value is {@link OpenApiParser}.
1150    * @return This object (for method chaining).
1151    */
1152   public RestClientBuilder partParser(Class<? extends HttpPartParser> value) {
1153      return set(RESTCLIENT_partParser, value);
1154   }
1155
1156   /**
1157    * Configuration property:  Part parser.
1158    *
1159    * <p>
1160    * Same as {@link #partParser(Class)} but takes in a parser instance.
1161    *
1162    * <h5 class='section'>See Also:</h5>
1163    * <ul>
1164    *    <li class='jf'>{@link RestClient#RESTCLIENT_partParser}
1165    * </ul>
1166    *
1167    * @param value
1168    *    The new value for this setting.
1169    *    <br>The default value is {@link OpenApiParser}.
1170    * @return This object (for method chaining).
1171    */
1172   public RestClientBuilder partParser(HttpPartParser value) {
1173      return set(RESTCLIENT_partParser, value);
1174   }
1175
1176   /**
1177    * Configuration property:  Part serializer.
1178    *
1179    * <p>
1180    * The serializer to use for serializing POJOs in form data, query parameters, headers, and path variables.
1181    *
1182    * <h5 class='section'>See Also:</h5>
1183    * <ul>
1184    *    <li class='jf'>{@link RestClient#RESTCLIENT_partSerializer}
1185    * </ul>
1186    *
1187    * @param value
1188    *    The new value for this setting.
1189    *    <br>The default value is {@link OpenApiSerializer}.
1190    * @return This object (for method chaining).
1191    */
1192   public RestClientBuilder partSerializer(Class<? extends HttpPartSerializer> value) {
1193      return set(RESTCLIENT_partSerializer, value);
1194   }
1195
1196   /**
1197    * Configuration property:  Part serializer.
1198    *
1199    * <p>
1200    * Same as {@link #partSerializer(Class)} but takes in a parser instance.
1201    *
1202    * <h5 class='section'>See Also:</h5>
1203    * <ul>
1204    *    <li class='jf'>{@link RestClient#RESTCLIENT_partSerializer}
1205    * </ul>
1206    *
1207    * @param value
1208    *    The new value for this setting.
1209    *    <br>The default value is {@link OpenApiSerializer}.
1210    * @return This object (for method chaining).
1211    */
1212   public RestClientBuilder partSerializer(HttpPartSerializer value) {
1213      return set(RESTCLIENT_partSerializer, value);
1214   }
1215
1216   /**
1217    * Make HTTP calls retryable if an error response (>=400) is received.
1218    *
1219    * <h5 class='section'>See Also:</h5>
1220    * <ul>
1221    *    <li class='jf'>{@link RestClient#RESTCLIENT_retries}
1222    *    <li class='jf'>{@link RestClient#RESTCLIENT_retryInterval}
1223    *    <li class='jf'>{@link RestClient#RESTCLIENT_retryOn}
1224    * </ul>
1225    *
1226    * @param retries The number of retries to attempt.
1227    * @param interval The time in milliseconds between attempts.
1228    * @param retryOn
1229    *    Optional object used for determining whether a retry should be attempted.
1230    *    If <jk>null</jk>, uses {@link RetryOn#DEFAULT}.
1231    * @return This object (for method chaining).
1232    */
1233   public RestClientBuilder retryable(int retries, int interval, RetryOn retryOn) {
1234      set(RESTCLIENT_retries, retries);
1235      set(RESTCLIENT_retryInterval, interval);
1236      set(RESTCLIENT_retryOn, retryOn);
1237      return this;
1238   }
1239
1240   /**
1241    * Configuration property:  Root URI.
1242    *
1243    * <p>
1244    * When set, relative URL strings passed in through the various rest call methods (e.g. {@link RestClient#doGet(Object)}
1245    * will be prefixed with the specified root.
1246    * <br>This root URL is ignored on those methods if you pass in a {@link URL}, {@link URI}, or an absolute URL string.
1247    *
1248    * <h5 class='section'>See Also:</h5>
1249    * <ul>
1250    *    <li class='jf'>{@link RestClient#RESTCLIENT_rootUri}
1251    * </ul>
1252    *
1253    * @param value
1254    *    The root URL to prefix to relative URL strings.
1255    *    <br>Trailing slashes are trimmed.
1256    *    <br>Usually a <code>String</code> but you can also pass in <code>URI</code> and <code>URL</code> objects as well.
1257    * @return This object (for method chaining).
1258    */
1259   public RestClientBuilder rootUrl(Object value) {
1260      return set(RESTCLIENT_rootUri, value);
1261   }
1262
1263   /**
1264    * Configuration property:  Request query parameters.
1265    *
1266    * <h5 class='section'>See Also:</h5>
1267    * <ul>
1268    *    <li class='jf'>{@link RestClient#RESTCLIENT_query}
1269    * </ul>
1270    *
1271    * @param key The query parameter name.
1272    * @param value The query parameter value value.
1273    * @return This object (for method chaining).
1274    */
1275   public RestClientBuilder query(String key, Object value) {
1276      return addTo(RESTCLIENT_query, key, value);
1277   }
1278
1279   /**
1280    * Configuration property:  Serializer.
1281    *
1282    * <p>
1283    * The serializer to use for serializing POJOs in request bodies.
1284    *
1285    * <h5 class='section'>See Also:</h5>
1286    * <ul>
1287    *    <li class='jf'>{@link RestClient#RESTCLIENT_serializer}
1288    * </ul>
1289    *
1290    * @param value
1291    *    The new value for this setting.
1292    *    <br>The default is {@link JsonSerializer}.
1293    * @return This object (for method chaining).
1294    */
1295   public RestClientBuilder serializer(Class<? extends Serializer> value) {
1296      return set(RESTCLIENT_serializer, value);
1297   }
1298
1299   /**
1300    * Configuration property:  Serializer.
1301    *
1302    * <p>
1303    * Same as {@link #serializer(Class)} but takes in a serializer instance.
1304    *
1305    * <h5 class='section'>See Also:</h5>
1306    * <ul>
1307    *    <li class='jf'>{@link RestClient#RESTCLIENT_serializer}
1308    * </ul>
1309    *
1310    * @param value
1311    *    The new value for this setting.
1312    *    <br>The default is {@link JsonSerializer}.
1313    * @return This object (for method chaining).
1314    */
1315   public RestClientBuilder serializer(Serializer value) {
1316      return set(RESTCLIENT_serializer, value);
1317   }
1318
1319   /**
1320    * Configuration property:  Add <js>"_type"</js> properties when needed.
1321    *
1322    * <p>
1323    * If <jk>true</jk>, then <js>"_type"</js> properties will be added to beans if their type cannot be inferred
1324    * through reflection.
1325    *
1326    * <h5 class='section'>See Also:</h5>
1327    * <ul>
1328    *    <li class='jf'>{@link Serializer#SERIALIZER_addBeanTypes}
1329    * </ul>
1330    *
1331    * @param value
1332    *    The new value for this property.
1333    *    <br>The default is <jk>false</jk>.
1334    * @return This object (for method chaining).
1335    */
1336   public RestClientBuilder addBeanTypes(boolean value) {
1337      return set(SERIALIZER_addBeanTypes, value);
1338   }
1339
1340   /**
1341    * Configuration property:  Add <js>"_type"</js> properties when needed.
1342    *
1343    * <p>
1344    * Shortcut for calling <code>addBeanTypes(<jk>true</jk>)</code>.
1345    *
1346    * <h5 class='section'>See Also:</h5>
1347    * <ul>
1348    *    <li class='jf'>{@link Serializer#SERIALIZER_addBeanTypes}
1349    * </ul>
1350    *
1351    * @return This object (for method chaining).
1352    */
1353   public RestClientBuilder addBeanTypes() {
1354      return set(SERIALIZER_addBeanTypes, true);
1355   }
1356
1357   /**
1358    * Configuration property:  Add type attribute to root nodes.
1359    *
1360    * <p>
1361    * When disabled, it is assumed that the parser knows the exact Java POJO type being parsed, and therefore top-level
1362    * type information that might normally be included to determine the data type will not be serialized.
1363    *
1364    * <h5 class='section'>See Also:</h5>
1365    * <ul>
1366    *    <li class='jf'>{@link Serializer#SERIALIZER_addRootType}
1367    * </ul>
1368    *
1369    * @param value
1370    *    The new value for this property.
1371    *    <br>The default is <jk>false</jk>.
1372    * @return This object (for method chaining).
1373    */
1374   public RestClientBuilder addRootType(boolean value) {
1375      return set(SERIALIZER_addRootType, value);
1376   }
1377
1378   /**
1379    * Configuration property:  Add type attribute to root nodes.
1380    *
1381    * <p>
1382    * Shortcut for calling <code>addRootType(<jk>true</jk>)</code>.
1383    *
1384    * <h5 class='section'>See Also:</h5>
1385    * <ul>
1386    *    <li class='jf'>{@link Serializer#SERIALIZER_addRootType}
1387    * </ul>
1388    *
1389    * @return This object (for method chaining).
1390    */
1391   public RestClientBuilder addRootType() {
1392      return set(SERIALIZER_addRootType, true);
1393   }
1394
1395   /**
1396    * Configuration property:  Automatically detect POJO recursions.
1397    *
1398    * <p>
1399    * Specifies that recursions should be checked for during serialization.
1400    *
1401    * <h5 class='section'>Notes:</h5>
1402    * <ul class='spaced-list'>
1403    *    <li>
1404    *       Checking for recursion can cause a small performance penalty.
1405    * </ul>
1406    *
1407    * <h5 class='section'>See Also:</h5>
1408    * <ul>
1409    *    <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_detectRecursions}
1410    * </ul>
1411    *
1412    * @param value
1413    *    The new value for this property.
1414    *    <br>The default is <jk>false</jk>.
1415    * @return This object (for method chaining).
1416    */
1417   public RestClientBuilder detectRecursions(boolean value) {
1418      return set(BEANTRAVERSE_detectRecursions, value);
1419   }
1420
1421   /**
1422    * Configuration property:  Automatically detect POJO recursions.
1423    *
1424    * <p>
1425    * Shortcut for calling <code>detectRecursions(<jk>true</jk>)</code>.
1426    *
1427    * <h5 class='section'>See Also:</h5>
1428    * <ul>
1429    *    <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_detectRecursions}
1430    * </ul>
1431    *
1432    * @return This object (for method chaining).
1433    */
1434   public RestClientBuilder detectRecursions() {
1435      return set(BEANTRAVERSE_detectRecursions, true);
1436   }
1437
1438   /**
1439    * Configuration property:  Ignore recursion errors.
1440    *
1441    * <p>
1442    * If <jk>true</jk>, when we encounter the same object when serializing a tree, we set the value to <jk>null</jk>.
1443    * Otherwise, an exception is thrown.
1444    *
1445    * <h5 class='section'>Notes:</h5>
1446    * <ul class='spaced-list'>
1447    *    <li>
1448    *       Checking for recursion can cause a small performance penalty.
1449    * </ul>
1450    *
1451    * <h5 class='section'>See Also:</h5>
1452    * <ul>
1453    *    <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_ignoreRecursions}
1454    * </ul>
1455    *
1456    * @param value
1457    *    The new value for this property.
1458    *    <br>The default is <jk>false</jk>.
1459    * @return This object (for method chaining).
1460    */
1461   public RestClientBuilder ignoreRecursions(boolean value) {
1462      return set(BEANTRAVERSE_ignoreRecursions, value);
1463   }
1464
1465   /**
1466    * Configuration property:  Ignore recursion errors.
1467    *
1468    * <p>
1469    * Shortcut for calling <code>ignoreRecursions(<jk>true</jk>)</code>.
1470    *
1471    * <h5 class='section'>See Also:</h5>
1472    * <ul>
1473    *    <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_ignoreRecursions}
1474    * </ul>
1475    *
1476    * @return This object (for method chaining).
1477    */
1478   public RestClientBuilder ignoreRecursions() {
1479      return set(BEANTRAVERSE_ignoreRecursions, true);
1480   }
1481
1482   /**
1483    * Configuration property:  Initial depth.
1484    *
1485    * <p>
1486    * The initial indentation level at the root.
1487    *
1488    * <h5 class='section'>See Also:</h5>
1489    * <ul>
1490    *    <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_initialDepth}
1491    * </ul>
1492    *
1493    * @param value
1494    *    The new value for this property.
1495    *    <br>The default is <code>0</code>.
1496    * @return This object (for method chaining).
1497    */
1498   public RestClientBuilder initialDepth(int value) {
1499      return set(BEANTRAVERSE_initialDepth, value);
1500   }
1501
1502   /**
1503    * Configuration property:  Serializer listener.
1504    *
1505    * <p>
1506    * Class used to listen for errors and warnings that occur during serialization.
1507    *
1508    * <h5 class='section'>See Also:</h5>
1509    * <ul>
1510    *    <li class='jf'>{@link Serializer#SERIALIZER_listener}
1511    * </ul>
1512    *
1513    * @param value
1514    *    The new value for this property.
1515    * @return This object (for method chaining).
1516    */
1517   public RestClientBuilder listenerS(Class<? extends SerializerListener> value) {
1518      return set(SERIALIZER_listener, value);
1519   }
1520
1521   /**
1522    * Configuration property:  Max serialization depth.
1523    *
1524    * <p>
1525    * Abort serialization if specified depth is reached in the POJO tree.
1526    * <br>If this depth is exceeded, an exception is thrown.
1527    * <br>This prevents stack overflows from occurring when trying to serialize models with recursive references.
1528    *
1529    * <h5 class='section'>See Also:</h5>
1530    * <ul>
1531    *    <li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_maxDepth}
1532    * </ul>
1533    *
1534    * @param value
1535    *    The new value for this property.
1536    *    <br>The default is <code>100</code>.
1537    * @return This object (for method chaining).
1538    */
1539   public RestClientBuilder maxDepth(int value) {
1540      return set(BEANTRAVERSE_maxDepth, value);
1541   }
1542
1543   /**
1544    * Configuration property:  Sort arrays and collections alphabetically.
1545    *
1546    * <p>
1547    * Copies and sorts the contents of arrays and collections before serializing them.
1548    *
1549    * <h5 class='section'>See Also:</h5>
1550    * <ul>
1551    *    <li class='jf'>{@link Serializer#SERIALIZER_sortCollections}
1552    * </ul>
1553    *
1554    * @param value
1555    *    The new value for this property.
1556    *    <br>The default is <jk>false</jk>.
1557    * @return This object (for method chaining).
1558    */
1559   public RestClientBuilder sortCollections(boolean value) {
1560      return set(SERIALIZER_sortCollections, value);
1561   }
1562
1563   /**
1564    * Configuration property:  Sort arrays and collections alphabetically.
1565    *
1566    * <p>
1567    * Shortcut for calling <code>sortCollections(<jk>true</jk>)</code>.
1568    *
1569    * <h5 class='section'>See Also:</h5>
1570    * <ul>
1571    *    <li class='jf'>{@link Serializer#SERIALIZER_sortCollections}
1572    * </ul>
1573    *
1574    * @return This object (for method chaining).
1575    */
1576   public RestClientBuilder sortCollections() {
1577      return set(SERIALIZER_sortCollections, true);
1578   }
1579
1580   /**
1581    * Sets the {@link Serializer#SERIALIZER_sortMaps} property on all serializers in this group.
1582    *
1583    * <p>
1584    * Copies and sorts the contents of maps before serializing them.
1585    *
1586    * <h5 class='section'>See Also:</h5>
1587    * <ul>
1588    *    <li class='jf'>{@link Serializer#SERIALIZER_sortMaps}
1589    * </ul>
1590    *
1591    * @param value The new value for this property.
1592    * @return This object (for method chaining).
1593    */
1594   public RestClientBuilder sortMaps(boolean value) {
1595      return set(SERIALIZER_sortMaps, value);
1596   }
1597
1598   /**
1599    * Configuration property:  Sort maps alphabetically.
1600    *
1601    * <p>
1602    * Shortcut for calling <code>sortMaps(<jk>true</jk>)</code>.
1603    *
1604    * <h5 class='section'>See Also:</h5>
1605    * <ul>
1606    *    <li class='jf'>{@link Serializer#SERIALIZER_sortMaps}
1607    * </ul>
1608    *
1609    * @return This object (for method chaining).
1610    */
1611   public RestClientBuilder sortMaps() {
1612      return set(SERIALIZER_sortMaps, true);
1613   }
1614
1615   /**
1616    * Configuration property:  Trim empty lists and arrays.
1617    *
1618    * <p>
1619    * If <jk>true</jk>, empty list values will not be serialized to the output.
1620    *
1621    * <h5 class='section'>See Also:</h5>
1622    * <ul>
1623    *    <li class='jf'>{@link Serializer#SERIALIZER_trimEmptyCollections}
1624    * </ul>
1625    *
1626    * @param value
1627    *    The new value for this property.
1628    *    <br>The default is <jk>false</jk>.
1629    * @return This object (for method chaining).
1630    */
1631   public RestClientBuilder trimEmptyCollections(boolean value) {
1632      return set(SERIALIZER_trimEmptyCollections, value);
1633   }
1634
1635   /**
1636    * Configuration property:  Trim empty lists and arrays.
1637    *
1638    * <p>
1639    * Shortcut for calling <code>trimEmptyCollections(<jk>true</jk>)</code>.
1640    *
1641    * <h5 class='section'>See Also:</h5>
1642    * <ul>
1643    *    <li class='jf'>{@link Serializer#SERIALIZER_trimEmptyCollections}
1644    * </ul>
1645    *
1646    * @return This object (for method chaining).
1647    */
1648   public RestClientBuilder trimEmptyCollections() {
1649      return set(SERIALIZER_trimEmptyCollections, true);
1650   }
1651
1652   /**
1653    * Configuration property:  Trim empty maps.
1654    *
1655    * <p>
1656    * If <jk>true</jk>, empty map values will not be serialized to the output.
1657    *
1658    * <h5 class='section'>See Also:</h5>
1659    * <ul>
1660    *    <li class='jf'>{@link Serializer#SERIALIZER_trimEmptyMaps}
1661    * </ul>
1662    *
1663    * @param value
1664    *    The new value for this property.
1665    *    <br>The default is <jk>false</jk>.
1666    * @return This object (for method chaining).
1667    */
1668   public RestClientBuilder trimEmptyMaps(boolean value) {
1669      return set(SERIALIZER_trimEmptyMaps, value);
1670   }
1671
1672   /**
1673    * Configuration property:  Trim empty maps.
1674    *
1675    * <p>
1676    * Shortcut for calling <code>trimEmptyMaps(<jk>true</jk>)</code>.
1677    *
1678    * <h5 class='section'>See Also:</h5>
1679    * <ul>
1680    *    <li class='jf'>{@link Serializer#SERIALIZER_trimEmptyMaps}
1681    * </ul>
1682    *
1683    * @return This object (for method chaining).
1684    */
1685   public RestClientBuilder trimEmptyMaps() {
1686      return set(SERIALIZER_trimEmptyMaps, true);
1687   }
1688
1689   /**
1690    * Configuration property:  Trim null bean property values.
1691    *
1692    * <p>
1693    * If <jk>true</jk>, null bean values will not be serialized to the output.
1694    *
1695    * <h5 class='section'>See Also:</h5>
1696    * <ul>
1697    *    <li class='jf'>{@link Serializer#SERIALIZER_trimNullProperties}
1698    * </ul>
1699    *
1700    * @param value
1701    *    The new value for this property.
1702    *    <br>The default is <jk>true</jk>.
1703    * @return This object (for method chaining).
1704    */
1705   public RestClientBuilder trimNullProperties(boolean value) {
1706      return set(SERIALIZER_trimNullProperties, value);
1707   }
1708
1709   /**
1710    * Configuration property:  Trim strings.
1711    *
1712    * <p>
1713    * If <jk>true</jk>, string values will be trimmed of whitespace using {@link String#trim()} before being serialized.
1714    *
1715    * <h5 class='section'>See Also:</h5>
1716    * <ul>
1717    *    <li class='jf'>{@link Serializer#SERIALIZER_trimStrings}
1718    * </ul>
1719    *
1720    * @param value
1721    *    The new value for this property.
1722    *    <br>The default is <jk>false</jk>.
1723    * @return This object (for method chaining).
1724    */
1725   public RestClientBuilder trimStringsS(boolean value) {
1726      return set(SERIALIZER_trimStrings, value);
1727   }
1728
1729   /**
1730    * Configuration property:  Trim strings.
1731    *
1732    * <p>
1733    * Shortcut for calling <code>trimStrings(<jk>true</jk>)</code>.
1734    *
1735    * <h5 class='section'>See Also:</h5>
1736    * <ul>
1737    *    <li class='jf'>{@link Serializer#SERIALIZER_trimStrings}
1738    * </ul>
1739    *
1740    * @return This object (for method chaining).
1741    */
1742   public RestClientBuilder trimStringsS() {
1743      return set(SERIALIZER_trimStrings, true);
1744   }
1745
1746   /**
1747    * Configuration property:  URI context bean.
1748    *
1749    * <p>
1750    * Bean used for resolution of URIs to absolute or root-relative form.
1751    *
1752    * <h5 class='section'>See Also:</h5>
1753    * <ul>
1754    *    <li class='jf'>{@link Serializer#SERIALIZER_uriContext}
1755    * </ul>
1756    *
1757    * @param value The new value for this property.
1758    * @return This object (for method chaining).
1759    */
1760   public RestClientBuilder uriContext(UriContext value) {
1761      return set(SERIALIZER_uriContext, value);
1762   }
1763
1764   /**
1765    * Configuration property:  URI relativity.
1766    *
1767    * <p>
1768    * Defines what relative URIs are relative to when serializing URI/URL objects.
1769    *
1770    * <h5 class='section'>See Also:</h5>
1771    * <ul>
1772    *    <li class='jf'>{@link Serializer#SERIALIZER_uriRelativity}
1773    * </ul>
1774    *
1775    * @param value
1776    *    The new value for this property.
1777    *    <br>The default is {@link UriRelativity#RESOURCE}
1778    * @return This object (for method chaining).
1779    */
1780   public RestClientBuilder uriRelativity(UriRelativity value) {
1781      return set(SERIALIZER_uriRelativity, value);
1782   }
1783
1784   /**
1785    * Configuration property:  URI resolution.
1786    *
1787    * <p>
1788    * Defines the resolution level for URIs when serializing URI/URL objects.
1789    *
1790    * <h5 class='section'>See Also:</h5>
1791    * <ul>
1792    *    <li class='jf'>{@link Serializer#SERIALIZER_uriResolution}
1793    * </ul>
1794    *
1795    * @param value
1796    *    The new value for this property.
1797    *    <br>The default is {@link UriResolution#NONE}
1798    * @return This object (for method chaining).
1799    */
1800   public RestClientBuilder uriResolution(UriResolution value) {
1801      return set(SERIALIZER_uriResolution, value);
1802   }
1803
1804   /**
1805    * Configuration property:  Maximum indentation.
1806    *
1807    * <p>
1808    * Specifies the maximum indentation level in the serialized document.
1809    *
1810    * <h5 class='section'>See Also:</h5>
1811    * <ul>
1812    *    <li class='jf'>{@link WriterSerializer#WSERIALIZER_maxIndent}
1813    * </ul>
1814    *
1815    * @param value
1816    *    The new value for this property.
1817    *    <br>The default is <code>100</code>.
1818    * @return This object (for method chaining).
1819    */
1820   public RestClientBuilder maxIndent(int value) {
1821      return set(WSERIALIZER_maxIndent, value);
1822   }
1823
1824   /**
1825    * Configuration property:  Quote character.
1826    *
1827    * <p>
1828    * This is the character used for quoting attributes and values.
1829    *
1830    * <h5 class='section'>See Also:</h5>
1831    * <ul>
1832    *    <li class='jf'>{@link WriterSerializer#WSERIALIZER_quoteChar}
1833    * </ul>
1834    *
1835    * @param value
1836    *    The new value for this property.
1837    *    <br>The default is <js>'"'</js>.
1838    * @return This object (for method chaining).
1839    */
1840   public RestClientBuilder quoteChar(char value) {
1841      return set(WSERIALIZER_quoteChar, value);
1842   }
1843
1844   /**
1845    * Configuration property:  Quote character.
1846    *
1847    * <p>
1848    * Shortcut for calling <code>quoteChar(<js>'\''</js>)</code>.
1849    *
1850    * <h5 class='section'>See Also:</h5>
1851    * <ul>
1852    *    <li class='jf'>{@link WriterSerializer#WSERIALIZER_quoteChar}
1853    * </ul>
1854    *
1855    * @return This object (for method chaining).
1856    */
1857   public RestClientBuilder sq() {
1858      return set(WSERIALIZER_quoteChar, '\'');
1859   }
1860
1861   /**
1862    * Configuration property:  Use whitespace.
1863    *
1864    * <p>
1865    * If <jk>true</jk>, newlines and indentation and spaces are added to the output to improve readability.
1866    *
1867    * <h5 class='section'>See Also:</h5>
1868    * <ul>
1869    *    <li class='jf'>{@link Serializer#SERIALIZER_useWhitespace}
1870    * </ul>
1871    *
1872    * @param value
1873    *    The new value for this property.
1874    *    <br>The default is <jk>false</jk>.
1875    * @return This object (for method chaining).
1876    */
1877   public RestClientBuilder useWhitespace(boolean value) {
1878      return set(SERIALIZER_useWhitespace, value);
1879   }
1880
1881   /**
1882    * Configuration property:  Use whitespace.
1883    *
1884    * <p>
1885    * Shortcut for calling <code>useWhitespace(<jk>true</jk>)</code>.
1886    *
1887    * <h5 class='section'>See Also:</h5>
1888    * <ul>
1889    *    <li class='jf'>{@link Serializer#SERIALIZER_useWhitespace}
1890    * </ul>
1891    * @return This object (for method chaining).
1892    */
1893   public RestClientBuilder useWhitespace() {
1894      return set(SERIALIZER_useWhitespace, true);
1895   }
1896
1897   /**
1898    * Configuration property:  Use whitespace.
1899    *
1900    * <p>
1901    * Shortcut for calling <code>useWhitespace(<jk>true</jk>)</code>.
1902    *
1903    * <h5 class='section'>See Also:</h5>
1904    * <ul>
1905    *    <li class='jf'>{@link Serializer#SERIALIZER_useWhitespace}
1906    * </ul>
1907    *
1908    * @return This object (for method chaining).
1909    */
1910   public RestClientBuilder ws() {
1911      return set(SERIALIZER_useWhitespace, true);
1912   }
1913
1914   /**
1915    * Configuration property:  Binary string format.
1916    *
1917    * <p>
1918    * When using the {@link Serializer#serializeToString(Object)} method on stream-based serializers, this defines the format to use
1919    * when converting the resulting byte array to a string.
1920    *
1921    * <ul>
1922    *    <li class='jf'>{@link OutputStreamSerializer#OSSERIALIZER_binaryFormat}
1923    * </ul>
1924    *
1925    * @param value
1926    *    The new value for this property.
1927    *    <br>The default is {@link BinaryFormat#HEX}.
1928    * @return This object (for method chaining).
1929    */
1930   public RestClientBuilder binaryOutputFormat(BinaryFormat value) {
1931      return set(OSSERIALIZER_binaryFormat, value);
1932   }
1933
1934   /**
1935    * Configuration property:  Auto-close streams.
1936    *
1937    * If <jk>true</jk>, <l>InputStreams</l> and <l>Readers</l> passed into parsers will be closed
1938    * after parsing is complete.
1939    *
1940    * <h5 class='section'>See Also:</h5>
1941    * <ul>
1942    *    <li class='jf'>{@link Parser#PARSER_autoCloseStreams}
1943    * </ul>
1944    *
1945    * @param value
1946    *    The new value for this property.
1947    *    <br>The default value is <jk>false</jk>.
1948    * @return This object (for method chaining).
1949    */
1950   public RestClientBuilder autoCloseStreams(boolean value) {
1951      return set(PARSER_autoCloseStreams, value);
1952   }
1953
1954   /**
1955    * Configuration property:  Auto-close streams.
1956    *
1957    * <p>
1958    * Shortcut for calling <code>autoCloseStreams(<jk>true</jk>)</code>.
1959    *
1960    * <h5 class='section'>See Also:</h5>
1961    * <ul>
1962    *    <li class='jf'>{@link Parser#PARSER_autoCloseStreams}
1963    * </ul>
1964    *
1965    * @return This object (for method chaining).
1966    */
1967   public RestClientBuilder autoCloseStreams() {
1968      return set(PARSER_autoCloseStreams, true);
1969   }
1970
1971   /**
1972    * Configuration property:  Debug output lines.
1973    *
1974    * When parse errors occur, this specifies the number of lines of input before and after the
1975    * error location to be printed as part of the exception message.
1976    *
1977    * <h5 class='section'>See Also:</h5>
1978    * <ul>
1979    *    <li class='jf'>{@link Parser#PARSER_debugOutputLines}
1980    * </ul>
1981    *
1982    * @param value
1983    *    The new value for this property.
1984    *    <br>The default value is <code>5</code>.
1985    * @return This object (for method chaining).
1986    */
1987   public RestClientBuilder debugOutputLines(int value) {
1988      set(PARSER_debugOutputLines, value);
1989      return this;
1990   }
1991
1992   /**
1993    * Configuration property:  Parser listener.
1994    *
1995    * <p>
1996    * Class used to listen for errors and warnings that occur during parsing.
1997    *
1998    * <h5 class='section'>See Also:</h5>
1999    * <ul>
2000    *    <li class='jf'>{@link Parser#PARSER_listener}
2001    * </ul>
2002    *
2003    * @param value The new value for this property.
2004    * @return This object (for method chaining).
2005    */
2006   public RestClientBuilder listenerP(Class<? extends ParserListener> value) {
2007      return set(PARSER_listener, value);
2008   }
2009
2010   /**
2011    * Configuration property:  Strict mode.
2012    *
2013    * <p>
2014    * If <jk>true</jk>, strict mode for the parser is enabled.
2015    *
2016    * <h5 class='section'>See Also:</h5>
2017    * <ul>
2018    *    <li class='jf'>{@link Parser#PARSER_strict}
2019    * </ul>
2020    *
2021    * @param value
2022    *    The new value for this property.
2023    *    <br>The default value is <jk>false</jk>.
2024    * @return This object (for method chaining).
2025    */
2026   public RestClientBuilder strict(boolean value) {
2027      return set(PARSER_strict, value);
2028   }
2029
2030   /**
2031    * Configuration property:  Strict mode.
2032    *
2033    * <p>
2034    * Shortcut for calling <code>strict(<jk>true</jk>)</code>.
2035    *
2036    * <h5 class='section'>See Also:</h5>
2037    * <ul>
2038    *    <li class='jf'>{@link Parser#PARSER_strict}
2039    * </ul>
2040    *
2041    * @return This object (for method chaining).
2042    */
2043   public RestClientBuilder strict() {
2044      return set(PARSER_strict, true);
2045   }
2046
2047   /**
2048    * Configuration property:  Trim parsed strings.
2049    *
2050    * <p>
2051    * If <jk>true</jk>, string values will be trimmed of whitespace using {@link String#trim()} before being added to
2052    * the POJO.
2053    *
2054    * <h5 class='section'>See Also:</h5>
2055    * <ul>
2056    *    <li class='jf'>{@link Parser#PARSER_trimStrings}
2057    * </ul>
2058    *
2059    * @param value
2060    *    The new value for this property.
2061    *    <br>The default value is <jk>false</jk>.
2062    * @return This object (for method chaining).
2063    */
2064   public RestClientBuilder trimStringsP(boolean value) {
2065      return set(PARSER_trimStrings, value);
2066   }
2067
2068   /**
2069    * Configuration property:  Trim parsed strings.
2070    *
2071    * <p>
2072    * Shortcut for calling <code>trimStrings(<jk>true</jk>)</code>.
2073    *
2074    * <h5 class='section'>See Also:</h5>
2075    * <ul>
2076    *    <li class='jf'>{@link Parser#PARSER_trimStrings}
2077    * </ul>
2078    *
2079    * @return This object (for method chaining).
2080    */
2081   public RestClientBuilder trimStringsP() {
2082      return set(PARSER_trimStrings, true);
2083   }
2084
2085   /**
2086    * Configuration property:  Unbuffered.
2087    *
2088    * If <jk>true</jk>, don't use internal buffering during parsing.
2089    *
2090    * <h5 class='section'>See Also:</h5>
2091    * <ul>
2092    *    <li class='jf'>{@link Parser#PARSER_unbuffered}
2093    * </ul>
2094    *
2095    * @param value
2096    *    The new value for this property.
2097    *    <br>The default value is <jk>false</jk>.
2098    * @return This object (for method chaining).
2099    */
2100   public RestClientBuilder unbuffered(boolean value) {
2101      return set(PARSER_unbuffered, value);
2102   }
2103
2104   /**
2105    * Configuration property:  Unbuffered.
2106    *
2107    * <p>
2108    * Shortcut for calling <code>unbuffered(<jk>true</jk>)</code>.
2109    *
2110    * <h5 class='section'>See Also:</h5>
2111    * <ul>
2112    *    <li class='jf'>{@link Parser#PARSER_unbuffered}
2113    * </ul>
2114    *
2115    * @return This object (for method chaining).
2116    */
2117   public RestClientBuilder unbuffered() {
2118      return set(PARSER_unbuffered, true);
2119   }
2120
2121   /**
2122    * Configuration property:  File charset.
2123    *
2124    * <p>
2125    * The character set to use for reading <code>Files</code> from the file system.
2126    *
2127    * <h5 class='section'>See Also:</h5>
2128    * <ul>
2129    *    <li class='jf'>{@link ReaderParser#RPARSER_fileCharset}
2130    * </ul>
2131    *
2132    * @param value
2133    *    The new value for this property.
2134    *    <br>The default value is <js>"DEFAULT"</js> which causes the system default to be used.
2135    * @return This object (for method chaining).
2136    */
2137   public RestClientBuilder fileCharset(String value) {
2138      return set(RPARSER_fileCharset, value);
2139   }
2140
2141   /**
2142    * Configuration property:  Input stream charset.
2143    *
2144    * <p>
2145    * The character set to use for converting <code>InputStreams</code> and byte arrays to readers.
2146    *
2147    * <h5 class='section'>See Also:</h5>
2148    * <ul>
2149    *    <li class='jf'>{@link ReaderParser#RPARSER_inputStreamCharset}
2150    * </ul>
2151    *
2152    * @param value
2153    *    The new value for this property.
2154    *    <br>The default value is <js>"UTF-8"</js>.
2155    * @return This object (for method chaining).
2156    */
2157   public RestClientBuilder inputStreamCharset(String value) {
2158      return set(RPARSER_inputStreamCharset, value);
2159   }
2160
2161   /**
2162    * Configuration property:  Binary input format.
2163    *
2164    * <p>
2165    * When using the {@link Parser#parse(Object,Class)} method on stream-based parsers and the input is a string, this defines the format to use
2166    * when converting the string into a byte array.
2167    *
2168    * <h5 class='section'>See Also:</h5>
2169    * <ul>
2170    *    <li class='jf'>{@link InputStreamParser#ISPARSER_binaryFormat}
2171    * </ul>
2172    *
2173    * @param value
2174    *    The new value for this property.
2175    *    <br>The default value is {@link BinaryFormat#HEX}.
2176    * @return This object (for method chaining).
2177    */
2178   public RestClientBuilder binaryInputFormat(BinaryFormat value) {
2179      return set(ISPARSER_binaryFormat, value);
2180   }
2181
2182   /**
2183    * Configuration property:  Parameter format.
2184    *
2185    * <h5 class='section'>See Also:</h5>
2186    * <ul>
2187    *    <li class='jf'>{@link UonSerializer#UON_paramFormat}
2188    * </ul>
2189    *
2190    * @param value The new value for this property.
2191    * @return This object (for method chaining).
2192    */
2193   public RestClientBuilder paramFormat(String value) {
2194      return set(UON_paramFormat, value);
2195   }
2196
2197   /**
2198    * Configuration property:  Parameter format.
2199    *
2200    * <h5 class='section'>See Also:</h5>
2201    * <ul>
2202    *    <li class='jf'>{@link UonSerializer#UON_paramFormat}
2203    * </ul>
2204    *
2205    * @return This object (for method chaining).
2206    */
2207   public RestClientBuilder paramFormatPlain() {
2208      return set(UON_paramFormat, "PLAINTEXT");
2209   }
2210
2211   @Override /* BeanContextBuilder */
2212   public RestClientBuilder beanClassVisibility(Visibility value) {
2213      super.beanClassVisibility(value);
2214      return this;
2215   }
2216
2217   @Override /* BeanContextBuilder */
2218   public RestClientBuilder beanConstructorVisibility(Visibility value) {
2219      super.beanConstructorVisibility(value);
2220      return this;
2221   }
2222
2223   @Override /* BeanContextBuilder */
2224   public RestClientBuilder beanDictionary(boolean append, Object...values) {
2225      super.beanDictionary(append, values);
2226      return this;
2227   }
2228
2229   @Override /* BeanContextBuilder */
2230   public RestClientBuilder beanDictionary(Class<?>...values) {
2231      super.beanDictionary(values);
2232      return this;
2233   }
2234
2235   @Override /* BeanContextBuilder */
2236   public RestClientBuilder beanDictionary(Object...values) {
2237      super.beanDictionary(values);
2238      return this;
2239   }
2240
2241   @Override /* BeanContextBuilder */
2242   public RestClientBuilder beanDictionaryRemove(Object...values) {
2243      super.beanDictionaryRemove(values);
2244      return this;
2245   }
2246
2247   @Override /* BeanContextBuilder */
2248   public RestClientBuilder beanFieldVisibility(Visibility value) {
2249      super.beanFieldVisibility(value);
2250      return this;
2251   }
2252
2253   @Override /* BeanContextBuilder */
2254   public RestClientBuilder beanFilters(boolean append, Object...values) {
2255      super.beanFilters(append, values);
2256      return this;
2257   }
2258
2259   @Override /* BeanContextBuilder */
2260   public RestClientBuilder beanFilters(Class<?>...values) {
2261      super.beanFilters(values);
2262      return this;
2263   }
2264
2265   @Override /* BeanContextBuilder */
2266   public RestClientBuilder beanFilters(Object...values) {
2267      super.beanFilters(values);
2268      return this;
2269   }
2270
2271   @Override /* BeanContextBuilder */
2272   public RestClientBuilder beanFiltersRemove(Object...values) {
2273      super.beanFiltersRemove(values);
2274      return this;
2275   }
2276
2277   @Override /* BeanContextBuilder */
2278   public RestClientBuilder beanMapPutReturnsOldValue(boolean value) {
2279      super.beanMapPutReturnsOldValue(value);
2280      return this;
2281   }
2282
2283   @Override /* BeanContextBuilder */
2284   public RestClientBuilder beanMapPutReturnsOldValue() {
2285      super.beanMapPutReturnsOldValue();
2286      return this;
2287   }
2288
2289   @Override /* BeanContextBuilder */
2290   public RestClientBuilder beanMethodVisibility(Visibility value) {
2291      super.beanMethodVisibility(value);
2292      return this;
2293   }
2294
2295   @Override /* BeanContextBuilder */
2296   public RestClientBuilder beansRequireDefaultConstructor(boolean value) {
2297      super.beansRequireDefaultConstructor(value);
2298      return this;
2299   }
2300
2301   @Override /* BeanContextBuilder */
2302   public RestClientBuilder beansRequireDefaultConstructor() {
2303      super.beansRequireDefaultConstructor();
2304      return this;
2305   }
2306
2307   @Override /* BeanContextBuilder */
2308   public RestClientBuilder beansRequireSerializable(boolean value) {
2309      super.beansRequireSerializable(value);
2310      return this;
2311   }
2312
2313   @Override /* BeanContextBuilder */
2314   public RestClientBuilder beansRequireSerializable() {
2315      super.beansRequireSerializable();
2316      return this;
2317   }
2318
2319   @Override /* BeanContextBuilder */
2320   public RestClientBuilder beansRequireSettersForGetters(boolean value) {
2321      super.beansRequireSettersForGetters(value);
2322      return this;
2323   }
2324
2325   @Override /* BeanContextBuilder */
2326   public RestClientBuilder beansRequireSettersForGetters() {
2327      super.beansRequireSettersForGetters();
2328      return this;
2329   }
2330
2331   @Override /* BeanContextBuilder */
2332   public RestClientBuilder beansRequireSomeProperties(boolean value) {
2333      super.beansRequireSomeProperties(value);
2334      return this;
2335   }
2336
2337   @Override /* BeanContextBuilder */
2338   public RestClientBuilder beanTypePropertyName(String value) {
2339      super.beanTypePropertyName(value);
2340      return this;
2341   }
2342
2343   @Override /* BeanContextBuilder */
2344   public RestClientBuilder debug() {
2345      super.debug();
2346      return this;
2347   }
2348
2349   @Override /* BeanContextBuilder */
2350   public <T> RestClientBuilder example(Class<T> c, T o) {
2351      super.example(c, o);
2352      return this;
2353   }
2354
2355   @Override /* BeanContextBuilder */
2356   public RestClientBuilder ignoreInvocationExceptionsOnGetters(boolean value) {
2357      super.ignoreInvocationExceptionsOnGetters(value);
2358      return this;
2359   }
2360
2361   @Override /* BeanContextBuilder */
2362   public RestClientBuilder ignoreInvocationExceptionsOnGetters() {
2363      super.ignoreInvocationExceptionsOnGetters();
2364      return this;
2365   }
2366
2367   @Override /* BeanContextBuilder */
2368   public RestClientBuilder ignoreInvocationExceptionsOnSetters(boolean value) {
2369      super.ignoreInvocationExceptionsOnSetters(value);
2370      return this;
2371   }
2372
2373   @Override /* BeanContextBuilder */
2374   public RestClientBuilder ignoreInvocationExceptionsOnSetters() {
2375      super.ignoreInvocationExceptionsOnSetters();
2376      return this;
2377   }
2378
2379   @Override /* BeanContextBuilder */
2380   public RestClientBuilder ignorePropertiesWithoutSetters(boolean value) {
2381      super.ignorePropertiesWithoutSetters(value);
2382      return this;
2383   }
2384
2385   @Override /* BeanContextBuilder */
2386   public RestClientBuilder ignoreUnknownBeanProperties(boolean value) {
2387      super.ignoreUnknownBeanProperties(value);
2388      return this;
2389   }
2390
2391   @Override /* BeanContextBuilder */
2392   public RestClientBuilder ignoreUnknownBeanProperties() {
2393      super.ignoreUnknownBeanProperties();
2394      return this;
2395   }
2396
2397   @Override /* BeanContextBuilder */
2398   public RestClientBuilder ignoreUnknownNullBeanProperties(boolean value) {
2399      super.ignoreUnknownNullBeanProperties(value);
2400      return this;
2401   }
2402
2403   @Override /* BeanContextBuilder */
2404   public <T> RestClientBuilder implClass(Class<T> interfaceClass, Class<? extends T> implClass) {
2405      super.implClass(interfaceClass, implClass);
2406      return this;
2407   }
2408
2409   @Override /* BeanContextBuilder */
2410   public RestClientBuilder implClasses(Map<String,Class<?>> values) {
2411      super.implClasses(values);
2412      return this;
2413   }
2414
2415   @Override /* BeanContextBuilder */
2416   public RestClientBuilder locale(Locale value) {
2417      super.locale(value);
2418      return this;
2419   }
2420
2421   @Override /* BeanContextBuilder */
2422   public RestClientBuilder mediaType(MediaType value) {
2423      super.mediaType(value);
2424      return this;
2425   }
2426
2427   @Override /* BeanContextBuilder */
2428   public RestClientBuilder notBeanClasses(boolean append, Object...values) {
2429      super.notBeanClasses(append, values);
2430      return this;
2431   }
2432
2433   @Override /* BeanContextBuilder */
2434   public RestClientBuilder notBeanClasses(Class<?>...values) {
2435      super.notBeanClasses(values);
2436      return this;
2437   }
2438
2439   @Override /* BeanContextBuilder */
2440   public RestClientBuilder notBeanClasses(Object...values) {
2441      super.notBeanClasses(values);
2442      return this;
2443   }
2444
2445   @Override /* BeanContextBuilder */
2446   public RestClientBuilder notBeanClassesRemove(Object...values) {
2447      super.notBeanClassesRemove(values);
2448      return this;
2449   }
2450
2451   @Override /* BeanContextBuilder */
2452   public RestClientBuilder notBeanPackages(boolean append, Object...values) {
2453      super.notBeanPackages(append, values);
2454      return this;
2455   }
2456
2457   @Override /* BeanContextBuilder */
2458   public RestClientBuilder notBeanPackages(Object...values) {
2459      super.notBeanPackages(values);
2460      return this;
2461   }
2462
2463   @Override /* BeanContextBuilder */
2464   public RestClientBuilder notBeanPackages(String...values) {
2465      super.notBeanPackages(values);
2466      return this;
2467   }
2468
2469   @Override /* BeanContextBuilder */
2470   public RestClientBuilder notBeanPackagesRemove(Object...values) {
2471      super.notBeanPackagesRemove(values);
2472      return this;
2473   }
2474
2475   @Override /* BeanContextBuilder */
2476   public RestClientBuilder pojoSwaps(boolean append, Object...values) {
2477      super.pojoSwaps(append, values);
2478      return this;
2479   }
2480
2481   @Override /* BeanContextBuilder */
2482   public RestClientBuilder pojoSwaps(Class<?>...values) {
2483      super.pojoSwaps(values);
2484      return this;
2485   }
2486
2487   @Override /* BeanContextBuilder */
2488   public RestClientBuilder pojoSwaps(Object...values) {
2489      super.pojoSwaps(values);
2490      return this;
2491   }
2492
2493   @Override /* BeanContextBuilder */
2494   public RestClientBuilder pojoSwapsRemove(Object...values) {
2495      super.pojoSwapsRemove(values);
2496      return this;
2497   }
2498
2499   @Override /* BeanContextBuilder */
2500   public RestClientBuilder sortProperties(boolean value) {
2501      super.sortProperties(value);
2502      return this;
2503   }
2504
2505   @Override /* BeanContextBuilder */
2506   public RestClientBuilder sortProperties() {
2507      super.sortProperties();
2508      return this;
2509   }
2510
2511   @Override /* BeanContextBuilder */
2512   public RestClientBuilder timeZone(TimeZone value) {
2513      super.timeZone(value);
2514      return this;
2515   }
2516
2517   @Override /* BeanContextBuilder */
2518   public RestClientBuilder useEnumNames() {
2519      super.useEnumNames();
2520      return this;
2521   }
2522
2523   @Override /* BeanContextBuilder */
2524   public RestClientBuilder useInterfaceProxies(boolean value) {
2525      super.useInterfaceProxies(value);
2526      return this;
2527   }
2528
2529   @Override /* BeanContextBuilder */
2530   public RestClientBuilder useJavaBeanIntrospector(boolean value) {
2531      super.useJavaBeanIntrospector(value);
2532      return this;
2533   }
2534
2535   @Override /* BeanContextBuilder */
2536   public RestClientBuilder useJavaBeanIntrospector() {
2537      super.useJavaBeanIntrospector();
2538      return this;
2539   }
2540
2541   @Override /* ContextBuilder */
2542   public RestClientBuilder set(String name, Object value) {
2543      super.set(name, value);
2544      return this;
2545   }
2546
2547   @Override /* ContextBuilder */
2548   public RestClientBuilder set(boolean append, String name, Object value) {
2549      super.set(append, name, value);
2550      return this;
2551   }
2552
2553   @Override /* ContextBuilder */
2554   public RestClientBuilder set(Map<String,Object> properties) {
2555      super.set(properties);
2556      return this;
2557   }
2558
2559   @Override /* ContextBuilder */
2560   public RestClientBuilder add(Map<String,Object> properties) {
2561      super.add(properties);
2562      return this;
2563   }
2564
2565   @Override /* ContextBuilder */
2566   public RestClientBuilder addTo(String name, Object value) {
2567      super.addTo(name, value);
2568      return this;
2569   }
2570
2571   @Override /* ContextBuilder */
2572   public RestClientBuilder addTo(String name, String key, Object value) {
2573      super.addTo(name, key, value);
2574      return this;
2575   }
2576
2577   @Override /* ContextBuilder */
2578   public RestClientBuilder removeFrom(String name, Object value) {
2579      super.removeFrom(name, value);
2580      return this;
2581   }
2582
2583   @Override /* ContextBuilder */
2584   public RestClientBuilder apply(PropertyStore copyFrom) {
2585      super.apply(copyFrom);
2586      return this;
2587   }
2588
2589
2590   //------------------------------------------------------------------------------------------------
2591   // Passthrough methods for HttpClientBuilder.
2592   //------------------------------------------------------------------------------------------------
2593
2594   /**
2595    * @param redirectStrategy
2596    * @return This object (for method chaining).
2597    * @see HttpClientBuilder#setRedirectStrategy(RedirectStrategy)
2598    */
2599   public RestClientBuilder redirectStrategy(RedirectStrategy redirectStrategy) {
2600      httpClientBuilder.setRedirectStrategy(redirectStrategy);
2601      return this;
2602   }
2603
2604   /**
2605    * @param cookieSpecRegistry
2606    * @return This object (for method chaining).
2607    * @see HttpClientBuilder#setDefaultCookieSpecRegistry(Lookup)
2608    */
2609   public RestClientBuilder defaultCookieSpecRegistry(Lookup<CookieSpecProvider> cookieSpecRegistry) {
2610      httpClientBuilder.setDefaultCookieSpecRegistry(cookieSpecRegistry);
2611      return this;
2612   }
2613
2614   /**
2615    * @param requestExec
2616    * @return This object (for method chaining).
2617    * @see HttpClientBuilder#setRequestExecutor(HttpRequestExecutor)
2618    */
2619   public RestClientBuilder requestExecutor(HttpRequestExecutor requestExec) {
2620      httpClientBuilder.setRequestExecutor(requestExec);
2621      return this;
2622   }
2623
2624   /**
2625    * @param hostnameVerifier
2626    * @return This object (for method chaining).
2627    * @see HttpClientBuilder#setSSLHostnameVerifier(HostnameVerifier)
2628    */
2629   public RestClientBuilder sslHostnameVerifier(HostnameVerifier hostnameVerifier) {
2630      httpClientBuilder.setSSLHostnameVerifier(hostnameVerifier);
2631      return this;
2632   }
2633
2634   /**
2635    * @param publicSuffixMatcher
2636    * @return This object (for method chaining).
2637    * @see HttpClientBuilder#setPublicSuffixMatcher(PublicSuffixMatcher)
2638    */
2639   public RestClientBuilder publicSuffixMatcher(PublicSuffixMatcher publicSuffixMatcher) {
2640      httpClientBuilder.setPublicSuffixMatcher(publicSuffixMatcher);
2641      return this;
2642   }
2643
2644   /**
2645    * @param sslContext
2646    * @return This object (for method chaining).
2647    * @see HttpClientBuilder#setSSLContext(SSLContext)
2648    */
2649   public RestClientBuilder sslContext(SSLContext sslContext) {
2650      httpClientBuilder.setSSLContext(sslContext);
2651      return this;
2652   }
2653
2654   /**
2655    * @param sslSocketFactory
2656    * @return This object (for method chaining).
2657    * @see HttpClientBuilder#setSSLSocketFactory(LayeredConnectionSocketFactory)
2658    */
2659   public RestClientBuilder sslSocketFactory(LayeredConnectionSocketFactory sslSocketFactory) {
2660      httpClientBuilder.setSSLSocketFactory(sslSocketFactory);
2661      return this;
2662   }
2663
2664   /**
2665    * @param maxConnTotal
2666    * @return This object (for method chaining).
2667    * @see HttpClientBuilder#setMaxConnTotal(int)
2668    */
2669   public RestClientBuilder maxConnTotal(int maxConnTotal) {
2670      httpClientBuilder.setMaxConnTotal(maxConnTotal);
2671      return this;
2672   }
2673
2674   /**
2675    * @param maxConnPerRoute
2676    * @return This object (for method chaining).
2677    * @see HttpClientBuilder#setMaxConnPerRoute(int)
2678    */
2679   public RestClientBuilder maxConnPerRoute(int maxConnPerRoute) {
2680      httpClientBuilder.setMaxConnPerRoute(maxConnPerRoute);
2681      return this;
2682   }
2683
2684   /**
2685    * @param config
2686    * @return This object (for method chaining).
2687    * @see HttpClientBuilder#setDefaultSocketConfig(SocketConfig)
2688    */
2689   public RestClientBuilder defaultSocketConfig(SocketConfig config) {
2690      httpClientBuilder.setDefaultSocketConfig(config);
2691      return this;
2692   }
2693
2694   /**
2695    * @param config
2696    * @return This object (for method chaining).
2697    * @see HttpClientBuilder#setDefaultConnectionConfig(ConnectionConfig)
2698    */
2699   public RestClientBuilder defaultConnectionConfig(ConnectionConfig config) {
2700      httpClientBuilder.setDefaultConnectionConfig(config);
2701      return this;
2702   }
2703
2704   /**
2705    * @param connTimeToLive
2706    * @param connTimeToLiveTimeUnit
2707    * @return This object (for method chaining).
2708    * @see HttpClientBuilder#setConnectionTimeToLive(long,TimeUnit)
2709    */
2710   public RestClientBuilder connectionTimeToLive(long connTimeToLive, TimeUnit connTimeToLiveTimeUnit) {
2711      httpClientBuilder.setConnectionTimeToLive(connTimeToLive, connTimeToLiveTimeUnit);
2712      return this;
2713   }
2714
2715   /**
2716    * @param connManager
2717    * @return This object (for method chaining).
2718    * @see HttpClientBuilder#setConnectionManager(HttpClientConnectionManager)
2719    */
2720   public RestClientBuilder connectionManager(HttpClientConnectionManager connManager) {
2721      this.httpClientConnectionManager = connManager;
2722      httpClientBuilder.setConnectionManager(connManager);
2723      return this;
2724   }
2725
2726   /**
2727    * @param shared
2728    * @return This object (for method chaining).
2729    * @see HttpClientBuilder#setConnectionManagerShared(boolean)
2730    */
2731   public RestClientBuilder connectionManagerShared(boolean shared) {
2732      httpClientBuilder.setConnectionManagerShared(shared);
2733      return this;
2734   }
2735
2736   /**
2737    * @param reuseStrategy
2738    * @return This object (for method chaining).
2739    * @see HttpClientBuilder#setConnectionReuseStrategy(ConnectionReuseStrategy)
2740    */
2741   public RestClientBuilder connectionReuseStrategy(ConnectionReuseStrategy reuseStrategy) {
2742      httpClientBuilder.setConnectionReuseStrategy(reuseStrategy);
2743      return this;
2744   }
2745
2746   /**
2747    * @param keepAliveStrategy
2748    * @return This object (for method chaining).
2749    * @see HttpClientBuilder#setKeepAliveStrategy(ConnectionKeepAliveStrategy)
2750    */
2751   public RestClientBuilder keepAliveStrategy(ConnectionKeepAliveStrategy keepAliveStrategy) {
2752      httpClientBuilder.setKeepAliveStrategy(keepAliveStrategy);
2753      return this;
2754   }
2755
2756   /**
2757    * @param targetAuthStrategy
2758    * @return This object (for method chaining).
2759    * @see HttpClientBuilder#setTargetAuthenticationStrategy(AuthenticationStrategy)
2760    */
2761   public RestClientBuilder targetAuthenticationStrategy(AuthenticationStrategy targetAuthStrategy) {
2762      httpClientBuilder.setTargetAuthenticationStrategy(targetAuthStrategy);
2763      return this;
2764   }
2765
2766   /**
2767    * @param proxyAuthStrategy
2768    * @return This object (for method chaining).
2769    * @see HttpClientBuilder#setProxyAuthenticationStrategy(AuthenticationStrategy)
2770    */
2771   public RestClientBuilder proxyAuthenticationStrategy(AuthenticationStrategy proxyAuthStrategy) {
2772      httpClientBuilder.setProxyAuthenticationStrategy(proxyAuthStrategy);
2773      return this;
2774   }
2775
2776   /**
2777    * @param userTokenHandler
2778    * @return This object (for method chaining).
2779    * @see HttpClientBuilder#setUserTokenHandler(UserTokenHandler)
2780    */
2781   public RestClientBuilder userTokenHandler(UserTokenHandler userTokenHandler) {
2782      httpClientBuilder.setUserTokenHandler(userTokenHandler);
2783      return this;
2784   }
2785
2786   /**
2787    * @return This object (for method chaining).
2788    * @see HttpClientBuilder#disableConnectionState()
2789    */
2790   public RestClientBuilder disableConnectionState() {
2791      httpClientBuilder.disableConnectionState();
2792      return this;
2793   }
2794
2795   /**
2796    * @param schemePortResolver
2797    * @return This object (for method chaining).
2798    * @see HttpClientBuilder#setSchemePortResolver(SchemePortResolver)
2799    */
2800   public RestClientBuilder schemePortResolver(SchemePortResolver schemePortResolver) {
2801      httpClientBuilder.setSchemePortResolver(schemePortResolver);
2802      return this;
2803   }
2804
2805   /**
2806    * @param userAgent
2807    * @return This object (for method chaining).
2808    * @see HttpClientBuilder#setUserAgent(String)
2809    */
2810   public RestClientBuilder userAgent(String userAgent) {
2811      httpClientBuilder.setUserAgent(userAgent);
2812      return this;
2813   }
2814
2815   /**
2816    * @param defaultHeaders
2817    * @return This object (for method chaining).
2818    * @see HttpClientBuilder#setDefaultHeaders(Collection)
2819    */
2820   public RestClientBuilder defaultHeaders(Collection<? extends Header> defaultHeaders) {
2821      httpClientBuilder.setDefaultHeaders(defaultHeaders);
2822      return this;
2823   }
2824
2825   /**
2826    * @param itcp
2827    * @return This object (for method chaining).
2828    * @see HttpClientBuilder#addInterceptorFirst(HttpResponseInterceptor)
2829    */
2830   public RestClientBuilder addInterceptorFirst(HttpResponseInterceptor itcp) {
2831      httpClientBuilder.addInterceptorFirst(itcp);
2832      return this;
2833   }
2834
2835   /**
2836    * @param itcp
2837    * @return This object (for method chaining).
2838    * @see HttpClientBuilder#addInterceptorLast(HttpResponseInterceptor)
2839    */
2840   public RestClientBuilder addInterceptorLast(HttpResponseInterceptor itcp) {
2841      httpClientBuilder.addInterceptorLast(itcp);
2842      return this;
2843   }
2844
2845   /**
2846    * @param itcp
2847    * @return This object (for method chaining).
2848    * @see HttpClientBuilder#addInterceptorFirst(HttpRequestInterceptor)
2849    */
2850   public RestClientBuilder addInterceptorFirst(HttpRequestInterceptor itcp) {
2851      httpClientBuilder.addInterceptorFirst(itcp);
2852      return this;
2853   }
2854
2855   /**
2856    * @param itcp
2857    * @return This object (for method chaining).
2858    * @see HttpClientBuilder#addInterceptorLast(HttpRequestInterceptor)
2859    */
2860   public RestClientBuilder addInterceptorLast(HttpRequestInterceptor itcp) {
2861      httpClientBuilder.addInterceptorLast(itcp);
2862      return this;
2863   }
2864
2865   /**
2866    * @return This object (for method chaining).
2867    * @see HttpClientBuilder#disableCookieManagement()
2868    */
2869   public RestClientBuilder disableCookieManagement() {
2870      httpClientBuilder.disableCookieManagement();
2871      return this;
2872   }
2873
2874   /**
2875    * @return This object (for method chaining).
2876    * @see HttpClientBuilder#disableContentCompression()
2877    */
2878   public RestClientBuilder disableContentCompression() {
2879      httpClientBuilder.disableContentCompression();
2880      return this;
2881   }
2882
2883   /**
2884    * @return This object (for method chaining).
2885    * @see HttpClientBuilder#disableAuthCaching()
2886    */
2887   public RestClientBuilder disableAuthCaching() {
2888      httpClientBuilder.disableAuthCaching();
2889      return this;
2890   }
2891
2892   /**
2893    * @param httpprocessor
2894    * @return This object (for method chaining).
2895    * @see HttpClientBuilder#setHttpProcessor(HttpProcessor)
2896    */
2897   public RestClientBuilder httpProcessor(HttpProcessor httpprocessor) {
2898      httpClientBuilder.setHttpProcessor(httpprocessor);
2899      return this;
2900   }
2901
2902   /**
2903    * @param retryHandler
2904    * @return This object (for method chaining).
2905    * @see HttpClientBuilder#setRetryHandler(HttpRequestRetryHandler)
2906    */
2907   public RestClientBuilder retryHandler(HttpRequestRetryHandler retryHandler) {
2908      httpClientBuilder.setRetryHandler(retryHandler);
2909      return this;
2910   }
2911
2912   /**
2913    * @return This object (for method chaining).
2914    * @see HttpClientBuilder#disableAutomaticRetries()
2915    */
2916   public RestClientBuilder disableAutomaticRetries() {
2917      httpClientBuilder.disableAutomaticRetries();
2918      return this;
2919   }
2920
2921   /**
2922    * @param proxy
2923    * @return This object (for method chaining).
2924    * @see HttpClientBuilder#setProxy(HttpHost)
2925    */
2926   public RestClientBuilder proxy(HttpHost proxy) {
2927      httpClientBuilder.setProxy(proxy);
2928      return this;
2929   }
2930
2931   /**
2932    * @param routePlanner
2933    * @return This object (for method chaining).
2934    * @see HttpClientBuilder#setRoutePlanner(HttpRoutePlanner)
2935    */
2936   public RestClientBuilder routePlanner(HttpRoutePlanner routePlanner) {
2937      httpClientBuilder.setRoutePlanner(routePlanner);
2938      return this;
2939   }
2940
2941   /**
2942    * @return This object (for method chaining).
2943    * @see HttpClientBuilder#disableRedirectHandling()
2944    */
2945   public RestClientBuilder disableRedirectHandling() {
2946      httpClientBuilder.disableRedirectHandling();
2947      return this;
2948   }
2949
2950   /**
2951    * @param connectionBackoffStrategy
2952    * @return This object (for method chaining).
2953    * @see HttpClientBuilder#setConnectionBackoffStrategy(ConnectionBackoffStrategy)
2954    */
2955   public RestClientBuilder connectionBackoffStrategy(ConnectionBackoffStrategy connectionBackoffStrategy) {
2956      httpClientBuilder.setConnectionBackoffStrategy(connectionBackoffStrategy);
2957      return this;
2958   }
2959
2960   /**
2961    * @param backoffManager
2962    * @return This object (for method chaining).
2963    * @see HttpClientBuilder#setBackoffManager(BackoffManager)
2964    */
2965   public RestClientBuilder backoffManager(BackoffManager backoffManager) {
2966      httpClientBuilder.setBackoffManager(backoffManager);
2967      return this;
2968   }
2969
2970   /**
2971    * @param serviceUnavailStrategy
2972    * @return This object (for method chaining).
2973    * @see HttpClientBuilder#setServiceUnavailableRetryStrategy(ServiceUnavailableRetryStrategy)
2974    */
2975   public RestClientBuilder serviceUnavailableRetryStrategy(ServiceUnavailableRetryStrategy serviceUnavailStrategy) {
2976      httpClientBuilder.setServiceUnavailableRetryStrategy(serviceUnavailStrategy);
2977      return this;
2978   }
2979
2980   /**
2981    * @param cookieStore
2982    * @return This object (for method chaining).
2983    * @see HttpClientBuilder#setDefaultCookieStore(CookieStore)
2984    */
2985   public RestClientBuilder defaultCookieStore(CookieStore cookieStore) {
2986      httpClientBuilder.setDefaultCookieStore(cookieStore);
2987      return this;
2988   }
2989
2990   /**
2991    * @param credentialsProvider
2992    * @return This object (for method chaining).
2993    * @see HttpClientBuilder#setDefaultCredentialsProvider(CredentialsProvider)
2994    */
2995   public RestClientBuilder defaultCredentialsProvider(CredentialsProvider credentialsProvider) {
2996      httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
2997      return this;
2998   }
2999
3000   /**
3001    * @param authSchemeRegistry
3002    * @return This object (for method chaining).
3003    * @see HttpClientBuilder#setDefaultAuthSchemeRegistry(Lookup)
3004    */
3005   public RestClientBuilder defaultAuthSchemeRegistry(Lookup<AuthSchemeProvider> authSchemeRegistry) {
3006      httpClientBuilder.setDefaultAuthSchemeRegistry(authSchemeRegistry);
3007      return this;
3008   }
3009
3010   /**
3011    * @param contentDecoderMap
3012    * @return This object (for method chaining).
3013    * @see HttpClientBuilder#setContentDecoderRegistry(Map)
3014    */
3015   public RestClientBuilder contentDecoderRegistry(Map<String,InputStreamFactory> contentDecoderMap) {
3016      httpClientBuilder.setContentDecoderRegistry(contentDecoderMap);
3017      return this;
3018   }
3019
3020   /**
3021    * @param config
3022    * @return This object (for method chaining).
3023    * @see HttpClientBuilder#setDefaultRequestConfig(RequestConfig)
3024    */
3025   public RestClientBuilder defaultRequestConfig(RequestConfig config) {
3026      httpClientBuilder.setDefaultRequestConfig(config);
3027      return this;
3028   }
3029
3030   /**
3031    * @return This object (for method chaining).
3032    * @see HttpClientBuilder#useSystemProperties()
3033    */
3034   public RestClientBuilder useSystemProperties() {
3035      httpClientBuilder.useSystemProperties();
3036      return this;
3037   }
3038
3039   /**
3040    * @return This object (for method chaining).
3041    * @see HttpClientBuilder#evictExpiredConnections()
3042    */
3043   public RestClientBuilder evictExpiredConnections() {
3044      httpClientBuilder.evictExpiredConnections();
3045      return this;
3046   }
3047
3048   /**
3049    * @param maxIdleTime
3050    * @param maxIdleTimeUnit
3051    * @return This object (for method chaining).
3052    * @see HttpClientBuilder#evictIdleConnections(long,TimeUnit)
3053    */
3054   public RestClientBuilder evictIdleConnections(long maxIdleTime, TimeUnit maxIdleTimeUnit) {
3055      httpClientBuilder.evictIdleConnections(maxIdleTime, maxIdleTimeUnit);
3056      return this;
3057   }
3058
3059   private static String[] getDefaultProtocols() {
3060      String sp = System.getProperty("transport.client.protocol");
3061      if (isEmpty(sp))
3062         return new String[] {"SSL_TLS","TLS","SSL"};
3063      return StringUtils.split(sp, ',');
3064   }
3065
3066   /**
3067    * @deprecated Use {@link #addRootType(boolean)}
3068    */
3069   @SuppressWarnings("javadoc")
3070   @Deprecated
3071   public RestClientBuilder abridged(boolean value) {
3072      return set(SERIALIZER_abridged, value);
3073   }
3074
3075   /**
3076    * @deprecated Use {@link #addRootType()}
3077    */
3078   @SuppressWarnings("javadoc")
3079   @Deprecated
3080   public RestClientBuilder abridged() {
3081      return set(SERIALIZER_abridged, true);
3082   }
3083
3084   /**
3085    * @deprecated Use {@link #addBeanTypes(boolean)}
3086    */
3087   @SuppressWarnings("javadoc")
3088   @Deprecated
3089   public RestClientBuilder addBeanTypeProperties(boolean value) {
3090      return set(SERIALIZER_addBeanTypeProperties, value);
3091   }
3092
3093   /**
3094    * @deprecated Use {@link #maxIndent(int)}
3095    */
3096   @SuppressWarnings("javadoc")
3097   @Deprecated
3098   public RestClientBuilder maxIndent(boolean value) {
3099      return set(SERIALIZER_maxIndent, value);
3100   }
3101
3102   /**
3103    * @deprecated Use {@link #redirectStrategy(RedirectStrategy)}
3104    */
3105   @SuppressWarnings("javadoc")
3106   @Deprecated
3107   public RestClientBuilder setRedirectStrategy(RedirectStrategy redirectStrategy) {
3108      return redirectStrategy(redirectStrategy);
3109   }
3110
3111   /**
3112    * @deprecated Use {@link #defaultCookieSpecRegistry(Lookup)}
3113    */
3114   @SuppressWarnings("javadoc")
3115   @Deprecated
3116   public RestClientBuilder setDefaultCookieSpecRegistry(Lookup<CookieSpecProvider> cookieSpecRegistry) {
3117      return defaultCookieSpecRegistry(cookieSpecRegistry);
3118   }
3119
3120   /**
3121    * @deprecated Use {@link #requestExecutor(HttpRequestExecutor)}
3122    */
3123   @SuppressWarnings("javadoc")
3124   @Deprecated
3125   public RestClientBuilder setRequestExecutor(HttpRequestExecutor requestExec) {
3126      return requestExecutor(requestExec);
3127   }
3128
3129   /**
3130    * @deprecated Use {@link #sslHostnameVerifier(HostnameVerifier)}
3131    */
3132   @SuppressWarnings("javadoc")
3133   @Deprecated
3134   public RestClientBuilder setSSLHostnameVerifier(HostnameVerifier hostnameVerifier) {
3135      return sslHostnameVerifier(hostnameVerifier);
3136   }
3137
3138   /**
3139    * @deprecated Use {@link #publicSuffixMatcher(PublicSuffixMatcher)}
3140    */
3141   @SuppressWarnings("javadoc")
3142   @Deprecated
3143   public RestClientBuilder setPublicSuffixMatcher(PublicSuffixMatcher publicSuffixMatcher) {
3144      return publicSuffixMatcher(publicSuffixMatcher);
3145   }
3146
3147   /**
3148    * @deprecated Use {@link #sslContext(SSLContext)}
3149    */
3150   @SuppressWarnings("javadoc")
3151   @Deprecated
3152   public RestClientBuilder setSSLContext(SSLContext sslContext) {
3153      return sslContext(sslContext);
3154   }
3155
3156   /**
3157    * @deprecated Use {@link #sslSocketFactory(LayeredConnectionSocketFactory)}
3158    */
3159   @SuppressWarnings("javadoc")
3160   @Deprecated
3161   public RestClientBuilder setSSLSocketFactory(LayeredConnectionSocketFactory sslSocketFactory) {
3162      return sslSocketFactory(sslSocketFactory);
3163   }
3164
3165   /**
3166    * @deprecated Use {@link #maxConnTotal(int)}
3167    */
3168   @SuppressWarnings("javadoc")
3169   @Deprecated
3170   public RestClientBuilder setMaxConnTotal(int maxConnTotal) {
3171      return maxConnTotal(maxConnTotal);
3172   }
3173
3174   /**
3175    * @deprecated Use {@link #maxConnPerRoute(int)}
3176    */
3177   @SuppressWarnings("javadoc")
3178   @Deprecated
3179   public RestClientBuilder setMaxConnPerRoute(int maxConnPerRoute) {
3180      return maxConnPerRoute(maxConnPerRoute);
3181   }
3182
3183   /**
3184    * @deprecated Use {@link #defaultSocketConfig(SocketConfig)}
3185    */
3186   @SuppressWarnings("javadoc")
3187   @Deprecated
3188   public RestClientBuilder setDefaultSocketConfig(SocketConfig config) {
3189      return defaultSocketConfig(config);
3190   }
3191
3192   /**
3193    * @deprecated Use {@link #defaultConnectionConfig(ConnectionConfig)}
3194    */
3195   @SuppressWarnings("javadoc")
3196   @Deprecated
3197   public RestClientBuilder setDefaultConnectionConfig(ConnectionConfig config) {
3198      return defaultConnectionConfig(config);
3199   }
3200
3201   /**
3202    * @deprecated Use {@link #connectionTimeToLive(long,TimeUnit)}
3203    */
3204   @SuppressWarnings("javadoc")
3205   @Deprecated
3206   public RestClientBuilder setConnectionTimeToLive(long connTimeToLive, TimeUnit connTimeToLiveTimeUnit) {
3207      return connectionTimeToLive(connTimeToLive, connTimeToLiveTimeUnit);
3208   }
3209
3210   /**
3211    * @deprecated Use {@link #connectionManager(HttpClientConnectionManager)}
3212    */
3213   @SuppressWarnings("javadoc")
3214   @Deprecated
3215   public RestClientBuilder setConnectionManager(HttpClientConnectionManager connManager) {
3216      return connectionManager(connManager);
3217   }
3218
3219   /**
3220    * @deprecated Use {@link #connectionManagerShared(boolean)}
3221    */
3222   @SuppressWarnings("javadoc")
3223   @Deprecated
3224   public RestClientBuilder setConnectionManagerShared(boolean shared) {
3225      return connectionManagerShared(shared);
3226   }
3227
3228   /**
3229    * @deprecated Use {@link #connectionReuseStrategy(ConnectionReuseStrategy)}
3230    */
3231   @SuppressWarnings("javadoc")
3232   @Deprecated
3233   public RestClientBuilder setConnectionReuseStrategy(ConnectionReuseStrategy reuseStrategy) {
3234      return connectionReuseStrategy(reuseStrategy);
3235   }
3236
3237   /**
3238    * @deprecated Use {@link #keepAliveStrategy(ConnectionKeepAliveStrategy)}
3239    */
3240   @SuppressWarnings("javadoc")
3241   @Deprecated
3242   public RestClientBuilder setKeepAliveStrategy(ConnectionKeepAliveStrategy keepAliveStrategy) {
3243      return keepAliveStrategy(keepAliveStrategy);
3244   }
3245
3246   /**
3247    * @deprecated Use {@link #targetAuthenticationStrategy(AuthenticationStrategy)}
3248    */
3249   @SuppressWarnings("javadoc")
3250   @Deprecated
3251   public RestClientBuilder setTargetAuthenticationStrategy(AuthenticationStrategy targetAuthStrategy) {
3252      return targetAuthenticationStrategy(targetAuthStrategy);
3253   }
3254
3255   /**
3256    * @deprecated Use {@link #proxyAuthenticationStrategy(AuthenticationStrategy)}
3257    */
3258   @SuppressWarnings("javadoc")
3259   @Deprecated
3260   public RestClientBuilder setProxyAuthenticationStrategy(AuthenticationStrategy proxyAuthStrategy) {
3261      return proxyAuthenticationStrategy(proxyAuthStrategy);
3262   }
3263
3264   /**
3265    * @deprecated Use {@link #userTokenHandler(UserTokenHandler)}
3266    */
3267   @SuppressWarnings("javadoc")
3268   @Deprecated
3269   public RestClientBuilder setUserTokenHandler(UserTokenHandler userTokenHandler) {
3270      return userTokenHandler(userTokenHandler);
3271   }
3272
3273   /**
3274    * @deprecated Use {@link #schemePortResolver(SchemePortResolver)}
3275    */
3276   @SuppressWarnings("javadoc")
3277   @Deprecated
3278   public RestClientBuilder setSchemePortResolver(SchemePortResolver schemePortResolver) {
3279      return schemePortResolver(schemePortResolver);
3280   }
3281
3282   /**
3283    * @deprecated Use {@link #defaultHeaders(Collection)}
3284    */
3285   @SuppressWarnings("javadoc")
3286   @Deprecated
3287   public RestClientBuilder setDefaultHeaders(Collection<? extends Header> defaultHeaders) {
3288      return defaultHeaders(defaultHeaders);
3289   }
3290
3291   /**
3292    * @deprecated Use {@link #userAgent(String)}
3293    */
3294   @SuppressWarnings("javadoc")
3295   @Deprecated
3296   public RestClientBuilder setUserAgent(String userAgent) {
3297      return userAgent(userAgent);
3298   }
3299
3300   /**
3301    * @deprecated Use {@link #httpProcessor(HttpProcessor)}
3302    */
3303   @SuppressWarnings("javadoc")
3304   @Deprecated
3305   public RestClientBuilder setHttpProcessor(HttpProcessor httpprocessor) {
3306      return httpProcessor(httpprocessor);
3307   }
3308
3309   /**
3310    * @deprecated Use {@link #retryHandler(HttpRequestRetryHandler)}
3311    */
3312   @SuppressWarnings("javadoc")
3313   @Deprecated
3314   public RestClientBuilder setRetryHandler(HttpRequestRetryHandler retryHandler) {
3315      return retryHandler(retryHandler);
3316   }
3317
3318   /**
3319    * @deprecated Use {@link #proxy(HttpHost)}
3320    */
3321   @SuppressWarnings("javadoc")
3322   @Deprecated
3323   public RestClientBuilder setProxy(HttpHost proxy) {
3324      return proxy(proxy);
3325   }
3326
3327   /**
3328    * @deprecated Use {@link #routePlanner(HttpRoutePlanner)}
3329    */
3330   @SuppressWarnings("javadoc")
3331   @Deprecated
3332   public RestClientBuilder setRoutePlanner(HttpRoutePlanner routePlanner) {
3333      return routePlanner(routePlanner);
3334   }
3335
3336   /**
3337    * @deprecated Use {@link #connectionBackoffStrategy(ConnectionBackoffStrategy)}
3338    */
3339   @SuppressWarnings("javadoc")
3340   @Deprecated
3341   public RestClientBuilder setConnectionBackoffStrategy(ConnectionBackoffStrategy connectionBackoffStrategy) {
3342      return connectionBackoffStrategy(connectionBackoffStrategy);
3343   }
3344
3345   /**
3346    * @deprecated Use {@link #backoffManager(BackoffManager)}
3347    */
3348   @SuppressWarnings("javadoc")
3349   @Deprecated
3350   public RestClientBuilder setBackoffManager(BackoffManager backoffManager) {
3351      return backoffManager(backoffManager);
3352   }
3353
3354   /**
3355    * @deprecated Use {@link #serviceUnavailableRetryStrategy(ServiceUnavailableRetryStrategy)}
3356    */
3357   @SuppressWarnings("javadoc")
3358   @Deprecated
3359   public RestClientBuilder setServiceUnavailableRetryStrategy(ServiceUnavailableRetryStrategy serviceUnavailStrategy) {
3360      return serviceUnavailableRetryStrategy(serviceUnavailStrategy);
3361   }
3362
3363   /**
3364    * @deprecated Use {@link #defaultCookieStore(CookieStore)}
3365    */
3366   @SuppressWarnings("javadoc")
3367   @Deprecated
3368   public RestClientBuilder setDefaultCookieStore(CookieStore cookieStore) {
3369      return defaultCookieStore(cookieStore);
3370   }
3371
3372   /**
3373    * @deprecated Use {@link #defaultCredentialsProvider(CredentialsProvider)}
3374    */
3375   @SuppressWarnings("javadoc")
3376   @Deprecated
3377   public RestClientBuilder setDefaultCredentialsProvider(CredentialsProvider credentialsProvider) {
3378      return defaultCredentialsProvider(credentialsProvider);
3379   }
3380
3381   /**
3382    * @deprecated Use {@link #defaultAuthSchemeRegistry(Lookup)}
3383    */
3384   @SuppressWarnings("javadoc")
3385   @Deprecated
3386   public RestClientBuilder setDefaultAuthSchemeRegistry(Lookup<AuthSchemeProvider> authSchemeRegistry) {
3387      return defaultAuthSchemeRegistry(authSchemeRegistry);
3388   }
3389
3390   /**
3391    * @deprecated Use {@link #contentDecoderRegistry(Map)}
3392    */
3393   @SuppressWarnings("javadoc")
3394   @Deprecated
3395   public RestClientBuilder setContentDecoderRegistry(Map<String,InputStreamFactory> contentDecoderMap) {
3396      return contentDecoderRegistry(contentDecoderMap);
3397   }
3398
3399   /**
3400    * @deprecated Use {@link #defaultRequestConfig(RequestConfig)}
3401    */
3402   @SuppressWarnings("javadoc")
3403   @Deprecated
3404   public RestClientBuilder setDefaultRequestConfig(RequestConfig config) {
3405      return defaultRequestConfig(config);
3406   }
3407
3408   /**
3409    * @deprecated Use {@link #sslSocketFactory(LayeredConnectionSocketFactory)} and others.
3410    */
3411   @SuppressWarnings({ "javadoc", "unused" })
3412   @Deprecated
3413   public RestClientBuilder enableSSL(SSLOpts opts) throws KeyStoreException, NoSuchAlgorithmException {
3414      return this;
3415   }
3416}