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<?>)}
* <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> ->
<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>,
()-><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>, ()-><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>, ()-><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>,
()-><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");