You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2020/07/07 13:23:00 UTC

[juneau] branch master updated: Docs and Assertions fixes.

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 d660550  Docs and Assertions fixes.
d660550 is described below

commit d660550674ffb749bb8dd663ba9f372d2e1920fb
Author: JamesBognar <ja...@salesforce.com>
AuthorDate: Tue Jul 7 09:22:48 2020 -0400

    Docs and Assertions fixes.
---
 .../org/apache/juneau/http/HeaderSupplierTest.java | 99 ++++++++++++++++++----
 .../org/apache/juneau/assertions/Assertion.java    | 22 ++++-
 .../apache/juneau/assertions/FluentAssertion.java  | 11 +++
 .../assertions/FluentByteArrayAssertion.java       | 20 ++++-
 .../juneau/assertions/FluentDateAssertion.java     | 12 +++
 .../juneau/assertions/FluentIntegerAssertion.java  | 12 +++
 .../juneau/assertions/FluentLongAssertion.java     | 12 +++
 .../juneau/assertions/FluentObjectAssertion.java   | 14 ++-
 .../juneau/assertions/FluentStringAssertion.java   | 12 +++
 .../assertions/FluentThrowableAssertion.java       | 23 +++--
 .../apache/juneau/assertions/StringAssertion.java  | 12 +++
 .../org/apache/juneau/http/HeaderSupplier.java     |  2 +-
 .../06.juneau-rest-server/24.SvlVariables.html     |  4 +-
 .../11.RestProxies/01.Remote.html                  |  4 +-
 juneau-doc/src/main/javadoc/overview.html          | 26 +++---
 .../client2/RestResponseStatusLineAssertion.java   | 10 +--
 16 files changed, 240 insertions(+), 55 deletions(-)

diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/http/HeaderSupplierTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/http/HeaderSupplierTest.java
index 639cd0b..1bf6e58 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/http/HeaderSupplierTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/http/HeaderSupplierTest.java
@@ -16,7 +16,10 @@ import static org.apache.juneau.assertions.Assertions.*;
 import static org.junit.runners.MethodSorters.*;
 
 import org.apache.http.*;
+import org.apache.juneau.collections.*;
 import org.apache.juneau.http.header.*;
+import org.apache.juneau.httppart.*;
+import org.apache.juneau.oapi.*;
 import org.junit.*;
 
 @FixMethodOrder(NAME_ASCENDING)
@@ -24,27 +27,87 @@ public class HeaderSupplierTest {
 
 	@Test
 	public void a01_basic() {
-		HeaderSupplier h = HeaderSupplier.of();
-		assertObject(h.iterator()).json().is("[]");
-		h.add(header("Foo","bar"));
-		assertObject(h.iterator()).json().is("['Foo: bar']");
-		h.add(header("Foo","baz"));
-		assertObject(h.iterator()).json().is("['Foo: bar','Foo: baz']");
-		h.add(HeaderSupplier.of());
-		assertObject(h.iterator()).json().is("['Foo: bar','Foo: baz']");
-		h.add(HeaderSupplier.of(header("Foo","qux")));
-		assertObject(h.iterator()).json().is("['Foo: bar','Foo: baz','Foo: qux']");
-		h.add(HeaderSupplier.of(header("Foo","q2x"), header("Foo","q3x")));
-		assertObject(h.iterator()).json().is("['Foo: bar','Foo: baz','Foo: qux','Foo: q2x','Foo: q3x']");
-		h.add(HeaderSupplier.of(HeaderSupplier.of(header("Foo","q4x"),header("Foo","q5x"))));
-		assertObject(h.iterator()).json().is("['Foo: bar','Foo: baz','Foo: qux','Foo: q2x','Foo: q3x','Foo: q4x','Foo: q5x']");
-		h.add((Header)null);
-		assertObject(h.iterator()).json().is("['Foo: bar','Foo: baz','Foo: qux','Foo: q2x','Foo: q3x','Foo: q4x','Foo: q5x']");
-		h.add((HeaderSupplier)null);
-		assertObject(h.iterator()).json().is("['Foo: bar','Foo: baz','Foo: qux','Foo: q2x','Foo: q3x','Foo: q4x','Foo: q5x']");
+		HeaderSupplier x = HeaderSupplier.of();
+
+		assertObject(x.iterator()).json().is("[]");
+		x.add(header("Foo","bar"));
+		assertObject(x.iterator()).json().is("['Foo: bar']");
+		x.add(header("Foo","baz"));
+		assertObject(x.iterator()).json().is("['Foo: bar','Foo: baz']");
+		x.add(HeaderSupplier.of());
+		assertObject(x.iterator()).json().is("['Foo: bar','Foo: baz']");
+		x.add(HeaderSupplier.of(header("Foo","qux")));
+		assertObject(x.iterator()).json().is("['Foo: bar','Foo: baz','Foo: qux']");
+		x.add(HeaderSupplier.of(header("Foo","q2x"), header("Foo","q3x")));
+		assertObject(x.iterator()).json().is("['Foo: bar','Foo: baz','Foo: qux','Foo: q2x','Foo: q3x']");
+		x.add(HeaderSupplier.of(HeaderSupplier.of(header("Foo","q4x"),header("Foo","q5x"))));
+		assertObject(x.iterator()).json().is("['Foo: bar','Foo: baz','Foo: qux','Foo: q2x','Foo: q3x','Foo: q4x','Foo: q5x']");
+		x.add((Header)null);
+		assertObject(x.iterator()).json().is("['Foo: bar','Foo: baz','Foo: qux','Foo: q2x','Foo: q3x','Foo: q4x','Foo: q5x']");
+		x.add((HeaderSupplier)null);
+		assertObject(x.iterator()).json().is("['Foo: bar','Foo: baz','Foo: qux','Foo: q2x','Foo: q3x','Foo: q4x','Foo: q5x']");
+	}
+
+	@Test
+	public void a02_creators() {
+		HeaderSupplier x;
+
+		x = HeaderSupplier.of(header("Foo","bar"), header("Foo","baz"), null);
+		assertObject(x.iterator()).json().is("['Foo: bar','Foo: baz']");
+
+		x = HeaderSupplier.of(AList.of(header("Foo","bar"), header("Foo","baz"), null));
+		assertObject(x.iterator()).json().is("['Foo: bar','Foo: baz']");
+
+		x = HeaderSupplier.ofPairs("Foo","bar","Foo","baz");
+		assertObject(x.iterator()).json().is("['Foo: bar','Foo: baz']");
+
+		assertThrown(()->HeaderSupplier.ofPairs("Foo")).is("Odd number of parameters passed into HeaderSupplier.ofPairs()");
+
+		assertThrown(()->HeaderSupplier.of("Foo")).is("Invalid type passed to HeaderSupplier.of(): java.lang.String");
+	}
+
+	@Test
+	public void a03_addMethods() {
+		String pname = "HeaderSupplierTest.x";
+
+		HeaderSupplier x = HeaderSupplier.create().resolving();
+		System.setProperty(pname, "y");
+
+		x.add("X1","bar");
+		x.add("X2","$S{"+pname+"}");
+		x.add("X3","bar");
+		x.add("X4",()->"$S{"+pname+"}");
+		x.add("X5","bar",openApiSession(),null,false);
+		x.add("X6","$S{"+pname+"}",openApiSession(),null,false);
+
+		assertString(x.toString()).is("X1=bar&X2=y&X3=bar&X4=y&X5=bar&X6=y");
+
+		System.setProperty(pname, "z");
+
+		assertString(x.toString()).is("X1=bar&X2=z&X3=bar&X4=z&X5=bar&X6=z");
+
+		System.clearProperty(pname);
 	}
 
+	@Test
+	public void a04_toArrayMethods() {
+		Header[] x = HeaderSupplier
+			.create()
+			.add("X1","1")
+			.add(HeaderSupplier.ofPairs("X2","2"))
+			.toArray();
+		assertObject(x).json().is("['X1: 1','X2: 2']");
+	}
+
+	//-----------------------------------------------------------------------------------------------------------------
+	// Utility methods
+	//-----------------------------------------------------------------------------------------------------------------
+
 	private static Header header(String name, Object val) {
 		return BasicHeader.of(name, val);
 	}
+
+	private static HttpPartSerializerSession openApiSession() {
+		return OpenApiSerializer.DEFAULT.createPartSession(null);
+	}
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/Assertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/Assertion.java
index ba425e6..5b9a71a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/Assertion.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/Assertion.java
@@ -22,9 +22,25 @@ import org.apache.juneau.internal.*;
  */
 public class Assertion {
 
-	private String msg;
-	private Object[] msgArgs;
-	private boolean stdout, stderr;
+	String msg;
+	Object[] msgArgs;
+	boolean stdout, stderr;
+
+	/**
+	 * No-arg constructor.
+	 */
+	protected Assertion() {}
+
+	/**
+	 * Constructor used when this assertion is being created from within another assertion.
+	 * @param creator The creator of this assertion.
+	 */
+	protected Assertion(Assertion creator) {
+		this.msg = creator.msg;
+		this.msgArgs = creator.msgArgs;
+		this.stdout = creator.stdout;
+		this.stderr = creator.stderr;
+	}
 
 	/**
 	 * Allows to to specify the assertion failure message.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentAssertion.java
index 9c74bd0..ef95776 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentAssertion.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentAssertion.java
@@ -34,6 +34,17 @@ public abstract class FluentAssertion<R> extends Assertion {
 	}
 
 	/**
+	 * Constructor.
+	 *
+	 * @param creator The assertion that created this assertion.
+	 * @param returns The object to return after the test.
+	 */
+	protected FluentAssertion(Assertion creator, R returns) {
+		super(creator);
+		this.returns = returns;
+	}
+
+	/**
 	 * Returns the object that the fluent methods on this class should return.
 	 *
 	 * @return The response object.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentByteArrayAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentByteArrayAssertion.java
index 12fdba0..5481b9b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentByteArrayAssertion.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentByteArrayAssertion.java
@@ -40,6 +40,18 @@ public class FluentByteArrayAssertion<R> extends FluentAssertion<R> {
 	}
 
 	/**
+	 * Constructor.
+	 *
+	 * @param creator The assertion that created this assertion.
+	 * @param contents The byte array being tested.
+	 * @param returns The object to return after the test.
+	 */
+	public FluentByteArrayAssertion(Assertion creator, byte[] contents, R returns) {
+		super(creator, returns);
+		this.contents = contents;
+	}
+
+	/**
 	 * Converts this byte array to a UTF-8 encoded string and returns it as a new assertion.
 	 *
 	 * <h5 class='section'>Example:</h5>
@@ -67,7 +79,7 @@ public class FluentByteArrayAssertion<R> extends FluentAssertion<R> {
 	 * @return A new fluent string assertion.
 	 */
 	public FluentStringAssertion<R> string(Charset cs) {
-		return new FluentStringAssertion<>(contents == null ? null : new String(contents, cs), returns());
+		return new FluentStringAssertion<>(this, contents == null ? null : new String(contents, cs), returns());
 	}
 
 	/**
@@ -82,7 +94,7 @@ public class FluentByteArrayAssertion<R> extends FluentAssertion<R> {
 	 * @return A new fluent string assertion.
 	 */
 	public FluentStringAssertion<R> base64() {
-		return new FluentStringAssertion<>(contents == null ? null : base64Encode(contents), returns());
+		return new FluentStringAssertion<>(this, contents == null ? null : base64Encode(contents), returns());
 	}
 
 	/**
@@ -97,7 +109,7 @@ public class FluentByteArrayAssertion<R> extends FluentAssertion<R> {
 	 * @return A new string consisting of hexadecimal characters.
 	 */
 	public FluentStringAssertion<R> hex() {
-		return new FluentStringAssertion<>(contents == null ? null : toHex(contents), returns());
+		return new FluentStringAssertion<>(this, contents == null ? null : toHex(contents), returns());
 	}
 
 	/**
@@ -112,7 +124,7 @@ public class FluentByteArrayAssertion<R> extends FluentAssertion<R> {
 	 * @return A new string consisting of hexadecimal characters.
 	 */
 	public FluentStringAssertion<R> spacedHex() {
-		return new FluentStringAssertion<>(contents == null ? null : toSpacedHex(contents), returns());
+		return new FluentStringAssertion<>(this, contents == null ? null : toSpacedHex(contents), returns());
 	}
 
 	// <FluentSetters>
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentDateAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentDateAssertion.java
index b9c26ce..40170de 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentDateAssertion.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentDateAssertion.java
@@ -51,6 +51,18 @@ public class FluentDateAssertion<R> extends FluentAssertion<R> {
 	}
 
 	/**
+	 * Constructor.
+	 *
+	 * @param creator The assertion that created this assertion.
+	 * @param value The value being tested.
+	 * @param returns The object to return after the test.
+	 */
+	public FluentDateAssertion(Assertion creator, Date value, R returns) {
+		super(creator, returns);
+		this.value = value;
+	}
+
+	/**
 	 * Asserts that the value equals the specified value.
 	 *
 	 * @param value The value to check against.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentIntegerAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentIntegerAssertion.java
index 2985951..113b7a7 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentIntegerAssertion.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentIntegerAssertion.java
@@ -49,6 +49,18 @@ public class FluentIntegerAssertion<R> extends FluentAssertion<R> {
 	}
 
 	/**
+	 * Constructor.
+	 *
+	 * @param creator The assertion that created this assertion.
+	 * @param value The value being tested.
+	 * @param returns The object to return after the test.
+	 */
+	public FluentIntegerAssertion(Assertion creator, Integer value, R returns) {
+		super(creator, returns);
+		this.value = value;
+	}
+
+	/**
 	 * Asserts that the value equals the specified value.
 	 *
 	 * @param value The value to check against.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentLongAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentLongAssertion.java
index 2aadd42..5903552 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentLongAssertion.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentLongAssertion.java
@@ -49,6 +49,18 @@ public class FluentLongAssertion<R> extends FluentAssertion<R> {
 	}
 
 	/**
+	 * Constructor.
+	 *
+	 * @param creator The assertion that created this assertion.
+	 * @param value The value being tested.
+	 * @param returns The object to return after the test.
+	 */
+	public FluentLongAssertion(Assertion creator, Long value, R returns) {
+		super(creator, returns);
+		this.value = value;
+	}
+
+	/**
 	 * Asserts that the value equals the specified value.
 	 *
 	 * @param value The value to check against.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java
index 708601f..f14b58a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java
@@ -66,6 +66,18 @@ public class FluentObjectAssertion<R> extends FluentAssertion<R> {
 	}
 
 	/**
+	 * Constructor.
+	 *
+	 * @param creator The assertion that created this assertion.
+	 * @param o The object being tested.
+	 * @param returns The object to return after the test.
+	 */
+	public FluentObjectAssertion(Assertion creator, Object o, R returns) {
+		super(creator, returns);
+		this.value = o;
+	}
+
+	/**
 	 * Asserts that the object is an instance of the specified class.
 	 *
 	 * <h5 class='section'>Example:</h5>
@@ -101,7 +113,7 @@ public class FluentObjectAssertion<R> extends FluentAssertion<R> {
 	public FluentStringAssertion<R> serialized(WriterSerializer ws) {
 		try {
 			String s = ws.serialize(this.value);
-			return new FluentStringAssertion<>(s, returns());
+			return new FluentStringAssertion<>(this, s, returns());
 		} catch (SerializeException e) {
 			throw new RuntimeException(e);
 		}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentStringAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentStringAssertion.java
index 20d5f90..7db0be3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentStringAssertion.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentStringAssertion.java
@@ -53,6 +53,18 @@ public class FluentStringAssertion<R> extends FluentAssertion<R> {
 	}
 
 	/**
+	 * Constructor.
+	 *
+	 * @param creator The assertion that created this assertion.
+	 * @param text The text being tested.
+	 * @param returns The object to return after the test.
+	 */
+	public FluentStringAssertion(Assertion creator, String text, R returns) {
+		super(creator, returns);
+		this.text = text;
+	}
+
+	/**
 	 * When enabled, text in the message is converted to valid Java strings.
 	 *
 	 * <p class='bcode w800'>
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentThrowableAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentThrowableAssertion.java
index d0c48d2..857c606 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentThrowableAssertion.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentThrowableAssertion.java
@@ -37,6 +37,17 @@ public class FluentThrowableAssertion<R> extends FluentAssertion<R> {
 		this.value = value;
 	}
 
+	/**
+	 * Constructor.
+	 *
+	 * @param creator The assertion that created this assertion.
+	 * @param value The throwable being tested.
+	 * @param returns The object to return after the test.
+	 */
+	public FluentThrowableAssertion(Assertion creator, Throwable value, R returns) {
+		super(creator, returns);
+		this.value = value;
+	}
 
 	/**
 	 * Asserts that this throwable is of the specified type.
@@ -160,7 +171,7 @@ public class FluentThrowableAssertion<R> extends FluentAssertion<R> {
 	 * @return An assertion against the throwable message.  Never <jk>null</jk>.
 	 */
 	public FluentStringAssertion<R> message() {
-		return new FluentStringAssertion<>(value == null ? null : value.getMessage(), returns());
+		return new FluentStringAssertion<>(this, value == null ? null : value.getMessage(), returns());
 	}
 
 	/**
@@ -175,7 +186,7 @@ public class FluentThrowableAssertion<R> extends FluentAssertion<R> {
 	 * @return An assertion against the throwable localized message.  Never <jk>null</jk>.
 	 */
 	public FluentStringAssertion<R> localizedMessage() {
-		return new FluentStringAssertion<>(value == null ? null : value.getLocalizedMessage(), returns());
+		return new FluentStringAssertion<>(this, value == null ? null : value.getLocalizedMessage(), returns());
 	}
 
 	/**
@@ -190,7 +201,7 @@ public class FluentThrowableAssertion<R> extends FluentAssertion<R> {
 	 * @return An assertion against the throwable stacktrace.  Never <jk>null</jk>.
 	 */
 	public FluentStringAssertion<R> stackTrace() {
-		return new FluentStringAssertion<>(value == null ? null : StringUtils.getStackTrace(value), returns());
+		return new FluentStringAssertion<>(this, value == null ? null : StringUtils.getStackTrace(value), returns());
 	}
 
 	/**
@@ -205,7 +216,7 @@ public class FluentThrowableAssertion<R> extends FluentAssertion<R> {
 	 * @return An assertion against the caused-by.  Never <jk>null</jk>.
 	 */
 	public FluentThrowableAssertion<R> causedBy() {
-		return new FluentThrowableAssertion<>(value == null ? null : value.getCause(), returns());
+		return new FluentThrowableAssertion<>(this, value == null ? null : value.getCause(), returns());
 	}
 
 	/**
@@ -224,10 +235,10 @@ public class FluentThrowableAssertion<R> extends FluentAssertion<R> {
 		Throwable t = value;
 		while (t != null) {
 			if (throwableClass.isInstance(t))
-				return new FluentThrowableAssertion<>(t, returns());
+				return new FluentThrowableAssertion<>(this, t, returns());
 			t = t.getCause();
 		}
-		return new FluentThrowableAssertion<>(null, returns());
+		return new FluentThrowableAssertion<>(this, null, returns());
 	}
 
 	// <FluentSetters>
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/StringAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/StringAssertion.java
index c30a221..877bbf6 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/StringAssertion.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/StringAssertion.java
@@ -78,5 +78,17 @@ public class StringAssertion extends FluentStringAssertion<StringAssertion> {
 		return this;
 	}
 
+	@Override /* GENERATED - FluentStringAssertion */
+	public StringAssertion replace(String target, String replacement) {
+		super.replace(target, replacement);
+		return this;
+	}
+
+	@Override /* GENERATED - FluentStringAssertion */
+	public StringAssertion replaceAll(String regex, String replacement) {
+		super.replaceAll(regex, replacement);
+		return this;
+	}
+
 	// </FluentSetters>
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HeaderSupplier.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HeaderSupplier.java
index 94826c3..bbc0720 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HeaderSupplier.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HeaderSupplier.java
@@ -184,7 +184,7 @@ public class HeaderSupplier implements Iterable<Header> {
 	 * @return This object(for method chaining).
 	 */
 	private HeaderSupplier addAll(Collection<Header> headers) {
-		this.headers.addAll(headers.stream().map(x->Collections.singleton(x)).collect(Collectors.toList()));
+		this.headers.addAll(headers.stream().filter(x->x != null).map(x->Collections.singleton(x)).collect(Collectors.toList()));
 		return this;
 	}
 
diff --git a/juneau-doc/docs/Topics/06.juneau-rest-server/24.SvlVariables.html b/juneau-doc/docs/Topics/06.juneau-rest-server/24.SvlVariables.html
index 8b3cf65..90f4535 100644
--- a/juneau-doc/docs/Topics/06.juneau-rest-server/24.SvlVariables.html
+++ b/juneau-doc/docs/Topics/06.juneau-rest-server/24.SvlVariables.html
@@ -138,7 +138,7 @@ SVL Variables
 		<td class='code'>$SW{arg,p1:then1[,p2:then2...]}</td>
 		<td style='text-align:center;font-weight:bold'>yes</td>
 		<td style='text-align:center;font-weight:bold'>yes</td>
-		<td class='code'>$SW{$P{os.name},*win*:Windows,*:Something else}</td>
+		<td class='code'>$SW{$S{os.name},*win*:Windows,*:Something else}</td>
 	</tr>
 	<tr class='dark'>
 		<td>{@link oaj.svl.vars.CoalesceVar}</td>
@@ -152,7 +152,7 @@ SVL Variables
 		<td class='code'>$PM{arg,pattern}</td>
 		<td style='text-align:center;font-weight:bold'>yes</td>
 		<td style='text-align:center;font-weight:bold'>yes</td>
-		<td class='code'>$PM{$P{os.name},*win*}</td>
+		<td class='code'>$PM{$S{os.name},*win*}</td>
 	</tr>
 	<tr class='dark'>
 		<td>{@link oaj.svl.vars.NotEmptyVar}</td>
diff --git a/juneau-doc/docs/Topics/09.juneau-rest-client/11.RestProxies/01.Remote.html b/juneau-doc/docs/Topics/09.juneau-rest-client/11.RestProxies/01.Remote.html
index f50fdf0..28c7521 100644
--- a/juneau-doc/docs/Topics/09.juneau-rest-client/11.RestProxies/01.Remote.html
+++ b/juneau-doc/docs/Topics/09.juneau-rest-client/11.RestProxies/01.Remote.html
@@ -62,7 +62,7 @@ specific language governing permissions and limitations under the License.
 <h5 class='figure'>Example:</h5>
 <p class='bpcode w800'>	
 	<jc>// URL is specified via a system property.</jc>
-	<ja>@Remote</ja>(path=<js>"$P{PetStoreUrl}"</js>)
+	<ja>@Remote</ja>(path=<js>"$S{PetStoreUrl}"</js>)
 	<jk>public interface</jk> PetStore {...}
 </p>
 
@@ -117,7 +117,7 @@ specific language governing permissions and limitations under the License.
 		path=<js>"/petstore"</js>,
 		headers={
 			<js>"Foo: bar"</js>,
-			<js>"Baz: $P{bazProperty}"</js>
+			<js>"Baz: $S{bazProperty}"</js>
 		},
 		headerSupplier=MyDynamicHeaderSupplier.<jk>class</jk>
 	)
diff --git a/juneau-doc/src/main/javadoc/overview.html b/juneau-doc/src/main/javadoc/overview.html
index 635639c..8a7807a 100644
--- a/juneau-doc/src/main/javadoc/overview.html
+++ b/juneau-doc/src/main/javadoc/overview.html
@@ -24070,7 +24070,7 @@
 		{@link java.io.InputStream} - Raw contents of {@code InputStream} will be serialized to remote resource.
 		<br><c>Content-Type</c> is set to <js>"application/octet-stream"</js>.
 	<li>
-		<c>NameValuePairs</c> - Converted to a URL-encoded FORM post.
+		{@link org.apache.juneau.http.NameValuePairSupplier} - Converted to a URL-encoded FORM post.
 		<br><c>Content-Type</c> is set to <js>"aplication/x-www-form-urlencoded"</js>.
 	<li>
 		<c>HttpEntity</c> - Bypass Juneau serialization and pass HttpEntity directly to HttpClient.
@@ -24173,10 +24173,10 @@
 			<ja>@FormData</ja>(<js>"bar"</js>)</ja> MyPojo <jv>pojo</jv>
 		);
 
-		<jc>// Multiple values pulled from a NameValuePairs object.</jc>
+		<jc>// Multiple values pulled from a NameValuePairSupplier object.</jc>
 		<jc>// Name "*" is inferred.</jc>
 		<ja>@RemoteMethod</ja>
-		String postNameValuePairs(<ja>@FormData</ja> NameValuePairs <jv>nameValuePairs</jv>);
+		String postNameValuePairs(<ja>@FormData</ja> NameValuePairSupplier <jv>nameValuePairSupplier</jv>);
 
 		<jc>// Multiple values pulled from a Map.</jc>
 		<ja>@RemoteMethod</ja>
@@ -24213,7 +24213,7 @@
 	<li>
 		{@link java.io.InputStream} - Raw contents of {@code InputStream} will be serialized to remote resource.
 	<li>
-		<c>NameValuePairs</c> - Converted to a URL-encoded FORM post.
+		{@link org.apache.juneau.http.NameValuePairSupplier} - Converted to a URL-encoded FORM post.
 	<li>
 		<c>Map</c> - Converted to key-value pairs.
 			<br>Values serialized using the registered {@link org.apache.juneau.httppart.HttpPartSerializer} ({@link org.apache.juneau.oapi.OpenApiSerializer} by default).
@@ -24279,10 +24279,10 @@
 			<ja>@Query</ja>(<js>"foo"</js>)</ja> String <jv>foo</jv>,
 			<ja>@Query</ja>(<js>"bar"</js>)</ja> MyPojo <jv>pojo</jv>);
  
-		<jc>// Multiple values pulled from a NameValuePairs object.</jc>
+		<jc>// Multiple values pulled from a NameValuePairSupplier object.</jc>
 		<jc>// Same as @Query("*").</jc>
 		<ja>@RemoteMethod</ja>
-		String nameValuePairs(<ja>@Query</ja> NameValuePairs <jv>nameValuePairs</jv>);
+		String nameValuePairs(<ja>@Query</ja> NameValuePairSupplier <jv>nameValuePairSupplier</jv>);
  
 		<jc>// Multiple values pulled from a Map.</jc>
 		<jc>// Same as @Query("*").</jc>
@@ -24322,7 +24322,7 @@
 	<li>
 		{@link java.io.Reader} - Raw contents of {@code Reader} will be serialized directly a query string.
 	<li>
-		<c>NameValuePairs</c> - Serialized as individual query parameters.
+		{@link org.apache.juneau.http.NameValuePairSupplier} - Serialized as individual query parameters.
 	<li>
 		<c>Map</c> - Converted to key-value pairs.
 			<br>Values serialized using the registered {@link org.apache.juneau.httppart.HttpPartSerializer} ({@link org.apache.juneau.oapi.OpenApiSerializer} by default).
@@ -24389,10 +24389,10 @@
 		String myProxyMethod1(<ja>@Header</ja>(<js>"Foo"</js>)</ja> String <jv>foo</jv>,
 			<ja>@Header</ja>(<js>"Bar"</js>)</ja> MyPojo <jv>pojo</jv>);
 
-		<jc>// Multiple values pulled from a NameValuePairs object.</jc>
+		<jc>// Multiple values pulled from a HeaderSupplier object.</jc>
 		<jc>// Same as @Header("*").</jc>
 		<ja>@RemoteMethod</ja>(path=<js>"/mymethod2"</js>)
-		String myProxyMethod2(<ja>@Header</ja> NameValuePairs <jv>nameValuePairs</jv>);
+		String myProxyMethod2(<ja>@Header</ja> HeaderSupplier <jv>headerSupplier</jv>);
 
 		<jc>// Multiple values pulled from a Map.</jc>
 		<jc>// Same as @Header("*").</jc>
@@ -24420,7 +24420,7 @@
 </p>
 <ul class='spaced-list'>
 	<li>
-		<c>NameValuePairs</c> - Serialized as individual headers.
+		{@link org.apache.juneau.http.HeaderSupplier} - Serialized as individual headers.
 	<li>
 		<c>Map</c> - Converted to key-value pairs.
 			<br>Values serialized using the registered {@link org.apache.juneau.httppart.HttpPartSerializer} ({@link org.apache.juneau.oapi.OpenApiSerializer} by default).
@@ -24478,10 +24478,10 @@
 		<ja>@RemoteMethod</ja>(path=<js>"/mymethod1/{foo}/{bar}"</js>)
 		String myProxyMethod1(<ja>@Path</ja>(<js>"foo"</js>)</ja> String <jv>foo</jv>, <ja>@Path</ja>(<js>"bar"</js>)</ja> MyPojo <jv>pojo</jv>);
 
-		<jc>// Multiple values pulled from a NameValuePairs object.</jc>
+		<jc>// Multiple values pulled from a NameValuePairSupplier object.</jc>
 		<jc>// Same as @Path("*").</jc>
 		<ja>@RemoteMethod</ja>(path=<js>"/mymethod2/{foo}/{bar}/{baz}"</js>)
-		String myProxyMethod2(<ja>@Path</ja> NameValuePairs <jv>nameValuePairs</jv>);
+		String myProxyMethod2(<ja>@Path</ja> NameValuePairSupplier <jv>nameValuePairSupplier</jv>);
 
 		<jc>// Multiple values pulled from a Map.</jc>
 		<jc>// Same as @Path("*").</jc>
@@ -24509,7 +24509,7 @@
 </p>
 <ul class='spaced-list'>
 	<li>
-		<c>NameValuePairs</c> - Serialized as individual query parameters.
+		{@link org.apache.juneau.http.NameValuePairSupplier} - Serialized as individual path parameters.
 	<li>
 		<c>Map</c> - Converted to key-value pairs.
 			<br>Values serialized using the registered {@link org.apache.juneau.httppart.HttpPartSerializer} ({@link org.apache.juneau.oapi.OpenApiSerializer} by default).
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseStatusLineAssertion.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseStatusLineAssertion.java
index 551e65f..e7089ff 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseStatusLineAssertion.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseStatusLineAssertion.java
@@ -48,7 +48,7 @@ public class RestResponseStatusLineAssertion extends FluentAssertion<RestRespons
 	 * @return An assertion against the status code on the response status object.
 	 */
 	public FluentIntegerAssertion<RestResponse> code() {
-		return new FluentIntegerAssertion<>(statusLine.getStatusCode(), returns());
+		return new FluentIntegerAssertion<>(this, statusLine.getStatusCode(), returns());
 	}
 
 	/**
@@ -57,7 +57,7 @@ public class RestResponseStatusLineAssertion extends FluentAssertion<RestRespons
 	 * @return An assertion against the reason phrase on the response status object.
 	 */
 	public FluentStringAssertion<RestResponse> reason() {
-		return new FluentStringAssertion<>(statusLine.getReasonPhrase(), returns());
+		return new FluentStringAssertion<>(this, statusLine.getReasonPhrase(), returns());
 	}
 
 	/**
@@ -66,7 +66,7 @@ public class RestResponseStatusLineAssertion extends FluentAssertion<RestRespons
 	 * @return An assertion against the protocol on the response status object.
 	 */
 	public FluentStringAssertion<RestResponse> protocol() {
-		return new FluentStringAssertion<>(statusLine.getProtocolVersion().getProtocol(), returns());
+		return new FluentStringAssertion<>(this, statusLine.getProtocolVersion().getProtocol(), returns());
 	}
 
 	/**
@@ -75,7 +75,7 @@ public class RestResponseStatusLineAssertion extends FluentAssertion<RestRespons
 	 * @return An assertion against the protocol major version on the response status object.
 	 */
 	public FluentIntegerAssertion<RestResponse> major() {
-		return new FluentIntegerAssertion<>(statusLine.getProtocolVersion().getMajor(), returns());
+		return new FluentIntegerAssertion<>(this, statusLine.getProtocolVersion().getMajor(), returns());
 	}
 
 	/**
@@ -84,6 +84,6 @@ public class RestResponseStatusLineAssertion extends FluentAssertion<RestRespons
 	 * @return An assertion against the protocol minor version on the response status object.
 	 */
 	public FluentIntegerAssertion<RestResponse> minor() {
-		return new FluentIntegerAssertion<>(statusLine.getProtocolVersion().getMinor(), returns());
+		return new FluentIntegerAssertion<>(this, statusLine.getProtocolVersion().getMinor(), returns());
 	}
 }