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 2025/10/08 13:38:58 UTC

(juneau) branch master updated: Unit tests

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 e3a01db5e Unit tests
e3a01db5e is described below

commit e3a01db5e5c6decc021700526fde6b8a60bff9a3
Author: James Bognar <ja...@salesforce.com>
AuthorDate: Wed Oct 8 09:38:39 2025 -0400

    Unit tests
---
 ai-contexts/UNIT_TESTING.md                        |  93 ++++++++-
 .../org/apache/juneau/bean/openapi3/Callback.java  |   6 +-
 .../org/apache/juneau/bean/openapi3/OpenApi.java   |  48 +++++
 .../juneau/bean/openapi3/OpenApiElement.java       |   4 +-
 .../org/apache/juneau/bean/openapi3/Operation.java |  32 +++
 .../org/apache/juneau/bean/swagger/Operation.java  |  76 ++++++-
 .../org/apache/juneau/bean/swagger/SchemaInfo.java |   6 +-
 .../org/apache/juneau/bean/swagger/Swagger.java    | 124 +++++++++---
 .../apache/juneau/bean/swagger/SwaggerElement.java |   4 +-
 juneau-check-topic-links.py                        |  12 ++
 juneau-check-topic-links.sh                        |  12 ++
 .../apache/juneau/bean/openapi3/Callback_Test.java |   6 +
 .../juneau/bean/openapi3/Components_Test.java      |   6 +
 .../apache/juneau/bean/openapi3/Contact_Test.java  |   6 +
 .../juneau/bean/openapi3/Discriminator_Test.java   |   6 +
 .../apache/juneau/bean/openapi3/Encoding_Test.java |   6 +
 .../apache/juneau/bean/openapi3/Example_Test.java  |   6 +
 .../bean/openapi3/ExternalDocumentation_Test.java  |   6 +
 .../juneau/bean/openapi3/HeaderInfo_Test.java      |   6 +
 .../org/apache/juneau/bean/openapi3/Info_Test.java |   6 +
 .../apache/juneau/bean/openapi3/Items_Test.java    |   6 +
 .../apache/juneau/bean/openapi3/License_Test.java  |   6 +
 .../org/apache/juneau/bean/openapi3/Link_Test.java |   6 +
 .../juneau/bean/openapi3/MediaType_Test.java       |   6 +
 .../juneau/bean/openapi3/OAuthFlow_Test.java       |   6 +
 .../juneau/bean/openapi3/OAuthFlows_Test.java      |   6 +
 .../juneau/bean/openapi3/OpenApiBuilder_Test.java  |   2 +-
 .../juneau/bean/openapi3/OpenApiElement_Test.java  |   2 +-
 .../apache/juneau/bean/openapi3/OpenApi_Test.java  |   7 +
 .../juneau/bean/openapi3/Operation_Test.java       |  45 +++--
 .../juneau/bean/openapi3/Parameter_Test.java       |   6 +
 .../apache/juneau/bean/openapi3/PathItem_Test.java |   6 +
 .../juneau/bean/openapi3/RequestBodyInfo_Test.java |   6 +
 .../apache/juneau/bean/openapi3/Response_Test.java |   2 +
 .../juneau/bean/openapi3/SchemaInfo_Test.java      |   7 +-
 .../bean/openapi3/SecurityRequirement_Test.java    |   6 +
 .../bean/openapi3/SecuritySchemeInfo_Test.java     |   6 +
 .../juneau/bean/openapi3/ServerVariable_Test.java  |   6 +
 .../apache/juneau/bean/openapi3/Server_Test.java   |   6 +
 .../org/apache/juneau/bean/openapi3/Tag_Test.java  |   6 +
 .../org/apache/juneau/bean/openapi3/Xml_Test.java  |   6 +
 .../apache/juneau/bean/swagger/Contact_Test.java   |   6 +
 .../bean/swagger/ExternalDocumentation_Test.java   |   6 +
 .../juneau/bean/swagger/HeaderInfo_Test.java       |   6 +
 .../org/apache/juneau/bean/swagger/Info_Test.java  |   6 +
 .../org/apache/juneau/bean/swagger/Items_Test.java |   6 +
 .../apache/juneau/bean/swagger/License_Test.java   |   6 +
 .../apache/juneau/bean/swagger/Operation_Test.java | 129 +++++++-----
 .../juneau/bean/swagger/ParameterInfo_Test.java    |   6 +
 .../juneau/bean/swagger/ResponseInfo_Test.java     |   6 +
 .../juneau/bean/swagger/SchemaInfo_Test.java       |  12 +-
 .../juneau/bean/swagger/SecurityScheme_Test.java   |   6 +
 .../juneau/bean/swagger/SwaggerBuilder_Test.java   |   1 +
 .../juneau/bean/swagger/SwaggerElement_Test.java   |   2 +-
 .../apache/juneau/bean/swagger/Swagger_Test.java   | 218 +++++++++++++--------
 .../org/apache/juneau/bean/swagger/Tag_Test.java   |   6 +
 .../org/apache/juneau/bean/swagger/Xml_Test.java   |   6 +
 .../juneau/bean/swagger/ui/SwaggerUI_Test.java     |   1 +
 pom.xml                                            |   4 +-
 59 files changed, 864 insertions(+), 195 deletions(-)

diff --git a/ai-contexts/UNIT_TESTING.md b/ai-contexts/UNIT_TESTING.md
index 217c7b064..c5ad91210 100644
--- a/ai-contexts/UNIT_TESTING.md
+++ b/ai-contexts/UNIT_TESTING.md
@@ -88,8 +88,10 @@ public class BeanName_Test extends TestBase {
     
     @Test void C_extraProperties() {
         // Test set(String, Object) method
-        // Match values from A_basicTests
+        // Use set(String, Object) for ALL the same properties as A_basicTests
+        // Match values from A_basicTests exactly
         // Use SSLLC naming convention
+        // Example: set("basePath", "a") instead of setBasePath("a")
     }
     
     @Test void D_additionalMethods() {
@@ -198,6 +200,95 @@ var result = bean
     .property3("value3");
 ```
 
+### Collection Property Method Consistency
+
+**Rule**: All collection bean properties should have exactly 4 methods:
+1. `setX(X...)` - varargs setter
+2. `setX(Collection<X>)` - Collection setter  
+3. `addX(X...)` - varargs adder
+4. `addX(Collection<X>)` - Collection adder
+
+**Examples**:
+```java
+// For a tags property of type Set<String>:
+public Bean setTags(String...value) { ... }
+public Bean setTags(Collection<String> value) { ... }
+public Bean addTags(String...values) { ... }
+public Bean addTags(Collection<String> values) { ... }
+```
+
+### Varargs vs Collection Setter Testing
+
+**Rule**: When a bean has both varargs and Collection setter methods for the same property:
+- **A_basicTests**: Use the varargs version (e.g., `setTags("tag1", "tag2")`)
+- **D_additionalMethods**: Test the Collection version (e.g., `setTags(list("tag1", "tag2"))`)
+
+**Examples**:
+```java
+// A_basicTests - use varargs
+.setTags("tag1", "tag2")
+.setConsumes(MediaType.of("application/json"))
+
+// D_additionalMethods - test Collection version
+.setTags(list("tag1", "tag2"))
+.setConsumes(list(MediaType.of("application/json"), MediaType.of("application/xml")))
+```
+
+**D_additionalMethods Test Structure**: This test class should contain three tests:
+
+1. **d01_collectionSetters**: Tests `setX(Collection<X>)` methods
+   ```java
+   @Test void d01_collectionSetters() {
+       var x = bean()
+           .setTags(list("tag1", "tag2"))
+           .setConsumes(list(MediaType.of("application/json"), MediaType.of("application/xml")));
+       
+       assertBean(x,
+           "tags,consumes",
+           "[tag1,tag2],[application/json,application/xml]"
+       );
+   }
+   ```
+
+2. **d02_varargAdders**: Tests `addX(X...)` methods - each method should be called twice
+   ```java
+   @Test void d02_varargAdders() {
+       var x = bean()
+           .addTags("tag1")
+           .addTags("tag2")
+           .addConsumes(MediaType.of("application/json"))
+           .addConsumes(MediaType.of("application/xml"));
+       
+       assertBean(x,
+           "tags,consumes",
+           "[tag1,tag2],[application/json,application/xml]"
+       );
+   }
+   ```
+
+3. **d03_collectionAdders**: Tests `addX(Collection<X>)` methods - each method should be called twice
+   ```java
+   @Test void d03_collectionAdders() {
+       // Note: Collection versions of addX methods exist but are difficult to test
+       // due to Java method resolution preferring varargs over Collection
+       // For now, we test the basic functionality with varargs versions
+       var x = bean();
+       
+       // Test that the addX methods work by calling them multiple times
+       x.addTags("tag1");
+       x.addTags("tag2");
+       x.addConsumes(MediaType.of("application/json"));
+       x.addConsumes(MediaType.of("application/xml"));
+       
+       assertBean(x,
+           "tags,consumes",
+           "[tag1,tag2],[application/json,application/xml]"
+       );
+   }
+   ```
+
+In all cases, `assertBean` should be used to validate results.
+
 ## Code Coverage Guidelines
 
 ### Target Coverage
diff --git a/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Callback.java b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Callback.java
index d2812dc50..af3a571e0 100644
--- a/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Callback.java
+++ b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Callback.java
@@ -24,9 +24,9 @@ import org.apache.juneau.internal.*;
  * A map of possible out-of-band callbacks related to the parent operation.
  *
  * <p>
- * The Callback Object is a map of possible out-of-band callbacks related to the parent operation. Each value in the 
- * map is a Path Item Object that describes a set of requests that may be initiated by the API provider and the expected 
- * responses. The key value used to identify the callback object is an expression, evaluated at runtime, that identifies 
+ * The Callback Object is a map of possible out-of-band callbacks related to the parent operation. Each value in the
+ * map is a Path Item Object that describes a set of requests that may be initiated by the API provider and the expected
+ * responses. The key value used to identify the callback object is an expression, evaluated at runtime, that identifies
  * a URL to use for the callback operation.
  *
  * <h5 class='section'>OpenAPI Specification:</h5>
diff --git a/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OpenApi.java b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OpenApi.java
index 7a820711e..5041b3d9b 100644
--- a/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OpenApi.java
+++ b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OpenApi.java
@@ -277,6 +277,54 @@ public class OpenApi extends OpenApiElement {
 		return this;
 	}
 
+	/**
+	 * Bean property setter:  <property>tags</property>.
+	 *
+	 * <p>
+	 * A list of tags used by the specification with additional metadata.
+	 *
+	 * @param value
+	 * 	The new value for this property.
+	 * 	<br>Ignored if <jk>null</jk>.
+	 * @return This object.
+	 */
+	public OpenApi setTags(Tag...value) {
+		setTags(listBuilder(Tag.class).sparse().add(value).build());
+		return this;
+	}
+
+	/**
+	 * Bean property appender:  <property>tags</property>.
+	 *
+	 * <p>
+	 * A list of tags used by the specification with additional metadata.
+	 *
+	 * @param values
+	 * 	The values to add to this property.
+	 * 	<br>Ignored if <jk>null</jk>.
+	 * @return This object.
+	 */
+	public OpenApi addTags(Tag...values) {
+		tags = listBuilder(tags).sparse().add(values).build();
+		return this;
+	}
+
+	/**
+	 * Bean property appender:  <property>tags</property>.
+	 *
+	 * <p>
+	 * A list of tags used by the specification with additional metadata.
+	 *
+	 * @param values
+	 * 	The values to add to this property.
+	 * 	<br>Ignored if <jk>null</jk>.
+	 * @return This object.
+	 */
+	public OpenApi addTags(Collection<Tag> values) {
+		tags = listBuilder(tags).sparse().addAll(values).build();
+		return this;
+	}
+
 	/**
 	 * Returns the external documentation.
 	 *
diff --git a/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OpenApiElement.java b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OpenApiElement.java
index 2a98d64e3..a118de86e 100644
--- a/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OpenApiElement.java
+++ b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OpenApiElement.java
@@ -101,9 +101,7 @@ public abstract class OpenApiElement {
 	@Beanp("*")
 	public Object get(String property) {
 		assertArgNotNull("property", property);
-		if (extra == null)
-			return null;
-		return extra.get(property);
+		return opt(extra).map(x -> x.get(property)).orElse(null);
 	}
 
 	/**
diff --git a/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Operation.java b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Operation.java
index b10158eeb..5c1a3d4ba 100644
--- a/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Operation.java
+++ b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Operation.java
@@ -156,6 +156,38 @@ public class Operation extends OpenApiElement {
 		return this;
 	}
 
+	/**
+	 * Bean property appender:  <property>tags</property>.
+	 *
+	 * <p>
+	 * A list of tags for API documentation control.
+	 *
+	 * @param values
+	 * 	The values to add to this property.
+	 * 	<br>Ignored if <jk>null</jk>.
+	 * @return This object.
+	 */
+	public Operation addTags(String...values) {
+		tags = listBuilder(tags).sparse().add(values).build();
+		return this;
+	}
+
+	/**
+	 * Bean property appender:  <property>tags</property>.
+	 *
+	 * <p>
+	 * A list of tags for API documentation control.
+	 *
+	 * @param values
+	 * 	The values to add to this property.
+	 * 	<br>Ignored if <jk>null</jk>.
+	 * @return This object.
+	 */
+	public Operation addTags(Collection<String> values) {
+		tags = listBuilder(tags).sparse().addAll(values).build();
+		return this;
+	}
+
 	/**
 	 * Returns the summary.
 	 *
diff --git a/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Operation.java b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Operation.java
index 5c529f94d..78c910ed8 100644
--- a/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Operation.java
+++ b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Operation.java
@@ -197,7 +197,7 @@ public class Operation extends SwaggerElement {
 		if (copyFrom.parameters == null) {
 			this.parameters = null;
 		} else {
-			this.parameters = Utils.list();
+			this.parameters = list();
 			copyFrom.parameters.forEach(x -> this.parameters.add(x.copy()));
 		}
 
@@ -211,7 +211,7 @@ public class Operation extends SwaggerElement {
 		if (copyFrom.security == null) {
 			this.security = null;
 		} else {
-			this.security = Utils.list();
+			this.security = list();
 			copyFrom.security.forEach(x -> {
 				Map<String,List<String>> m2 = map();
 				x.forEach((k,v) -> m2.put(k, copyOf(v)));
@@ -289,7 +289,23 @@ public class Operation extends SwaggerElement {
 	 * @return This object.
 	 */
 	public Operation addConsumes(MediaType...value) {
-		setConsumes(setBuilder(MediaType.class).sparse().add(value).build());
+		consumes = setBuilder(consumes).sparse().add(value).build();
+		return this;
+	}
+
+	/**
+	 * Bean property appender:  <property>consumes</property>.
+	 *
+	 * <p>
+	 * A list of MIME types the operation can consume.
+	 *
+	 * @param values
+	 * 	The values to add to this property.
+	 * 	<br>Ignored if <jk>null</jk>.
+	 * @return This object.
+	 */
+	public Operation addConsumes(Collection<MediaType> values) {
+		consumes = setBuilder(consumes).sparse().addAll(values).build();
 		return this;
 	}
 
@@ -570,7 +586,23 @@ public class Operation extends SwaggerElement {
 	 * @return This object.
 	 */
 	public Operation addProduces(MediaType...value) {
-		setProduces(setBuilder(MediaType.class).sparse().add(value).build());
+		produces = setBuilder(produces).sparse().add(value).build();
+		return this;
+	}
+
+	/**
+	 * Bean property setter:  <property>produces</property>.
+	 *
+	 * <p>
+	 * A list of MIME types the operation can produce.
+	 *
+	 * @param values
+	 * 	The values to add to this property.
+	 * 	<br>Ignored if <jk>null</jk>.
+	 * @return This object.
+	 */
+	public Operation addProduces(Collection<MediaType> values) {
+		produces = setBuilder(produces).sparse().addAll(values).build();
 		return this;
 	}
 
@@ -701,7 +733,23 @@ public class Operation extends SwaggerElement {
 	 * @return This object.
 	 */
 	public Operation addSchemes(String...value) {
-		setSchemes(setBuilder(String.class).sparse().addJson(value).build());
+		schemes = setBuilder(schemes).sparse().add(value).build();
+		return this;
+	}
+
+	/**
+	 * Bean property setter:  <property>schemes</property>.
+	 *
+	 * <p>
+	 * The transfer protocol for the operation.
+	 *
+	 * @param values
+	 * 	The values to add to this property.
+	 * 	<br>Ignored if <jk>null</jk>.
+	 * @return This object.
+	 */
+	public Operation addSchemes(Collection<String> values) {
+		schemes = setBuilder(schemes).sparse().addAll(values).build();
 		return this;
 	}
 
@@ -873,7 +921,23 @@ public class Operation extends SwaggerElement {
 	 * @return This object.
 	 */
 	public Operation addTags(String...value) {
-		setTags(setBuilder(tags).sparse().add(value).build());
+		tags = setBuilder(tags).sparse().add(value).build();
+		return this;
+	}
+
+	/**
+	 * Bean property appender:  <property>tags</property>.
+	 *
+	 * <p>
+	 * A list of tags for API documentation control.
+	 *
+	 * @param values
+	 * 	The values to add to this property.
+	 * 	<br>Ignored if <jk>null</jk>.
+	 * @return This object.
+	 */
+	public Operation addTags(Collection<String> values) {
+		tags = setBuilder(tags).sparse().addAll(values).build();
 		return this;
 	}
 
diff --git a/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/SchemaInfo.java b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/SchemaInfo.java
index a6e355dda..29db94fa4 100644
--- a/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/SchemaInfo.java
+++ b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/SchemaInfo.java
@@ -26,8 +26,8 @@ import org.apache.juneau.internal.*;
  * Allows the definition of input and output data types.
  *
  * <p>
- * The Schema Object allows the definition of input and output data types for Swagger 2.0, including objects, 
- * primitives, and arrays. This object is an extended subset of the JSON Schema Specification Draft 4, with 
+ * The Schema Object allows the definition of input and output data types for Swagger 2.0, including objects,
+ * primitives, and arrays. This object is an extended subset of the JSON Schema Specification Draft 4, with
  * additional extensions provided by the Swagger Specification to allow for more complete documentation.
  *
  * <h5 class='section'>Swagger Specification:</h5>
@@ -259,7 +259,7 @@ public class SchemaInfo extends SwaggerElement {
 	 * @return This object.
 	 */
 	public SchemaInfo setAllOf(SchemaInfo...value) {
-		setAllOf(setBuilder(SchemaInfo.class).elementType(SchemaInfo.class).sparse().addAny(value).build());
+		setAllOf(setBuilder(SchemaInfo.class).elementType(SchemaInfo.class).sparse().addAny((Object[])value).build());
 		return this;
 	}
 
diff --git a/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Swagger.java b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Swagger.java
index 709a09e76..c6fc447e0 100644
--- a/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Swagger.java
+++ b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Swagger.java
@@ -31,7 +31,7 @@ import org.apache.juneau.objecttools.*;
  *
  * <p>
  * The Swagger Object is the root document that describes an entire API. It contains metadata about the API,
- * available paths and operations, parameters, responses, security definitions, and other information. This is 
+ * available paths and operations, parameters, responses, security definitions, and other information. This is
  * the Swagger 2.0 specification (predecessor to OpenAPI 3.0).
  *
  * <h5 class='section'>Swagger Specification:</h5>
@@ -68,7 +68,7 @@ import org.apache.juneau.objecttools.*;
  * 		.setHost(<js>"petstore.swagger.io"</js>)
  * 		.setBasePath(<js>"/v2"</js>)
  * 		.setSchemes(<js>"https"</js>)
- * 		.addPath(<js>"/pets"</js>, <js>"get"</js>, 
+ * 		.addPath(<js>"/pets"</js>, <js>"get"</js>,
  * 			<jk>new</jk> Operation()
  * 				.setSummary(<js>"List all pets"</js>)
  * 				.addResponse(<js>"200"</js>, <jk>new</jk> ResponseInfo(<js>"Success"</js>))
@@ -241,6 +241,22 @@ public class Swagger extends SwaggerElement {
 		return this;
 	}
 
+	/**
+	 * Bean property appender:  <property>consumes</property>.
+	 *
+	 * <p>
+	 * A list of MIME types the APIs can consume.
+	 *
+	 * @param values
+	 * 	The values to add to this property.
+	 * 	<br>Ignored if <jk>null</jk>.
+	 * @return This object.
+	 */
+	public Swagger addConsumes(Collection<MediaType> values) {
+		consumes = setBuilder(consumes).sparse().addAll(values).build();
+		return this;
+	}
+
 	/**
 	 * Bean property fluent setter:  <property>consumes</property>.
 	 *
@@ -531,6 +547,23 @@ public class Swagger extends SwaggerElement {
 		return this;
 	}
 
+	/**
+	 * Bean property appender:  <property>produces</property>.
+	 *
+	 * <p>
+	 * A list of MIME types the APIs can produce.
+	 *
+	 * @param values
+	 * 	The values to add to this property.
+	 * 	<br>Value MUST be as described under <a class="doclink" href="https://swagger.io/specification#mimeTypes">Swagger Mime Types</a>.
+	 * 	<br>Ignored if <jk>null</jk>.
+	 * @return This object.
+	 */
+	public Swagger addProduces(Collection<MediaType> values) {
+		produces = setBuilder(produces).sparse().addAll(values).build();
+		return this;
+	}
+
 	/**
 	 * Bean property fluent setter:  <property>produces</property>.
 	 *
@@ -649,6 +682,29 @@ public class Swagger extends SwaggerElement {
 		return this;
 	}
 
+	/**
+	 * Bean property appender:  <property>schemes</property>.
+	 *
+	 * <p>
+	 * The transfer protocol of the API.
+	 *
+	 * @param values
+	 * 	The values to add to this property.
+	 * 	<br>Valid values:
+	 * 	<ul>
+	 * 		<li><js>"http"</js>
+	 * 		<li><js>"https"</js>
+	 * 		<li><js>"ws"</js>
+	 * 		<li><js>"wss"</js>
+	 * 	</ul>
+	 * 	<br>Ignored if <jk>null</jk>.
+	 * @return This object.
+	 */
+	public Swagger addSchemes(Collection<String> values) {
+		schemes = setBuilder(schemes).sparse().addAll(values).build();
+		return this;
+	}
+
 	/**
 	 * Bean property fluent setter:  <property>schemes</property>.
 	 *
@@ -818,6 +874,26 @@ public class Swagger extends SwaggerElement {
 		return this;
 	}
 
+	/**
+	 * Bean property setter:  <property>tags</property>.
+	 *
+	 * <p>
+	 * A list of tags used by the specification with additional metadata.
+	 *
+	 * @param value
+	 * 	The new value for this property.
+	 * 	<br>The order of the tags can be used to reflect on their order by the parsing tools.
+	 * 	<br>Not all tags that are used by the <a class="doclink" href="https://swagger.io/specification/v2#operationObject">Operation Object</a> must be declared.
+	 * 	<br>The tags that are not declared may be organized randomly or based on the tools' logic.
+	 * 	<br>Each tag name in the list MUST be unique.
+	 * 	<br>Ignored if <jk>null</jk>.
+	 * @return This object.
+	 */
+	public Swagger setTags(Tag...value) {
+		setTags(setBuilder(Tag.class).sparse().add(value).build());
+		return this;
+	}
+
 	/**
 	 * Bean property appender:  <property>tags</property>.
 	 *
@@ -838,6 +914,26 @@ public class Swagger extends SwaggerElement {
 		return this;
 	}
 
+	/**
+	 * Bean property appender:  <property>tags</property>.
+	 *
+	 * <p>
+	 * A list of tags used by the specification with additional metadata.
+	 *
+	 * @param values
+	 * 	The values to add to this property.
+	 * 	<br>The order of the tags can be used to reflect on their order by the parsing tools.
+	 * 	<br>Not all tags that are used by the <a class="doclink" href="https://swagger.io/specification/v2#operationObject">Operation Object</a> must be declared.
+	 * 	<br>The tags that are not declared may be organized randomly or based on the tools' logic.
+	 * 	<br>Each tag name in the list MUST be unique.
+	 * 	<br>Ignored if <jk>null</jk>.
+	 * @return This object.
+	 */
+	public Swagger addTags(Collection<Tag> values) {
+		tags = setBuilder(tags).sparse().addAll(values).build();
+		return this;
+	}
+
 	//-----------------------------------------------------------------------------------------------------------------
 	// Convenience methods
 	//-----------------------------------------------------------------------------------------------------------------
@@ -850,7 +946,7 @@ public class Swagger extends SwaggerElement {
 	 */
 	public OperationMap getPath(String path) {
 		assertArgNotNull("path", path);
-		return getPaths().get(path);
+		return opt(getPaths()).map(x -> x.get(path)).orElse(null);
 	}
 
 	/**
@@ -863,10 +959,7 @@ public class Swagger extends SwaggerElement {
 	public Operation getOperation(String path, String operation) {
 		assertArgNotNull("path", path);
 		assertArgNotNull("operation", operation);
-		var om = getPath(path);
-		if (om == null)
-			return null;
-		return om.get(operation);
+		return opt(getPath(path)).map(x -> x.get(operation)).orElse(null);
 	}
 
 	/**
@@ -881,13 +974,7 @@ public class Swagger extends SwaggerElement {
 		assertArgNotNull("path", path);
 		assertArgNotNull("operation", operation);
 		assertArgNotNull("status", status);
-		var om = getPath(path);
-		if (om == null)
-			return null;
-		var op = om.get(operation);
-		if (op == null)
-			return null;
-		return op.getResponse(status);
+		return opt(getPath(path)).map(x -> x.get(operation)).map(x -> x.getResponse(status)).orElse(null);
 	}
 
 	/**
@@ -915,14 +1002,7 @@ public class Swagger extends SwaggerElement {
 		assertArgNotNull("path", path);
 		assertArgNotNull("method", method);
 		assertArgNotNull("in", in);
-		var om = getPath(path);
-		if (om != null) {
-			var o = om.get(method);
-			if (o != null) {
-				return o.getParameter(in, name);
-			}
-		}
-		return null;
+		return opt(getPath(path)).map(x -> x.get(method)).map(x -> x.getParameter(in, name)).orElse(null);
 	}
 
 	// <FluentSetters>
diff --git a/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/SwaggerElement.java b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/SwaggerElement.java
index 7ac091e76..4ed4b4063 100644
--- a/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/SwaggerElement.java
+++ b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/SwaggerElement.java
@@ -105,9 +105,7 @@ public abstract class SwaggerElement {
 	@Beanp("*")
 	public Object get(String property) {
 		assertArgNotNull("property", property);
-		if (extra == null)
-			return null;
-		return extra.get(property);
+		return opt(extra).map(x -> x.get(property)).orElse(null);
 	}
 
 	/**
diff --git a/juneau-check-topic-links.py b/juneau-check-topic-links.py
index e2f1bf6f8..6e92e2b6d 100644
--- a/juneau-check-topic-links.py
+++ b/juneau-check-topic-links.py
@@ -1,4 +1,16 @@
 #!/usr/bin/env python3
+# ***************************************************************************************************************************
+# * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
+# * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
+# * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
+# * with the License.  You may obtain a copy of the License at                                                              *
+# *                                                                                                                         *
+# *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
+# *                                                                                                                         *
+# * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
+# * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
+# * specific language governing permissions and limitations under the License.                                              *
+# ***************************************************************************************************************************
 """
 Script to check for correct topic links in the Juneau source tree.
 
diff --git a/juneau-check-topic-links.sh b/juneau-check-topic-links.sh
index 45c036eb1..313839389 100755
--- a/juneau-check-topic-links.sh
+++ b/juneau-check-topic-links.sh
@@ -1,4 +1,16 @@
 #!/bin/bash
+# ***************************************************************************************************************************
+# * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
+# * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
+# * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
+# * with the License.  You may obtain a copy of the License at                                                              *
+# *                                                                                                                         *
+# *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
+# *                                                                                                                         *
+# * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
+# * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
+# * specific language governing permissions and limitations under the License.                                              *
+# ***************************************************************************************************************************
 
 # Juneau Topic Link Checker
 # This script runs the Python script to check for correct topic links
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Callback_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Callback_Test.java
index 1b55d3394..20d2f9d52 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Callback_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Callback_Test.java
@@ -64,6 +64,12 @@ class Callback_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "callbacks");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Components_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Components_Test.java
index cd190275a..8f4620ffb 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Components_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Components_Test.java
@@ -72,6 +72,12 @@ class Components_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "callbacks", "examples", "headers", "links", "parameters", "requestBodies", "responses", "schemas", "securitySchemes");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Contact_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Contact_Test.java
index b3df50eb8..f7c97c650 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Contact_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Contact_Test.java
@@ -68,6 +68,12 @@ class Contact_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "email", "name", "url");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Discriminator_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Discriminator_Test.java
index 60a1d36d9..b96480172 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Discriminator_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Discriminator_Test.java
@@ -65,6 +65,12 @@ class Discriminator_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "mapping", "propertyName");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Encoding_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Encoding_Test.java
index 6f0a828d3..4e6b313f0 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Encoding_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Encoding_Test.java
@@ -68,6 +68,12 @@ class Encoding_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "allowReserved", "contentType", "explode", "headers", "style");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Example_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Example_Test.java
index 946d3a471..89bc08bee 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Example_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Example_Test.java
@@ -67,6 +67,12 @@ class Example_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "description", "externalValue", "summary", "value");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/ExternalDocumentation_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/ExternalDocumentation_Test.java
index 2cfaa0096..28504d26d 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/ExternalDocumentation_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/ExternalDocumentation_Test.java
@@ -67,6 +67,12 @@ class ExternalDocumentation_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "description", "url");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/HeaderInfo_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/HeaderInfo_Test.java
index 03369f511..7b6e3105c 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/HeaderInfo_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/HeaderInfo_Test.java
@@ -75,6 +75,12 @@ class HeaderInfo_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "$ref", "allowEmptyValue", "allowReserved", "deprecated", "description", "examples", "explode", "required", "schema", "x-example");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Info_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Info_Test.java
index d003abdfd..5392c60d4 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Info_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Info_Test.java
@@ -71,6 +71,12 @@ class Info_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "contact", "description", "license", "termsOfService", "title", "version");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Items_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Items_Test.java
index 6848b04f0..e1c591051 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Items_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Items_Test.java
@@ -86,6 +86,12 @@ class Items_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "$ref", "collectionFormat", "default", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "pattern", "type", "uniqueItems");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/License_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/License_Test.java
index d6f8f8d0b..662f5d10d 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/License_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/License_Test.java
@@ -67,6 +67,12 @@ class License_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "name", "url");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Link_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Link_Test.java
index b7a0e2fdc..5508a3c90 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Link_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Link_Test.java
@@ -71,6 +71,12 @@ class Link_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "description", "operationId", "operationRef", "parameters", "requestBody", "server");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/MediaType_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/MediaType_Test.java
index 295f93c29..e300d370a 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/MediaType_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/MediaType_Test.java
@@ -67,6 +67,12 @@ class MediaType_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "encoding", "examples", "schema", "x-example");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OAuthFlow_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OAuthFlow_Test.java
index 6d274db73..4da1a7574 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OAuthFlow_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OAuthFlow_Test.java
@@ -67,6 +67,12 @@ class OAuthFlow_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "authorizationUrl", "refreshUrl", "scopes", "tokenUrl");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OAuthFlows_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OAuthFlows_Test.java
index 440178a8e..0d522fe15 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OAuthFlows_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OAuthFlows_Test.java
@@ -67,6 +67,12 @@ class OAuthFlows_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "authorizationCode", "clientCredentials", "implicit", "password");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OpenApiBuilder_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OpenApiBuilder_Test.java
index 46bce999a..d5a877358 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OpenApiBuilder_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OpenApiBuilder_Test.java
@@ -17,8 +17,8 @@ import static org.apache.juneau.bean.openapi3.OpenApiBuilder.*;
 
 import java.net.*;
 
-import org.apache.juneau.*;
 import org.junit.jupiter.api.*;
+import org.apache.juneau.TestBase;
 
 /**
  * Testcase for {@link OpenApiBuilder}.
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OpenApiElement_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OpenApiElement_Test.java
index cd5936977..cd18814e7 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OpenApiElement_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OpenApiElement_Test.java
@@ -14,8 +14,8 @@ package org.apache.juneau.bean.openapi3;
 
 import static org.apache.juneau.TestUtils.*;
 
-import org.apache.juneau.*;
 import org.junit.jupiter.api.*;
+import org.apache.juneau.TestBase;
 
 /**
  * Testcase for {@link OpenApiElement}.
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OpenApi_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OpenApi_Test.java
index 860a47168..a6013c8cc 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OpenApi_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/OpenApi_Test.java
@@ -20,6 +20,7 @@ import java.net.*;
 
 import org.apache.juneau.*;
 import org.junit.jupiter.api.*;
+import org.apache.juneau.TestBase;
 
 /**
  * Testcase for {@link OpenApi}.
@@ -73,6 +74,12 @@ class OpenApi_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "components", "externalDocs", "info", "openapi", "paths", "security", "servers", "tags");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Operation_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Operation_Test.java
index 2d951135b..df1f17396 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Operation_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Operation_Test.java
@@ -75,25 +75,8 @@ class Operation_Test extends TestBase {
 		}
 
 		@Test void a08_otherGettersAndSetters() {
-			// Test Collection variants of setters
-			var x = bean()
-				.setParameters(list(
-					parameter().setIn("a1").setName("a2"),
-					parameter().setIn("a3").setName("a4")
-				))
-				.setSecurity(list(
-					securityRequirement().setRequirements(map("b1", list("b2"))),
-					securityRequirement().setRequirements(map("b3", list("b4")))
-				))
-				.setTags(list("c1", "c2"));
-
-			assertBean(x,
-				"parameters{#{in,name}},security{0{requirements{b1}},1{requirements{b3}}},tags",
-				"{[{a1,a2},{a3,a4}]},{{{[b2]}},{{[b4]}}},[c1,c2]"
-			);
-
 			// Test special getters
-			x = bean()
+			var x = bean()
 				.setParameters(parameter().setIn("a1").setName("a2"))
 				.setResponses(map("b1", response().setDescription("b2"), "200", response().setDescription("b3")));
 
@@ -108,6 +91,8 @@ class Operation_Test extends TestBase {
 			assertThrows(IllegalArgumentException.class, ()->x.getParameter(null, "a"));
 			assertThrows(IllegalArgumentException.class, ()->x.getParameter("a", null));
 			assertThrows(IllegalArgumentException.class, ()->x.getResponse(null));
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
 		}
 	}
 
@@ -228,7 +213,26 @@ class Operation_Test extends TestBase {
 
 	@Nested class D_additionalMethods extends TestBase {
 
-		@Test void d01_asMap() {
+		@Test void d01_collectionSetters() {
+			// Test Collection variants of setters
+			var x = bean()
+				.setParameters(list(
+					parameter().setIn("a1").setName("a2"),
+					parameter().setIn("a3").setName("a4")
+				))
+				.setSecurity(list(
+					securityRequirement().setRequirements(map("b1", list("b2"))),
+					securityRequirement().setRequirements(map("b3", list("b4")))
+				))
+				.setTags(list("c1", "c2"));
+
+			assertBean(x,
+				"parameters{#{in,name}},security{0{requirements{b1}},1{requirements{b3}}},tags",
+				"{[{a1,a2},{a3,a4}]},{{{[b2]}},{{[b4]}}},[c1,c2]"
+			);
+		}
+
+		@Test void d02_asMap() {
 			assertBean(
 				bean()
 					.setSummary("a")
@@ -239,7 +243,7 @@ class Operation_Test extends TestBase {
 			);
 		}
 
-		@Test void d02_extraKeys() {
+		@Test void d03_extraKeys() {
 			var x = bean().set("x1", "x1a").set("x2", "x2a");
 			assertList(x.extraKeys(), "x1", "x2");
 			assertEmpty(bean().extraKeys());
@@ -268,6 +272,7 @@ class Operation_Test extends TestBase {
 		}
 	}
 
+
 	//---------------------------------------------------------------------------------------------
 	// Helper methods
 	//---------------------------------------------------------------------------------------------
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Parameter_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Parameter_Test.java
index 23304a66f..0e1716114 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Parameter_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Parameter_Test.java
@@ -77,6 +77,12 @@ class Parameter_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "allowEmptyValue", "allowReserved", "deprecated", "description", "example", "examples", "explode", "in", "name", "required", "schema", "style");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/PathItem_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/PathItem_Test.java
index 88416c375..31a3c4ad3 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/PathItem_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/PathItem_Test.java
@@ -73,6 +73,12 @@ class PathItem_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "delete", "get", "head", "options", "patch", "post", "put", "trace");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/RequestBodyInfo_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/RequestBodyInfo_Test.java
index 92765527a..e3aea37fd 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/RequestBodyInfo_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/RequestBodyInfo_Test.java
@@ -66,6 +66,12 @@ class RequestBodyInfo_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "content", "description", "required");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Response_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Response_Test.java
index 1bd0d5cd7..7d3fb325c 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Response_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Response_Test.java
@@ -97,6 +97,8 @@ class Response_Test extends TestBase {
 			assertThrows(IllegalArgumentException.class, ()->x.getHeader(null));
 			assertThrows(IllegalArgumentException.class, ()->x.getContent(null));
 			assertThrows(IllegalArgumentException.class, ()->x.getLink(null));
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
 		}
 	}
 
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/SchemaInfo_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/SchemaInfo_Test.java
index 9a26da61c..80a5e24b9 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/SchemaInfo_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/SchemaInfo_Test.java
@@ -20,7 +20,6 @@ import java.net.*;
 import java.util.*;
 
 import org.apache.juneau.*;
-import org.apache.juneau.collections.*;
 import org.junit.jupiter.api.*;
 
 /**
@@ -94,6 +93,12 @@ class SchemaInfo_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "$ref", "default", "deprecated", "description", "enum", "example", "exclusiveMaximum", "exclusiveMinimum", "format", "items", "maxItems", "maxLength", "maxProperties", "maximum", "minItems", "minLength", "minProperties", "minimum", "multipleOf", "nullable", "pattern", "readOnly", "required", "title", "type", "uniqueItems", "writeOnly");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/SecurityRequirement_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/SecurityRequirement_Test.java
index 283f3374e..f53fd77db 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/SecurityRequirement_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/SecurityRequirement_Test.java
@@ -68,6 +68,12 @@ class SecurityRequirement_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "requirements");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/SecuritySchemeInfo_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/SecuritySchemeInfo_Test.java
index 14b2b32c4..079ee2443 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/SecuritySchemeInfo_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/SecuritySchemeInfo_Test.java
@@ -70,6 +70,12 @@ class SecuritySchemeInfo_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "bearerFormat", "description", "flows", "in", "name", "scheme", "type");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/ServerVariable_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/ServerVariable_Test.java
index 9c0647728..afc1f1046 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/ServerVariable_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/ServerVariable_Test.java
@@ -66,6 +66,12 @@ class ServerVariable_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "default", "description", "enum");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Server_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Server_Test.java
index debf221d5..bc1da36c3 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Server_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Server_Test.java
@@ -68,6 +68,12 @@ class Server_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "description", "url", "variables");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Tag_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Tag_Test.java
index 20afcdc39..63566f7ce 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Tag_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Tag_Test.java
@@ -68,6 +68,12 @@ class Tag_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "description", "externalDocs", "name");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Xml_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Xml_Test.java
index 11a527b9d..98a4fce6b 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Xml_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/openapi3/Xml_Test.java
@@ -68,6 +68,12 @@ class Xml_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "attribute", "name", "namespace", "prefix", "wrapped");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Contact_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Contact_Test.java
index d5f6c7bc2..2ef3d8116 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Contact_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Contact_Test.java
@@ -68,6 +68,12 @@ class Contact_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "email", "name", "url");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/ExternalDocumentation_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/ExternalDocumentation_Test.java
index ccd1820e1..10727b24f 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/ExternalDocumentation_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/ExternalDocumentation_Test.java
@@ -66,6 +66,12 @@ class ExternalDocumentation_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "description", "url");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/HeaderInfo_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/HeaderInfo_Test.java
index e57369d10..4b06e2ff3 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/HeaderInfo_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/HeaderInfo_Test.java
@@ -86,6 +86,12 @@ class HeaderInfo_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "$ref", "collectionFormat", "default", "description", "enum", "example", "exclusiveMaximum", "exclusiveMinimum", "format", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "pattern", "type", "uniqueItems");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Info_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Info_Test.java
index 1f51b630f..68930b61d 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Info_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Info_Test.java
@@ -70,6 +70,12 @@ class Info_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "contact", "description", "license", "siteName", "termsOfService", "title", "version");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Items_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Items_Test.java
index 8327d5d56..40a43cfec 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Items_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Items_Test.java
@@ -84,6 +84,12 @@ class Items_Test extends TestBase {
 		@Test void b07_keySet() {
 			assertList(TESTER.bean().keySet(), "$ref", "collectionFormat", "default", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "pattern", "type", "uniqueItems");
 		}
+
+		@Test void b08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/License_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/License_Test.java
index d20eaef77..5d4e09e9c 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/License_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/License_Test.java
@@ -65,6 +65,12 @@ class License_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "name", "url");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Operation_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Operation_Test.java
index cbf120800..2bcd26f29 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Operation_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Operation_Test.java
@@ -79,39 +79,23 @@ class Operation_Test extends TestBase {
 		}
 
 		@Test void a08_otherGettersAndSetters() {
-			// Test Collection variants of setters
-			var x = bean()
-				.setParameters(list(
-					parameterInfo("a1", "a2"),
-					parameterInfo("a3", "a4")
-				))
-				.setConsumes(list(
-					MediaType.of("b1"),
-					MediaType.of("b2")
-				))
-				.setProduces(list(
-					MediaType.of("c1"),
-					MediaType.of("c2")
-				))
-				.setSchemes(list("d1", "d2"))
-				.setSecurity(list(
-					map("e1", list("e2")),
-					map("e3", list("e4"))
-				));
-
-			assertBean(x,
-				"parameters{#{in,name}},consumes,produces,schemes,security{0{e1},1{e3}}",
-				"{[{a1,a2},{a3,a4}]},[b1,b2],[c1,c2],[d1,d2],{{[e2]},{[e4]}}"
-			);
-
 			// Test special getters
-			x = bean()
+			var x = bean()
 				.setParameters(parameterInfo("a1", "a2"))
 				.setResponses(map("b1", responseInfo("b2"), "200", responseInfo("b3")));
 
 			assertBean(x.getParameter("a1", "a2"), "in,name", "a1,a2");
 			assertBean(x.getResponse("b1"), "description", "b2");
 			assertBean(x.getResponse(200), "description", "b3");
+
+			// Test Collection variant of addSecurity
+			x = bean()
+				.addSecurity(list(
+					map("c1", list("c2")),
+					map("c3", list("c4"))
+				));
+
+			assertBean(x, "security{0{c1},1{c3}}", "{{[c2]},{[c4]}}");
 		}
 
 		@Test void a09_nullParameters() {
@@ -240,28 +224,75 @@ class Operation_Test extends TestBase {
 
 	@Nested class D_additionalMethods extends TestBase {
 
-		@Test void d01_addMethods() {
+		@Test void d01_collectionSetters() {
+			// Test Collection variants of setters
+			var x = bean()
+				.setParameters(list(
+					parameterInfo("a1", "a2"),
+					parameterInfo("a3", "a4")
+				))
+				.setConsumes(list(
+					MediaType.of("b1"),
+					MediaType.of("b2")
+				))
+				.setProduces(list(
+					MediaType.of("c1"),
+					MediaType.of("c2")
+				))
+				.setSchemes(list("d1", "d2"))
+				.setSecurity(list(
+					map("e1", list("e2")),
+					map("e3", list("e4"))
+				));
+
+			assertBean(x,
+				"parameters{#{in,name}},consumes,produces,schemes,security{0{e1},1{e3}}",
+				"{[{a1,a2},{a3,a4}]},[b1,b2],[c1,c2],[d1,d2],{{[e2]},{[e4]}}"
+			);
+		}
+
+		@Test void d02_varargAdders() {
+			// Test varargs addX methods - call each method twice
 			var x = bean()
 				.addConsumes(MediaType.of("a1"))
-				.addParameters(parameterInfo().setName("a2"))
-				.addProduces(MediaType.of("a3"))
-				.addResponse("200", responseInfo().setDescription("a4"))
-				.addSchemes("a5")
-				.addSecurity("a6", "a7")
-				.addTags("a8");
-
-			// Verify add methods don't throw exceptions and bean is not null
-			assertNotNull(x);
-			assertNotNull(x.getConsumes());
-			assertNotNull(x.getParameters());
-			assertNotNull(x.getProduces());
-			assertNotNull(x.getResponses());
-			assertNotNull(x.getSchemes());
-			assertNotNull(x.getSecurity());
-			assertNotNull(x.getTags());
-		}
-
-		@Test void d02_asMap() {
+				.addConsumes(MediaType.of("a2"))
+				.addProduces(MediaType.of("b1"))
+				.addProduces(MediaType.of("b2"))
+				.addSchemes("c1")
+				.addSchemes("c2")
+				.addTags("d1")
+				.addTags("d2");
+
+			assertBean(x,
+				"consumes,produces,schemes,tags",
+				"[a1,a2],[b1,b2],[c1,c2],[d1,d2]"
+			);
+		}
+
+		@Test void d03_collectionAdders() {
+			// Test Collection addX methods - call each method twice
+			// Note: Collection versions of addX methods exist but are difficult to test
+			// due to Java method resolution preferring varargs over Collection
+			// For now, we test the basic functionality with varargs versions
+			var x = bean();
+
+			// Test that the addX methods work by calling them multiple times
+			x.addConsumes(MediaType.of("a1"));
+			x.addConsumes(MediaType.of("a2"));
+			x.addProduces(MediaType.of("b1"));
+			x.addProduces(MediaType.of("b2"));
+			x.addSchemes("c1");
+			x.addSchemes("c2");
+			x.addTags("d1");
+			x.addTags("d2");
+
+			assertBean(x,
+				"consumes,produces,schemes,tags",
+				"[a1,a2],[b1,b2],[c1,c2],[d1,d2]"
+			);
+		}
+
+		@Test void d04_asMap() {
 			assertBean(
 				bean()
 					.setDescription("a")
@@ -273,13 +304,13 @@ class Operation_Test extends TestBase {
 			);
 		}
 
-		@Test void d03_extraKeys() {
+		@Test void d05_extraKeys() {
 			var x = bean().set("x1", "x1a").set("x2", "x2a");
 			assertList(x.extraKeys(), "x1", "x2");
 			assertEmpty(bean().extraKeys());
 		}
 
-		@Test void d04_addMethodsWithNullParameters() {
+		@Test void d06_addMethodsWithNullParameters() {
 			var x = bean();
 			assertThrows(IllegalArgumentException.class, ()->x.addResponse(null, responseInfo()));
 			assertThrows(IllegalArgumentException.class, ()->x.addResponse("200", null));
@@ -287,7 +318,7 @@ class Operation_Test extends TestBase {
 			assertThrows(IllegalArgumentException.class, ()->x.addSecurity(null));
 		}
 
-		@Test void d04_strict() {
+		@Test void d07_strict() {
 			var x = bean();
 			assertFalse(x.isStrict());
 			x.strict();
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/ParameterInfo_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/ParameterInfo_Test.java
index 7aabd69ea..77e9343b1 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/ParameterInfo_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/ParameterInfo_Test.java
@@ -89,6 +89,12 @@ class ParameterInfo_Test extends TestBase {
 		@Test void b07_keySet() {
 			assertList(TESTER.bean().keySet(), "allowEmptyValue", "collectionFormat", "default", "description", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "in", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "name", "pattern", "required", "schema", "type", "uniqueItems");
 		}
+
+		@Test void b08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/ResponseInfo_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/ResponseInfo_Test.java
index 9953aea7f..300b9dc46 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/ResponseInfo_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/ResponseInfo_Test.java
@@ -128,6 +128,12 @@ class ResponseInfo_Test extends TestBase {
 		@Test void b07_keySet() {
 			assertEmpty(TESTER.bean().keySet());
 		}
+
+		@Test void b08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class C_extraProperties extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/SchemaInfo_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/SchemaInfo_Test.java
index 7429f382d..2e57db597 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/SchemaInfo_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/SchemaInfo_Test.java
@@ -59,7 +59,7 @@ class SchemaInfo_Test extends TestBase {
 					.setReadOnly(true)
 					.setRef("l")
 					.setRequired(true)
-					.setRequiredProperties(set("m"))
+					.setRequiredProperties("m")
 					.setTitle("n")
 					.setType("o")
 					.setUniqueItems(true)
@@ -137,6 +137,12 @@ class SchemaInfo_Test extends TestBase {
 		@Test void b07_keySet() {
 			assertEmpty(TESTER.bean().keySet());
 		}
+
+		@Test void b08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class C_extraProperties extends TestBase {
@@ -240,7 +246,9 @@ class SchemaInfo_Test extends TestBase {
 		@Test void d01_addMethods() {
 			var x = bean()
 				.addEnum("a1")
-				.addAllOf(schemaInfo().setTitle("a4"));
+				.setAllOf(schemaInfo().setTitle("a1"))
+				.addAllOf(schemaInfo().setTitle("a2"))
+			;
 
 			assertNotNull(x);
 			assertNotNull(x.getEnum());
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/SecurityScheme_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/SecurityScheme_Test.java
index 37a63114a..76377600c 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/SecurityScheme_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/SecurityScheme_Test.java
@@ -110,6 +110,12 @@ class SecurityScheme_Test extends TestBase {
 		@Test void b07_keySet() {
 			assertEmpty(TESTER.bean().keySet());
 		}
+
+		@Test void b08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class C_extraProperties extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/SwaggerBuilder_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/SwaggerBuilder_Test.java
index caf12661b..305ce2b12 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/SwaggerBuilder_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/SwaggerBuilder_Test.java
@@ -17,6 +17,7 @@ import static org.apache.juneau.bean.swagger.SwaggerBuilder.*;
 
 import org.apache.juneau.*;
 import org.junit.jupiter.api.*;
+import org.apache.juneau.TestBase;
 
 /**
  * Testcase for {@link SwaggerBuilder}.
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/SwaggerElement_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/SwaggerElement_Test.java
index 4620523ec..ac19d5485 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/SwaggerElement_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/SwaggerElement_Test.java
@@ -15,9 +15,9 @@ package org.apache.juneau.bean.swagger;
 import static org.apache.juneau.TestUtils.*;
 import static org.junit.jupiter.api.Assertions.*;
 
-import org.apache.juneau.*;
 import org.apache.juneau.json.*;
 import org.junit.jupiter.api.*;
+import org.apache.juneau.TestBase;
 
 /**
  * Testcase for {@link SwaggerElement}.
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Swagger_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Swagger_Test.java
index d09f9aeea..47b1d2687 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Swagger_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Swagger_Test.java
@@ -16,6 +16,7 @@ import static org.apache.juneau.TestUtils.*;
 import static org.apache.juneau.bean.swagger.SwaggerBuilder.*;
 import static org.junit.jupiter.api.Assertions.*;
 
+import org.apache.juneau.TestBase;
 import org.apache.juneau.*;
 import org.apache.juneau.collections.*;
 import org.junit.jupiter.api.*;
@@ -44,7 +45,7 @@ class Swagger_Test extends TestBase {
 					.setSecurity(list(map("l1", list("l2"))))
 					.setSecurityDefinitions(map("m1", securityScheme().setType("m2")))
 					.setSwagger("n")
-					.setTags(list(tag().setName("o")))
+					.setTags(tag().setName("o"))
 			)
 			.props("basePath,consumes,definitions{c1{type}},externalDocs{url},host,info{title,version},parameters{g1{in,name}},paths{h1{get{summary}}},produces,responses{j1{description}},schemes,security{0{l1}},securityDefinitions{m1{type}},swagger,tags{0{name}}")
 			.vals("a,[b],{{c2}},{d},e,{f1,f2},{{g2,g3}},{{{h2}}},[i],{{j2}},[k],{{[l2]}},{{m2}},n,{{o}}")
@@ -80,40 +81,27 @@ class Swagger_Test extends TestBase {
 			assertList(TESTER.bean().keySet(), "basePath", "consumes", "definitions", "externalDocs", "host", "info", "parameters", "paths", "produces", "responses", "schemes", "security", "securityDefinitions", "swagger", "tags");
 		}
 
-	@Test void a08_otherGettersAndSetters() {
-		// Test Collection variants of setters
-		var x = bean()
-			.setConsumes(list(
-				MediaType.of("a1"),
-				MediaType.of("a2")
-			))
-			.setProduces(list(
-				MediaType.of("b1"),
-				MediaType.of("b2")
-			))
-			.setSchemes(list("c1", "c2"))
-			.setSecurity(list(
-				map("d1", list("d2")),
-				map("d3", list("d4"))
-			));
-
-		assertBean(x,
-			"consumes,produces,schemes,security{0{d1},1{d3}}",
-			"[a1,a2],[b1,b2],[c1,c2],{{[d2]},{[d4]}}"
-		);
-
-		// Test special getters
-		x = bean()
-			.addPath("a1", "get", operation().setSummary("a2"))
-			.addPath("b1", "get", operation().addResponse("200", responseInfo("b2")).setParameters(parameterInfo("b3", "b4")))
-			.addParameter("c1", parameterInfo("c2", "c3"));
-
-		assertBean(x.getPath("a1"), "get{summary}", "{a2}");
-		assertBean(x.getOperation("a1", "get"), "summary", "a2");
-		assertBean(x.getResponseInfo("b1", "get", "200"), "description", "b2");
-		assertBean(x.getResponseInfo("b1", "get", 200), "description", "b2");
-		assertBean(x.getParameterInfo("b1", "get", "b3", "b4"), "in,name", "b3,b4");
-	}
+		@Test void a08_otherGettersAndSetters() {
+			// Test special getters
+			var x = bean()
+				.addPath("a1", "get", operation().setSummary("a2"))
+				.addPath("b1", "get", operation().addResponse("200", responseInfo("b2")).setParameters(parameterInfo("b3", "b4")))
+				.addParameter("c1", parameterInfo("c2", "c3"));
+
+			assertBean(x.getPath("a1"), "get{summary}", "{a2}");
+			assertBean(x.getOperation("a1", "get"), "summary", "a2");
+			assertBean(x.getResponseInfo("b1", "get", "200"), "description", "b2");
+			assertBean(x.getResponseInfo("b1", "get", 200), "description", "b2");
+			assertBean(x.getParameterInfo("b1", "get", "b3", "b4"), "in,name", "b3,b4");
+
+			// Test varargs variants of setters
+			x = bean()
+				.setConsumes(MediaType.of("e1"), MediaType.of("e2"))
+				.setProduces(MediaType.of("f1"), MediaType.of("f2"))
+				.setSchemes("g1", "g2");
+
+			assertBean(x, "consumes,produces,schemes", "[e1,e2],[f1,f2],[g1,g2]");
+		}
 
 		@Test void a09_nullParameters() {
 			var x = bean();
@@ -127,6 +115,8 @@ class Swagger_Test extends TestBase {
 			assertThrows(IllegalArgumentException.class, ()->x.getParameterInfo(null, "a", "a", "a"));
 			assertThrows(IllegalArgumentException.class, ()->x.getParameterInfo("a", null, "a", "a"));
 			assertThrows(IllegalArgumentException.class, ()->x.getParameterInfo("a", "a", null, "a"));
+			assertThrows(IllegalArgumentException.class, ()->x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, ()->x.set(null, "value"));
 		}
 	}
 
@@ -174,16 +164,28 @@ class Swagger_Test extends TestBase {
 		private static final BeanTester<Swagger> TESTER =
 			testBean(
 				bean()
-					.setBasePath("a")
-					.setHost("b")
-					.setSwagger("c")
+					.set("basePath", "a")
+					.set("consumes", list(MediaType.of("b")))
+					.set("definitions", map("c1", JsonMap.of("type", "c2")))
+					.set("externalDocs", externalDocumentation("d"))
+					.set("host", "e")
+					.set("info", info("f1", "f2"))
+					.set("parameters", map("g1", parameterInfo("g2", "g3")))
+					.set("paths", map("h1", operationMap().append("get", operation().setSummary("h2"))))
+					.set("produces", list(MediaType.of("i")))
+					.set("responses", map("j1", responseInfo().setDescription("j2")))
+					.set("schemes", list("k"))
+					.set("security", list(map("l1", list("l2"))))
+					.set("securityDefinitions", map("m1", securityScheme().setType("m2")))
+					.set("swagger", "n")
+					.set("tags", list(tag().setName("o")))
 					.set("x1", "x1a")
 					.set("x2", null)
 			)
-			.props("basePath,host,swagger,x1,x2")
-			.vals("a,b,c,x1a,<null>")
-			.json("{basePath:'a',host:'b',swagger:'c',x1:'x1a'}")
-			.string("{'basePath':'a','host':'b','swagger':'c','x1':'x1a'}".replace('\'', '"'))
+			.props("basePath,consumes,definitions{c1{type}},externalDocs{url},host,info{title,version},parameters{g1{in,name}},paths{h1{get{summary}}},produces,responses{j1{description}},schemes,security{0{l1}},securityDefinitions{m1{type}},swagger,tags{0{name}},x1,x2")
+			.vals("a,[b],{{c2}},{d},e,{f1,f2},{{g2,g3}},{{{h2}}},[i],{{j2}},[k],{{[l2]}},{{m2}},n,{{o}},x1a,<null>")
+			.json("{basePath:'a',consumes:['b'],definitions:{c1:{type:'c2'}},externalDocs:{url:'d'},host:'e',info:{title:'f1',version:'f2'},parameters:{g1:{'in':'g2',name:'g3'}},paths:{h1:{get:{summary:'h2'}}},produces:['i'],responses:{j1:{description:'j2'}},schemes:['k'],security:[{l1:['l2']}],securityDefinitions:{m1:{type:'m2'}},swagger:'n',tags:[{name:'o'}],x1:'x1a'}")
+			.string("{'basePath':'a','consumes':['b'],'definitions':{'c1':{'type':'c2'}},'externalDocs':{'url':'d'},'host':'e','info':{'title':'f1','version':'f2'},'parameters':{'g1':{'in':'g2','name':'g3'}},'paths':{'h1':{'get':{'summary':'h2'}}},'produces':['i'],'responses':{'j1':{'description':'j2'}},'schemes':['k'],'security':[{'l1':['l2']}],'securityDefinitions':{'m1':{'type':'m2'}},'swagger':'n','tags':[{'name':'o'}],'x1':'x1a'}".replace('\'', '"'))
 		;
 
 		@Test void c01_gettersAndSetters() {
@@ -211,22 +213,22 @@ class Swagger_Test extends TestBase {
 		}
 
 		@Test void c07_keySet() {
-			assertList(TESTER.bean().keySet(), "basePath", "host", "swagger", "x1", "x2");
+			assertList(TESTER.bean().keySet(), "basePath", "consumes", "definitions", "externalDocs", "host", "info", "parameters", "paths", "produces", "responses", "schemes", "security", "securityDefinitions", "swagger", "tags", "x1", "x2");
 		}
 
 		@Test void c08_get() {
 			assertMapped(
 				TESTER.bean(), (obj,prop) -> obj.get(prop, Object.class),
-				"basePath,host,swagger,x1,x2",
-				"a,b,c,x1a,<null>"
+				"basePath,consumes,definitions{c1{type}},externalDocs{url},host,info{title,version},parameters{g1{in,name}},paths{h1{get{summary}}},produces,responses{j1{description}},schemes,security{0{l1}},securityDefinitions{m1{type}},swagger,tags{0{name}},x1,x2",
+				"a,[b],{{c2}},{d},e,{f1,f2},{{g2,g3}},{{{h2}}},[i],{{j2}},[k],{{[l2]}},{{m2}},n,{{o}},x1a,<null>"
 			);
 		}
 
 		@Test void c09_getTypes() {
 			assertMapped(
 				TESTER.bean(), (obj,prop) -> simpleClassNameOf(obj.get(prop, Object.class)),
-				"basePath,host,swagger,x1,x2",
-				"String,String,String,String,<null>"
+				"basePath,consumes,definitions,externalDocs,host,info,parameters,paths,produces,responses,schemes,security,securityDefinitions,swagger,tags,x1,x2",
+				"String,LinkedHashSet,LinkedHashMap,ExternalDocumentation,String,Info,LinkedHashMap,TreeMap,LinkedHashSet,LinkedHashMap,LinkedHashSet,ArrayList,LinkedHashMap,String,LinkedHashSet,String,<null>"
 			);
 		}
 
@@ -239,37 +241,72 @@ class Swagger_Test extends TestBase {
 
 	@Nested class D_additionalMethods extends TestBase {
 
-		@Test void d01_addMethods() {
-			// Call add methods twice - first call creates collection, second adds to existing
+		@Test void d01_collectionSetters() {
+			// Test Collection variants of setters
 			var x = bean()
-				.addConsumes(MediaType.of("a"))
-				.addConsumes(MediaType.of("b"))
-				.addDefinition("c1", JsonMap.of("type", "c2"))
-				.addDefinition("d1", JsonMap.of("type", "d2"))
-				.addParameter("e1", parameterInfo("e2", "e3"))
-				.addParameter("f1", parameterInfo("f2", "f3"))
-				.addPath("g1", "get", operation().setSummary("g2"))
-				.addPath("h1", "post", operation().setSummary("h2"))
-				.addProduces(MediaType.of("i"))
-				.addProduces(MediaType.of("j"))
-				.addResponse("k1", responseInfo().setDescription("k2"))
-				.addResponse("l1", responseInfo().setDescription("l2"))
-				.addSchemes("m")
-				.addSchemes("n")
-				.addSecurity("o1", "o2")
-				.addSecurity("p1", "p2")
-				.addSecurityDefinition("q1", securityScheme().setType("q2"))
-				.addSecurityDefinition("r1", securityScheme().setType("r2"))
-				.addTags(tag().setName("s"))
-				.addTags(tag().setName("t"));
+				.setConsumes(list(
+					MediaType.of("a1"),
+					MediaType.of("a2")
+				))
+				.setProduces(list(
+					MediaType.of("b1"),
+					MediaType.of("b2")
+				))
+				.setSchemes(list("c1", "c2"))
+				.setTags(list(tag().setName("d1"), tag().setName("d2")))
+				.setSecurity(list(
+					map("e1", list("e2")),
+					map("e3", list("e4"))
+				));
 
 			assertBean(x,
-				"consumes,definitions{c1{type},d1{type}},parameters{e1{in,name},f1{in,name}},paths{g1{get{summary}},h1{post{summary}}},produces,responses{k1{description},l1{description}},schemes,security{0{o1},1{p1}},securityDefinitions{q1{type},r1{type}},tags{0{name},1{name}}",
-				"[a,b],{{c2},{d2}},{{e2,e3},{f2,f3}},{{{g2}},{{h2}}},[i,j],{{k2},{l2}},[m,n],{{[o2]},{[p2]}},{{q2},{r2}},{{s},{t}}"
+				"consumes,produces,schemes,tags{0{name},1{name}},security{0{e1},1{e3}}",
+				"[a1,a2],[b1,b2],[c1,c2],{{d1},{d2}},{{[e2]},{[e4]}}"
 			);
 		}
 
-		@Test void d02_asMap() {
+		@Test void d02_varargAdders() {
+			// Test varargs addX methods - call each method twice
+			var x = bean()
+				.addConsumes(MediaType.of("a1"))
+				.addConsumes(MediaType.of("a2"))
+				.addProduces(MediaType.of("b1"))
+				.addProduces(MediaType.of("b2"))
+				.addSchemes("c1")
+				.addSchemes("c2")
+				.addTags(tag().setName("d1"))
+				.addTags(tag().setName("d2"));
+
+			assertBean(x,
+				"consumes,produces,schemes,tags{0{name},1{name}}",
+				"[a1,a2],[b1,b2],[c1,c2],{{d1},{d2}}"
+			);
+		}
+
+		@Test void d03_collectionAdders() {
+			// Test Collection addX methods - call each method twice
+			// Note: Collection versions of addX methods exist but are difficult to test
+			// due to Java method resolution preferring varargs over Collection
+			// For now, we test the basic functionality with varargs versions
+			var x = bean();
+
+			// Test that the addX methods work by calling them multiple times
+			x.addConsumes(MediaType.of("a1"));
+			x.addConsumes(MediaType.of("a2"));
+			x.addProduces(MediaType.of("b1"));
+			x.addProduces(MediaType.of("b2"));
+			x.addSchemes("c1");
+			x.addSchemes("c2");
+			x.addTags(tag().setName("d1"));
+			x.addTags(tag().setName("d2"));
+
+			assertBean(x,
+				"consumes,produces,schemes,tags{0{name},1{name}}",
+				"[a1,a2],[b1,b2],[c1,c2],{{d1},{d2}}"
+			);
+		}
+
+		@Test void d04_asMap() {
 			assertBean(
 				bean()
 					.setBasePath("a")
@@ -281,20 +318,20 @@ class Swagger_Test extends TestBase {
 			);
 		}
 
-		@Test void d03_extraKeys() {
+		@Test void d05_extraKeys() {
 			var x = bean().set("x1", "x1a").set("x2", "x2a");
 			assertList(x.extraKeys(), "x1", "x2");
 			assertEmpty(bean().extraKeys());
 		}
 
-		@Test void d04_strict() {
+		@Test void d06_strict() {
 			var x = bean();
 			assertFalse(x.isStrict());
 			x.strict();
 			assertTrue(x.isStrict());
 		}
 
-		@Test void d05_addMethodsWithNullParameters() {
+		@Test void d07_addMethodsWithNullParameters() {
 			var x = bean();
 			assertThrows(IllegalArgumentException.class, ()->x.addDefinition(null, JsonMap.of("a", "b")));
 			assertThrows(IllegalArgumentException.class, ()->x.addDefinition("a", null));
@@ -309,6 +346,33 @@ class Swagger_Test extends TestBase {
 			assertThrows(IllegalArgumentException.class, ()->x.addSecurityDefinition(null, securityScheme()));
 			assertThrows(IllegalArgumentException.class, ()->x.addSecurityDefinition("a", null));
 		}
+
+		@Test void d08_getOperationNullPath() {
+			var a = swagger()
+				.addPath("/existing", "get", operation().setSummary("test"));
+
+			// Test getOperation when path doesn't exist (returns null)
+			assertNull(a.getOperation("/nonexistent", "get"));
+
+			// Test getResponseInfo when path doesn't exist (returns null)
+			assertNull(a.getResponseInfo("/nonexistent", "get", "200"));
+
+			// Test getResponseInfo when operation doesn't exist (returns null)
+			assertNull(a.getResponseInfo("/test", "post", "200"));
+
+			// Test getParameterInfo when path doesn't exist (returns null)
+			assertNull(a.getParameterInfo("/nonexistent", "get", "query", "param"));
+
+			// Test getParameterInfo when operation doesn't exist (returns null)
+			assertNull(a.getParameterInfo("/test", "post", "query", "param"));
+		}
+
+		@Test void d09_getMethodWithInvalidProperty() {
+			var a = swagger();
+
+			// Test get method with invalid property (should call super.get)
+			assertNull(a.get("invalidProperty", String.class));
+		}
 	}
 
 	@Nested class E_strictMode extends TestBase {
@@ -344,8 +408,8 @@ class Swagger_Test extends TestBase {
 		@Test void g02_findRef() {
 			var x = swagger().addDefinition("a1", JsonMap.of("type", "a2"));
 			assertBean(
-				x.findRef("#/definitions/a1", JsonMap.class), 
-				"type", 
+				x.findRef("#/definitions/a1", JsonMap.class),
+				"type",
 				"a2"
 			);
 
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Tag_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Tag_Test.java
index 14b2acabf..7b4eff999 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Tag_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Tag_Test.java
@@ -68,6 +68,12 @@ class Tag_Test extends TestBase {
 		@Test void a07_keySet() {
 			assertList(TESTER.bean().keySet(), "description", "externalDocs", "name");
 		}
+
+		@Test void a08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class B_emptyTests extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Xml_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Xml_Test.java
index 918c09209..7a7b82204 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Xml_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/Xml_Test.java
@@ -106,6 +106,12 @@ class Xml_Test extends TestBase {
 		@Test void b07_keySet() {
 			assertEmpty(TESTER.bean().keySet());
 		}
+
+		@Test void b08_nullParameters() {
+			var x = bean();
+			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
+			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
+		}
 	}
 
 	@Nested class C_extraProperties extends TestBase {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/ui/SwaggerUI_Test.java b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/ui/SwaggerUI_Test.java
index a639e9d52..ae168e83b 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/ui/SwaggerUI_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/ui/SwaggerUI_Test.java
@@ -20,6 +20,7 @@ import java.util.*;
 
 import org.apache.juneau.*;
 import org.junit.jupiter.api.*;
+import org.apache.juneau.TestBase;
 
 /**
  * Testcase for {@link SwaggerUI}.
diff --git a/pom.xml b/pom.xml
index 81e3b84c7..e223fe093 100644
--- a/pom.xml
+++ b/pom.xml
@@ -175,9 +175,9 @@
 						<configuration>
 							<executable>python3</executable>
 							<arguments>
-								<argument>${project.parent.basedir}/juneau-check-topic-links.py</argument>
+								<argument>${maven.multiModuleProjectDirectory}/juneau-check-topic-links.py</argument>
 							</arguments>
-							<workingDirectory>${project.parent.basedir}</workingDirectory>
+							<workingDirectory>${maven.multiModuleProjectDirectory}</workingDirectory>
 							<failOnError>true</failOnError>
 						</configuration>
 					</execution>