This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new d87c477  Context API refactoring.
d87c477 is described below

commit d87c47783a400a0f3aeb3dd3980b399f68e123db
Author: JamesBognar <[email protected]>
AuthorDate: Thu Sep 23 16:14:28 2021 -0400

    Context API refactoring.
---
 .../org/apache/juneau/rest/client/RestClient.java  |   8 +-
 .../juneau/rest/client/RestClientBuilder.java      | 356 ++++++++++-----------
 .../juneau/rest/mock/MockRestClientBuilder.java    |  18 --
 .../rest/client/RestClient_FormData_Test.java      |  12 +-
 4 files changed, 172 insertions(+), 222 deletions(-)

diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
index 882dd89..f54e499 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
@@ -425,12 +425,11 @@ import org.apache.juneau.utils.*;
  * <ul class='javatree'>
  *     <li class='jc'>{@link RestClientBuilder}
  *     <ul>
- *             <li class='jm'>{@link RestClientBuilder#getFormData() 
getFormData()}
+ *             <li class='jm'>{@link RestClientBuilder#formData() formData()}
  *             <li class='jm'>{@link RestClientBuilder#formData(String,String) 
formData(String,String)}
  *             <li class='jm'>{@link 
RestClientBuilder#formData(String,Supplier) formData(String,Supplier&lt;?&gt;)}
  *             <li class='jm'>{@link 
RestClientBuilder#formData(NameValuePair...) formDatas(NameValuePair...)}
- *             <li class='jm'>{@link 
RestClientBuilder#formDataPairs(String...) formDataPairs(String...)}
- *             <li class='jm'>{@link 
RestClientBuilder#defaultFormData(NameValuePair...) 
defaultFormData(NameValuePair...)}
+ *             <li class='jm'>{@link 
RestClientBuilder#formDataDefault(NameValuePair...) 
defaultFormData(NameValuePair...)}
  *     </ul>
  *     <li class='jc'>{@link RestRequest}
  *     <ul>
@@ -1738,7 +1737,6 @@ public class RestClient extends BeanContextable 
implements HttpClient, Closeable
         */
        public static final String RESTCLIENT_skipEmptyQueryData = PREFIX + 
"skipEmptyQueryData.b";
 
-       static final String RESTCLIENT_INTERNAL_formDataBuilder = PREFIX + 
"formDataBuilder.o";
        static final String RESTCLIENT_INTERNAL_pathDataBuilder = PREFIX + 
"pathDataBuilder.o";
 
        final HeaderList.Builder headerData;
@@ -1810,9 +1808,9 @@ public class RestClient extends BeanContextable 
implements HttpClient, Closeable
                httpClient = builder.getHttpClient();
                headerData = builder.headerData().build().copy();
                queryData = builder.queryData().build().copy();
+               formData = builder.formData().build().copy();
 
                ContextProperties cp = 
getContextProperties().copy().apply(getBeanContext().getContextProperties()).build();
-               this.formData = 
cp.getInstance(RESTCLIENT_INTERNAL_formDataBuilder, 
PartList.Builder.class).orElseGet(PartList.Builder::new).copy();
                this.pathData = 
cp.getInstance(RESTCLIENT_INTERNAL_pathDataBuilder, 
PartList.Builder.class).orElseGet(PartList.Builder::new).copy();
                this.skipEmptyHeaders = 
cp.getBoolean(RESTCLIENT_skipEmptyHeaders).orElse(false);
                this.skipEmptyQueryData = 
cp.getBoolean(RESTCLIENT_skipEmptyQueryData).orElse(false);
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
index 529ac44..f7bc966 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
@@ -109,7 +109,6 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         */
        protected RestClientBuilder() {
                super();
-               this.formData = PartList.create();
                this.pathData = PartList.create();
                this.serializerGroupBuilder = 
SerializerGroup.create().beanContextBuilder(getBeanContextBuilder());
                this.parserGroupBuilder = 
ParserGroup.create().beanContextBuilder(getBeanContextBuilder());
@@ -161,7 +160,6 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
        }
 
        private ContextProperties contextProperties() {
-               set(RESTCLIENT_INTERNAL_formDataBuilder, formData);
                set(RESTCLIENT_INTERNAL_pathDataBuilder, pathData);
                return getContextProperties();
        }
@@ -175,19 +173,6 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         *
         * @return The form data parameter list builder.
         */
-       public PartList.Builder getFormData() {
-               return formData;
-       }
-
-       /**
-        * Returns the builder for the form data parameter list.
-        *
-        * <p>
-        * Allows you to perform operations on the form data parameters that 
aren't otherwise exposed on this API, such
-        * as Prepend/Replace/Default operations.
-        *
-        * @return The form data parameter list builder.
-        */
        public PartList.Builder getPathData() {
                return pathData;
        }
@@ -1448,8 +1433,8 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         * <p>
         * The following convenience methods are also provided for updating the 
parameters:
         * <ul>
-        *      <li class='jm'>{@link #queryData(Header...)}
-        *      <li class='jm'>{@link #queryDataDefault(Header...)}
+        *      <li class='jm'>{@link #queryData(NameValuePair...)}
+        *      <li class='jm'>{@link #queryDataDefault(NameValuePair...)}
         *      <li class='jm'>{@link #queryData(String,String)}
         *      <li class='jm'>{@link #queryData(String,Supplier)}
         * </ul>
@@ -1465,7 +1450,7 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         *              .build();
         * </p>
         *
-        * @return The header list builder.
+        * @return The query data list builder.
         */
        public final PartList.Builder queryData() {
                if (queryData == null)
@@ -1595,6 +1580,171 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
        }
 
        
//------------------------------------------------------------------------------------------------------------------
+       // formData
+       
//------------------------------------------------------------------------------------------------------------------
+
+       /**
+        * Returns the builder for the list of form data parameters that get 
applied to all requests created by this builder.
+        *
+        * <p>
+        * This is the primary method for accessing the form data parameter 
list.
+        * On first call, the builder is created via the method {@link 
#createFormData()}.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      <jc>// Create a client that adds a "foo=bar" form-data 
parameter on every request.</jc>
+        *      RestClientBuilder <jv>builder</jv> = 
RestClient.<jsm>create</jsm>();
+        *      <jv>builder</jv>.formData().setDefault(<js>"foo"</js>, 
<js>"bar"</js>));
+        *      RestClient <jv>client</jv> = <jv>builder</jv>.build();
+        * </p>
+        *
+        * <p>
+        * The following convenience methods are also provided for updating the 
parameters:
+        * <ul>
+        *      <li class='jm'>{@link #formData(NameValuePair...)}
+        *      <li class='jm'>{@link #formDataDefault(NameValuePair...)}
+        *      <li class='jm'>{@link #formData(String,String)}
+        *      <li class='jm'>{@link #formData(String,Supplier)}
+        * </ul>
+        *
+        * <p>
+        * Note that the {@link #apply(Consumer)} method can be used to call 
this method without breaking fluent call chains.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .apply(<jv>x</jv> -&gt; 
<jv>x</jv>.formData().setDefault(<js>"foo"</js>, <js>"bar"</js>))
+        *              .build();
+        * </p>
+        *
+        * @return The form data list builder.
+        */
+       public final PartList.Builder formData() {
+               if (formData == null)
+                       formData = createFormData();
+               return formData;
+       }
+
+       /**
+        * Creates the builder for the form data list.
+        *
+        * <p>
+        * Subclasses can override this method to provide their own 
implementation.
+        *
+        * <p>
+        * The default behavior creates an empty builder.
+        *
+        * @return The query data list builder.
+        * @see #queryData()
+        */
+       protected PartList.Builder createFormData() {
+               return PartList.create();
+       }
+
+       /**
+        * Appends multiple form-data parameters to the request bodies of all 
URL-encoded form posts.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      <jk>import static</jk> org.apache.juneau.http.HttpParts.*;
+        *
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .formData(
+        *                      <jsm>stringPart</jsm>(<js>"foo"</js>, 
<js>"bar"</js>),
+        *                      <jsm>booleanPart</jsm>(<js>"baz"</js>, 
<jk>true</jk>)
+        *              )
+        *              .build();
+        * </p>
+        *
+        * <p>
+        * This is a shortcut for calling 
<c>formData().append(<jv>parts</jv>)</c>.
+        *
+        * @param parts
+        *      The form-data parameters.
+        * @return This object (for method chaining).
+        */
+       @FluentSetter
+       public RestClientBuilder formData(NameValuePair...parts) {
+               formData().append(parts);
+               return this;
+       }
+
+       /**
+        * Sets default form-data parameter values.
+        *
+        * <p>
+        * Uses default values for specified parameters if not otherwise 
specified on the outgoing requests.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .defaultFormData(<jsm>stringPart</jsm>(<js>"foo"</js>, 
()-&gt;<js>"bar"</js>));
+        *              .build();
+        * </p>
+        *
+        * <p>
+        * This is a shortcut for calling 
<c>formData().setDefault(<jv>parts</jv>)</c>.
+        *
+        * @param parts The parts.
+        * @return This object (for method chaining).
+        */
+       public RestClientBuilder formDataDefault(NameValuePair...parts) {
+               formData().setDefault(parts);
+               return this;
+       }
+
+       /**
+        * Appends a form-data parameter to all request bodies.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .formData(<js>"foo"</js>, <js>"bar"</js>)
+        *              .build();
+        * </p>
+        *
+        * <p>
+        * This is a shortcut for calling 
<c>formData().append(<jv>name</jv>,<jv>value</jv>)</c>.
+        *
+        * @param name The parameter name.
+        * @param value The parameter value.
+        * @return This object (for method chaining).
+        */
+       @FluentSetter
+       public RestClientBuilder formData(String name, String value) {
+               formData().append(name, value);
+               return this;
+       }
+
+       /**
+        * Appends a form-data parameter with a dynamic value to all request 
bodies.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .formData(<js>"foo"</js>, ()-&gt;<js>"bar"</js>)
+        *              .build();
+        * </p>
+        *
+        * <p>
+        * This is a shortcut for calling 
<c>formData().append(<jv>name</jv>,<jv>value</jv>)</c>.
+        *
+        * @param name The parameter name.
+        * @param value The parameter value supplier.
+        * @return This object (for method chaining).
+        */
+       @FluentSetter
+       public RestClientBuilder formData(String name, Supplier<String> value) {
+               formData().append(name, value);
+               return this;
+       }
+
+       
//------------------------------------------------------------------------------------------------------------------
        // Logging.
        
//------------------------------------------------------------------------------------------------------------------
 
@@ -1809,34 +1959,6 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
        // HTTP parts
        
//-----------------------------------------------------------------------------------------------------------------
 
-
-       /**
-        * Appends a form-data parameter to the request bodies of all form 
posts.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      <jk>import static</jk> org.apache.juneau.http.HttpParts.*;
-        *
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .formData(<jsm>stringPart</jsm>(<js>"foo"</js>, 
<js>"bar"</js>))
-        *              .build();
-        * </p>
-        *
-        * <p>
-        * This is a shortcut for calling 
<c>getFormData().append(<jv>part</jv>)</c>.
-        *
-        * @param part
-        *      The parameter to append.
-        *      <br><jk>null</jk> values are ignored.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder formData(NameValuePair part) {
-               getFormData().append(part);
-               return this;
-       }
-
        /**
         * Sets a path parameter on all requests.
         *
@@ -1865,35 +1987,6 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
        }
 
        /**
-        * Appends multiple form-data parameters to the request bodies of all 
URL-encoded form posts.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      <jk>import static</jk> org.apache.juneau.http.HttpParts.*;
-        *
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .formData(
-        *                      <jsm>stringPart</jsm>(<js>"foo"</js>, 
<js>"bar"</js>),
-        *                      <jsm>booleanPart</jsm>(<js>"baz"</js>, 
<jk>true</jk>)
-        *              )
-        *              .build();
-        * </p>
-        *
-        * <p>
-        * This is a shortcut for calling 
<c>getFormData().append(<jv>parts</jv>)</c>.
-        *
-        * @param parts
-        *      The form-data parameters.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder formData(NameValuePair...parts) {
-               getFormData().append(parts);
-               return this;
-       }
-
-       /**
         * Sets multiple path parameters on all requests.
         *
         * <h5 class='section'>Example:</h5>
@@ -1923,22 +2016,6 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
        }
 
        /**
-        * Appends multiple form-data parameters to all requests.
-        *
-        * <p>
-        * This is a shortcut for calling 
<c>getFormData().append(<jv>parts</jv>)</c>.
-        *
-        * @param parts
-        *      The parts to set.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder formData(PartList parts) {
-               getFormData().append(parts);
-               return this;
-       }
-
-       /**
         * Appends multiple path parameters to all requests.
         *
         * <p>
@@ -1955,30 +2032,6 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
        }
 
        /**
-        * Appends a form-data parameter to all request bodies.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .formData(<js>"foo"</js>, <js>"bar"</js>)
-        *              .build();
-        * </p>
-        *
-        * <p>
-        * This is a shortcut for calling 
<c>getFormData().append(<jv>name</jv>,<jv>value</jv>)</c>.
-        *
-        * @param name The parameter name.
-        * @param value The parameter value.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder formData(String name, String value) {
-               getFormData().append(name, value);
-               return this;
-       }
-
-       /**
         * Appends a path parameter to all request bodies.
         *
         * <h5 class='section'>Example:</h5>
@@ -2003,30 +2056,6 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
        }
 
        /**
-        * Appends a form-data parameter with a dynamic value to all request 
bodies.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .formData(<js>"foo"</js>, ()-&gt;<js>"bar"</js>)
-        *              .build();
-        * </p>
-        *
-        * <p>
-        * This is a shortcut for calling 
<c>getFormData().append(<jv>name</jv>,<jv>value</jv>)</c>.
-        *
-        * @param name The parameter name.
-        * @param value The parameter value supplier.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder formData(String name, Supplier<String> value) {
-               getFormData().append(name, value);
-               return this;
-       }
-
-       /**
         * Sets a path parameter with a dynamic value to all request bodies.
         *
         * <h5 class='section'>Example:</h5>
@@ -2051,31 +2080,6 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
        }
 
        /**
-        * Sets default form-data parameter values.
-        *
-        * <p>
-        * Uses default values for specified parameters if not otherwise 
specified on the outgoing requests.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .defaultFormData(<jsm>stringPart</jsm>(<js>"foo"</js>, 
()-&gt;<js>"bar"</js>));
-        *              .build();
-        * </p>
-        *
-        * <p>
-        * This is a shortcut for calling 
<c>getFormData().setDefault(<jv>parts</jv>)</c>.
-        *
-        * @param parts The parts.
-        * @return This object (for method chaining).
-        */
-       public RestClientBuilder defaultFormData(NameValuePair...parts) {
-               getFormData().setDefault(parts);
-               return this;
-       }
-
-       /**
         * Sets default path parameter values.
         *
         * <p>
@@ -2101,30 +2105,6 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
        }
 
        /**
-        * Appends form-data parameters to all request bodies using free-form 
key/value pairs.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              
.formDataPairs(<js>"key1"</js>,<js>"val1"</js>,<js>"key2"</js>,<js>"val2"</js>)
-        *              .build();
-        * </p>
-        *
-        * @param pairs The form-data key/value pairs.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder formDataPairs(String...pairs) {
-               if (pairs.length % 2 != 0)
-                       throw new RuntimeException("Odd number of parameters 
passed into formDataPairs(String...)");
-               PartList.Builder b  = getFormData();
-               for (int i = 0; i < pairs.length; i+=2)
-                       b.append(pairs[i], pairs[i+1]);
-               return this;
-       }
-
-       /**
         * Sets path parameters to all request URLs using free-form key/value 
pairs.
         *
         * <h5 class='section'>Example:</h5>
diff --git 
a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockRestClientBuilder.java
 
b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockRestClientBuilder.java
index b892d09..38b9f51 100644
--- 
a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockRestClientBuilder.java
+++ 
b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockRestClientBuilder.java
@@ -924,18 +924,6 @@ public class MockRestClientBuilder extends 
RestClientBuilder {
        }
 
        @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder formData(NameValuePair part) {
-               super.formData(part);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder formData(PartList parts) {
-               super.formData(parts);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
        public MockRestClientBuilder formData(String name, String value) {
                super.formData(name, value);
                return this;
@@ -948,12 +936,6 @@ public class MockRestClientBuilder extends 
RestClientBuilder {
        }
 
        @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder formDataPairs(String...pairs) {
-               super.formDataPairs(pairs);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
        public MockRestClientBuilder from(String value) {
                super.from(value);
                return this;
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_FormData_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_FormData_Test.java
index 1f02bca..e82c57f 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_FormData_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_FormData_Test.java
@@ -75,7 +75,7 @@ public class RestClient_FormData_Test {
        @Test
        public void a04_formDatas_Objects() throws Exception {
                
client().formData(part("foo","bar")).build().post("/formData").run().assertBody().is("foo=bar");
-               
client().formData(parts("foo","bar","foo","baz")).build().post("/formData").run().assertBody().is("foo=bar&foo=baz");
+               
client().formData(parts("foo","bar","foo","baz").getAll()).build().post("/formData").run().assertBody().is("foo=bar&foo=baz");
                
client().formData(part("foo","bar"),part("foo","baz")).build().post("/formData").run().assertBody().is("foo=bar&foo=baz");
 
                
client().build().post("/formData").formData(part("foo","bar")).run().assertBody().is("foo=bar");
@@ -97,16 +97,6 @@ public class RestClient_FormData_Test {
        }
 
        @Test
-       public void a05_formDataPairs_Objects() throws Exception {
-               
client().formDataPairs("foo","bar","baz","qux").build().post("/formData").run().assertBody().is("foo=bar&baz=qux");
-
-               
client().build().post("/formData").formDataPairs("foo","bar","baz","qux").run().assertBody().is("foo=bar&baz=qux");
-
-               
assertThrown(()->client().formDataPairs("foo","bar","baz")).message().is("Odd 
number of parameters passed into formDataPairs(String...)");
-               
assertThrown(()->client().build().post("").formDataPairs("foo","bar","baz")).message().is("Odd
 number of parameters passed into formDataPairs(String...)");
-       }
-
-       @Test
        public void a06_formData_String_Object_Schema() throws Exception {
                List<String> l = AList.of("bar","baz"), l2 = 
AList.of("qux","quux");
                
client().formData(part("foo",l,T_ARRAY_PIPES)).build().post("/formData").formData(part("foo",l2,T_ARRAY_PIPES)).run().assertBody().asString().urlDecode().is("foo=bar|baz&foo=qux|quux");

Reply via email to