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 00c347788 Split up openapi modules into swagger-v2 and openapi-v3.
00c347788 is described below
commit 00c347788a33d65ea56c99c6ab7ece49e46908dd
Author: James Bognar <[email protected]>
AuthorDate: Tue Sep 30 17:25:09 2025 -0400
Split up openapi modules into swagger-v2 and openapi-v3.
---
.../pom.xml | 4 +-
.../apache/juneau/bean/openapi/ui/OpenApiUI.java | 0
.../juneau/bean/openapi/ui/package-info.java | 0
.../org/apache/juneau/bean/openapi3/Callback.java | 0
.../apache/juneau/bean/openapi3/Components.java | 0
.../org/apache/juneau/bean/openapi3/Contact.java | 0
.../apache/juneau/bean/openapi3/Discriminator.java | 0
.../org/apache/juneau/bean/openapi3/Encoding.java | 0
.../org/apache/juneau/bean/openapi3/Example.java | 0
.../bean/openapi3/ExternalDocumentation.java | 0
.../apache/juneau/bean/openapi3/HeaderInfo.java | 0
.../java/org/apache/juneau/bean/openapi3/Info.java | 0
.../org/apache/juneau/bean/openapi3/Items.java | 0
.../org/apache/juneau/bean/openapi3/License.java | 0
.../java/org/apache/juneau/bean/openapi3/Link.java | 0
.../org/apache/juneau/bean/openapi3/MediaType.java | 0
.../org/apache/juneau/bean/openapi3/OAuthFlow.java | 0
.../apache/juneau/bean/openapi3/OAuthFlows.java | 0
.../org/apache/juneau/bean/openapi3/OpenApi.java | 0
.../juneau/bean/openapi3/OpenApiBuilder.java | 0
.../juneau/bean/openapi3/OpenApiElement.java | 0
.../org/apache/juneau/bean/openapi3/Operation.java | 0
.../org/apache/juneau/bean/openapi3/Parameter.java | 0
.../org/apache/juneau/bean/openapi3/PathItem.java | 0
.../juneau/bean/openapi3/RequestBodyInfo.java | 0
.../org/apache/juneau/bean/openapi3/Response.java | 0
.../apache/juneau/bean/openapi3/SchemaInfo.java | 0
.../juneau/bean/openapi3/SecurityRequirement.java | 0
.../juneau/bean/openapi3/SecuritySchemeInfo.java | 0
.../org/apache/juneau/bean/openapi3/Server.java | 0
.../juneau/bean/openapi3/ServerVariable.java | 0
.../java/org/apache/juneau/bean/openapi3/Tag.java | 0
.../java/org/apache/juneau/bean/openapi3/Xml.java | 0
.../apache/juneau/bean/openapi3/package-info.java | 0
juneau-bean/juneau-bean-openapi3/.gitignore | 6 -
.../pom.xml | 8 +-
.../org/apache/juneau/bean/swagger/Contact.java | 0
.../juneau/bean/swagger/ExternalDocumentation.java | 0
.../org/apache/juneau/bean/swagger/HeaderInfo.java | 0
.../java/org/apache/juneau/bean/swagger/Info.java | 0
.../java/org/apache/juneau/bean/swagger/Items.java | 0
.../org/apache/juneau/bean/swagger/License.java | 0
.../org/apache/juneau/bean/swagger/Operation.java | 0
.../apache/juneau/bean/swagger/OperationMap.java | 23 +-
.../apache/juneau/bean/swagger/ParameterInfo.java | 0
.../apache/juneau/bean/swagger/ResponseInfo.java | 0
.../org/apache/juneau/bean/swagger/SchemaInfo.java | 0
.../apache/juneau/bean/swagger/SecurityScheme.java | 0
.../org/apache/juneau/bean/swagger/Swagger.java | 0
.../apache/juneau/bean/swagger/SwaggerBuilder.java | 9 +
.../apache/juneau/bean/swagger/SwaggerElement.java | 10 +-
.../java/org/apache/juneau/bean/swagger/Tag.java | 0
.../java/org/apache/juneau/bean/swagger/Xml.java | 0
.../apache/juneau/bean/swagger/package-info.java | 0
.../apache/juneau/bean/swagger/ui/SwaggerUI.java | 30 +-
.../juneau/bean/swagger/ui/package-info.java | 0
juneau-bean/pom.xml | 3 +-
.../org/apache/juneau/junit/bct/BctAssertions.java | 4 +-
.../juneau/junit/bct/PropertyExtractors.java | 5 +
juneau-utest/pom.xml | 2 +-
.../juneau/bean/swagger/OperationMap_Test.java | 183 +++++++++++
.../juneau/bean/swagger/SwaggerElement_Test.java | 177 +++++++++++
.../apache/juneau/bean/swagger/Swagger_Test.java | 2 +-
.../juneau/bean/swagger/ui/SwaggerUI_Test.java | 342 +++++++++++++++++++++
64 files changed, 772 insertions(+), 36 deletions(-)
diff --git a/juneau-bean/juneau-bean-openapi3/pom.xml
b/juneau-bean/juneau-bean-openapi-v3/pom.xml
similarity index 97%
copy from juneau-bean/juneau-bean-openapi3/pom.xml
copy to juneau-bean/juneau-bean-openapi-v3/pom.xml
index 8594e5746..ecee6cc2e 100644
--- a/juneau-bean/juneau-bean-openapi3/pom.xml
+++ b/juneau-bean/juneau-bean-openapi-v3/pom.xml
@@ -23,8 +23,8 @@
<version>9.2.0-SNAPSHOT</version>
</parent>
- <artifactId>juneau-bean-openapi3</artifactId>
- <name>juneau/bean/openapi3</name>
+ <artifactId>juneau-bean-openapi-v3</artifactId>
+ <name>juneau/bean/openapi-v3</name>
<description>Apache Juneau Serializable Beans - OpenAPI v3</description>
<packaging>bundle</packaging>
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi/ui/OpenApiUI.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi/ui/OpenApiUI.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi/ui/OpenApiUI.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi/ui/OpenApiUI.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi/ui/package-info.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi/ui/package-info.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi/ui/package-info.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi/ui/package-info.java
diff --git
a/juneau-bean/juneau-bean-openapi3/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
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Callback.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Callback.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Components.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Components.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Components.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Components.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Contact.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Contact.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Contact.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Contact.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Discriminator.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Discriminator.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Discriminator.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Discriminator.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Encoding.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Encoding.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Encoding.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Encoding.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Example.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Example.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Example.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Example.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/ExternalDocumentation.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/ExternalDocumentation.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/ExternalDocumentation.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/ExternalDocumentation.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/HeaderInfo.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/HeaderInfo.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/HeaderInfo.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/HeaderInfo.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Info.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Info.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Info.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Info.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Items.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Items.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Items.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Items.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/License.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/License.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/License.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/License.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Link.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Link.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Link.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Link.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/MediaType.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/MediaType.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/MediaType.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/MediaType.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/OAuthFlow.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OAuthFlow.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/OAuthFlow.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OAuthFlow.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/OAuthFlows.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OAuthFlows.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/OAuthFlows.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OAuthFlows.java
diff --git
a/juneau-bean/juneau-bean-openapi3/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
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/OpenApi.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OpenApi.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/OpenApiBuilder.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OpenApiBuilder.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/OpenApiBuilder.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OpenApiBuilder.java
diff --git
a/juneau-bean/juneau-bean-openapi3/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
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/OpenApiElement.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OpenApiElement.java
diff --git
a/juneau-bean/juneau-bean-openapi3/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
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Operation.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Operation.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Parameter.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Parameter.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Parameter.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Parameter.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/PathItem.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/PathItem.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/PathItem.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/PathItem.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/RequestBodyInfo.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/RequestBodyInfo.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/RequestBodyInfo.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/RequestBodyInfo.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Response.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Response.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Response.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Response.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/SchemaInfo.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/SchemaInfo.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/SchemaInfo.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/SchemaInfo.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/SecurityRequirement.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/SecurityRequirement.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/SecurityRequirement.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/SecurityRequirement.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/SecuritySchemeInfo.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/SecuritySchemeInfo.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/SecuritySchemeInfo.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/SecuritySchemeInfo.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Server.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Server.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Server.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Server.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/ServerVariable.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/ServerVariable.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/ServerVariable.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/ServerVariable.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Tag.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Tag.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Tag.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Tag.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Xml.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Xml.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/Xml.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/Xml.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/package-info.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/package-info.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/openapi3/package-info.java
rename to
juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/package-info.java
diff --git a/juneau-bean/juneau-bean-openapi3/.gitignore
b/juneau-bean/juneau-bean-openapi3/.gitignore
deleted file mode 100644
index 34acf885c..000000000
--- a/juneau-bean/juneau-bean-openapi3/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-/target/
-**/.DS_Store
-.classpath
-.project
-/.settings/
-/bin/
diff --git a/juneau-bean/juneau-bean-openapi3/pom.xml
b/juneau-bean/juneau-bean-swagger-v2/pom.xml
similarity index 93%
rename from juneau-bean/juneau-bean-openapi3/pom.xml
rename to juneau-bean/juneau-bean-swagger-v2/pom.xml
index 8594e5746..71b6eaeee 100644
--- a/juneau-bean/juneau-bean-openapi3/pom.xml
+++ b/juneau-bean/juneau-bean-swagger-v2/pom.xml
@@ -23,9 +23,9 @@
<version>9.2.0-SNAPSHOT</version>
</parent>
- <artifactId>juneau-bean-openapi3</artifactId>
- <name>juneau/bean/openapi3</name>
- <description>Apache Juneau Serializable Beans - OpenAPI v3</description>
+ <artifactId>juneau-bean-swagger-v2</artifactId>
+ <name>juneau/bean/swagger-v2</name>
+ <description>Apache Juneau Serializable Beans - Swagger v2</description>
<packaging>bundle</packaging>
<properties>
@@ -53,7 +53,7 @@
<extensions>true</extensions>
<configuration>
<instructions>
-
<Automatic-Module-Name>org.apache.juneau.bean.openapi3</Automatic-Module-Name>
+
<Automatic-Module-Name>org.apache.juneau.bean.swagger</Automatic-Module-Name>
</instructions>
</configuration>
</plugin>
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/Contact.java
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Contact.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/Contact.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Contact.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/ExternalDocumentation.java
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/ExternalDocumentation.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/ExternalDocumentation.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/ExternalDocumentation.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/HeaderInfo.java
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/HeaderInfo.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/HeaderInfo.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/HeaderInfo.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/Info.java
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Info.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/Info.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Info.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/Items.java
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Items.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/Items.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Items.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/License.java
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/License.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/License.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/License.java
diff --git
a/juneau-bean/juneau-bean-openapi3/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
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/Operation.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Operation.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/OperationMap.java
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/OperationMap.java
similarity index 82%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/OperationMap.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/OperationMap.java
index cadeb8efd..a45bf5e37 100644
---
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/OperationMap.java
+++
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/OperationMap.java
@@ -51,12 +51,13 @@ public class OperationMap extends TreeMap<String,Operation>
{
@Override
public int compare(String o1, String o2) {
- var s1 = methods.get(o1);
- var s2 = methods.get(o2);
+ // Since keys are now stored in lowercase, we need to
normalize them for comparison
+ var s1 = methods.get(emptyIfNull(o1).toLowerCase());
+ var s2 = methods.get(emptyIfNull(o2).toLowerCase());
if (s1 == null)
- s1 = o1;
+ s1 = emptyIfNull(o1).toLowerCase();
if (s2 == null)
- s2 = o2;
+ s2 = emptyIfNull(o2).toLowerCase();
return StringUtils.compare(s1, s2);
}
};
@@ -68,6 +69,18 @@ public class OperationMap extends TreeMap<String,Operation> {
super(OP_SORTER);
}
+ /**
+ * Override put to normalize keys to lowercase.
+ *
+ * @param key The key.
+ * @param value The value.
+ * @return The previous value associated with key, or null if there was
no mapping for key.
+ */
+ @Override
+ public Operation put(String key, Operation value) {
+ return super.put(emptyIfNull(key).toLowerCase(), value);
+ }
+
/**
* Fluent-style put method.
*
@@ -76,7 +89,7 @@ public class OperationMap extends TreeMap<String,Operation> {
* @return This object.
*/
public OperationMap append(String httpMethodName, Operation operation) {
- put(emptyIfNull(httpMethodName).toLowerCase(), operation);
+ put(httpMethodName, operation);
return this;
}
}
\ No newline at end of file
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/ParameterInfo.java
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/ParameterInfo.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/ParameterInfo.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/ParameterInfo.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/ResponseInfo.java
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/ResponseInfo.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/ResponseInfo.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/ResponseInfo.java
diff --git
a/juneau-bean/juneau-bean-openapi3/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
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/SchemaInfo.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/SchemaInfo.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/SecurityScheme.java
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/SecurityScheme.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/SecurityScheme.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/SecurityScheme.java
diff --git
a/juneau-bean/juneau-bean-openapi3/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
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/Swagger.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Swagger.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/SwaggerBuilder.java
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/SwaggerBuilder.java
similarity index 98%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/SwaggerBuilder.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/SwaggerBuilder.java
index 571038161..0e1326c03 100644
---
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/SwaggerBuilder.java
+++
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/SwaggerBuilder.java
@@ -249,6 +249,15 @@ public class SwaggerBuilder {
return new Operation();
}
+ /**
+ * Creates an empty {@link OperationMap} element.
+ *
+ * @return The new element.
+ */
+ public static final OperationMap operationMap() {
+ return new OperationMap();
+ }
+
/**
* Creates an empty {@link ParameterInfo} element.
*
diff --git
a/juneau-bean/juneau-bean-openapi3/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
similarity index 95%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/SwaggerElement.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/SwaggerElement.java
index 38d45f35c..72ffff345 100644
---
a/juneau-bean/juneau-bean-openapi3/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
@@ -15,6 +15,7 @@ package org.apache.juneau.bean.swagger;
import static org.apache.juneau.internal.CollectionUtils.*;
import static org.apache.juneau.internal.ConverterUtils.*;
+import java.lang.reflect.*;
import java.util.*;
import org.apache.juneau.annotation.*;
@@ -105,7 +106,11 @@ public abstract class SwaggerElement {
*/
@Beanp("*")
public Object get(String property) {
- if (property == null || extra == null)
+ if (property == null)
+ return null;
+ if ("strict".equals(property))
+ return toType(isStrict(), Object.class);
+ if (extra == null)
return null;
return extra.get(property);
}
@@ -179,6 +184,9 @@ public abstract class SwaggerElement {
@Override /* Object */
public String toString() {
+ if (Modifier.isAbstract(getClass().getModifiers())) {
+ return JsonMap.of("strict", strict, "extra",
extra).toString();
+ }
return JsonSerializer.DEFAULT.toString(this);
}
}
\ No newline at end of file
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/Tag.java
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Tag.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/Tag.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Tag.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/Xml.java
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Xml.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/Xml.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/Xml.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/package-info.java
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/package-info.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/package-info.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/package-info.java
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/ui/SwaggerUI.java
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/ui/SwaggerUI.java
similarity index 94%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/ui/SwaggerUI.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/ui/SwaggerUI.java
index 7e6f23a3f..c742cc911 100644
---
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/ui/SwaggerUI.java
+++
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/ui/SwaggerUI.java
@@ -156,24 +156,30 @@ public class SwaggerUI extends ObjectSwap<Swagger,Div> {
private HtmlElement tagBlockSummary(Tag t) {
var ed = t.getExternalDocs();
- var content = ed.getDescription() != null ? ed.getDescription()
: ed.getUrl();
- return div()._class("tag-block-summary").children(
- span(t.getName())._class("name"),
- span(toBRL(t.getDescription()))._class("description"),
- span(a(ed.getUrl(), content))._class("extdocs")
- ).onclick("toggleTagBlock(this)");
+ var children = new ArrayList<HtmlElement>();
+ children.add(span(t.getName())._class("name"));
+
children.add(span(toBRL(t.getDescription()))._class("description"));
+
+ if (ed != null) {
+ var content = ed.getDescription() != null ?
ed.getDescription() : ed.getUrl();
+ children.add(span(a(ed.getUrl(),
content))._class("extdocs"));
+ }
+
+ return
div()._class("tag-block-summary").children(children).onclick("toggleTagBlock(this)");
}
// Creates the contents under the "pet Everything about your Pets
ext-link" header.
private Div tagBlockContents(Session s, Tag t) {
var tagBlockContents = div()._class("tag-block-contents");
- s.swagger.getPaths().forEach((path,v) ->
- v.forEach((opName,op) -> {
- if ((t == null && op.getTags() == null) || (t
!= null && op.getTags() != null && op.getTags() != null &&
op.getTags().contains(t.getName())))
- tagBlockContents.child(opBlock(s, path,
opName, op));
- })
- );
+ if (s.swagger.getPaths() != null) {
+ s.swagger.getPaths().forEach((path,v) ->
+ v.forEach((opName,op) -> {
+ if ((t == null && op.getTags() == null)
|| (t != null && op.getTags() != null && op.getTags() != null &&
op.getTags().contains(t.getName())))
+
tagBlockContents.child(opBlock(s, path, opName, op));
+ })
+ );
+ }
return tagBlockContents;
}
diff --git
a/juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/ui/package-info.java
b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/ui/package-info.java
similarity index 100%
rename from
juneau-bean/juneau-bean-openapi3/src/main/java/org/apache/juneau/bean/swagger/ui/package-info.java
rename to
juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/ui/package-info.java
diff --git a/juneau-bean/pom.xml b/juneau-bean/pom.xml
index f824eaba0..59b25a8d9 100644
--- a/juneau-bean/pom.xml
+++ b/juneau-bean/pom.xml
@@ -33,6 +33,7 @@
<module>juneau-bean-common</module>
<module>juneau-bean-html5</module>
<module>juneau-bean-jsonschema</module>
- <module>juneau-bean-openapi3</module>
+ <module>juneau-bean-openapi-v3</module>
+ <module>juneau-bean-swagger-v2</module>
</modules>
</project>
diff --git
a/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/BctAssertions.java
b/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/BctAssertions.java
index 2573e8184..aa711c12e 100644
---
a/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/BctAssertions.java
+++
b/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/BctAssertions.java
@@ -465,13 +465,11 @@ public class BctAssertions {
actualStrings.add(tokens.stream().map(x ->
converter.getNested(o, x)).collect(joining(",")));
}
- if (errors.size() == 1) throw errors.get(0);
-
throw assertEqualsFailed(
Stream.of(expected).map(Utils::escapeForJava).collect(joining("\", \"", "\"",
"\"")),
actualStrings.stream().map(Utils::escapeForJava).collect(joining("\", \"",
"\"", "\"")),
args.getMessage("{0} bean assertions failed:\n{1}",
errors.size(), errors.stream().map(x -> x.getMessage()).collect(joining("\n")))
- );
+ );
}
/**
diff --git
a/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/PropertyExtractors.java
b/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/PropertyExtractors.java
index edb6c2fd4..7a2dfbfe8 100644
---
a/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/PropertyExtractors.java
+++
b/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/PropertyExtractors.java
@@ -107,6 +107,11 @@ public class PropertyExtractors {
m.setAccessible(true);
return m.invoke(o);
}
+ if (o instanceof Map.Entry<?,?> me) {
+ // Reflection to classes inside
java.util are restricted in Java 9+.
+ if ("key".equals(name)) return
me.getKey();
+ if ("value".equals(name))
return me.getValue();
+ }
m =
Arrays.stream(c.getMethods()).filter(x -> x.getName().equals("get"+n) &&
x.getParameterCount() == 0).findFirst().orElse(null);
if (m != null) {
m.setAccessible(true);
diff --git a/juneau-utest/pom.xml b/juneau-utest/pom.xml
index a1d377a12..03700c2e3 100644
--- a/juneau-utest/pom.xml
+++ b/juneau-utest/pom.xml
@@ -65,7 +65,7 @@
</dependency>
<dependency>
<groupId>org.apache.juneau</groupId>
- <artifactId>juneau-bean-openapi3</artifactId>
+ <artifactId>juneau-bean-swagger-v2</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/OperationMap_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/OperationMap_Test.java
new file mode 100644
index 000000000..03aef5adf
--- /dev/null
+++
b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/OperationMap_Test.java
@@ -0,0 +1,183 @@
+//
***************************************************************************************************************************
+// * 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. *
+//
***************************************************************************************************************************
+package org.apache.juneau.bean.swagger;
+
+import static org.apache.juneau.bean.swagger.SwaggerBuilder.*;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.apache.juneau.junit.bct.BctAssertions.*;
+
+import java.util.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.json.*;
+import org.junit.jupiter.api.*;
+
+/**
+ * Testcase for {@link OperationMap}.
+ */
+class OperationMap_Test extends SimpleTestBase {
+
+ /**
+ * Test method for operation ordering.
+ */
+ @Test void a01_operationOrdering() {
+ var map = operationMap();
+
+ // Add operations in random order
+ map
+ .append("custom", operation())
+ .append("post", operation())
+ .append("delete", operation())
+ .append("get", operation())
+ .append("options", operation())
+ .append("head", operation())
+ .append("patch", operation())
+ .append("put", operation());
+
+ // Verify ordering.
+ assertList(map.keySet(), "get", "put", "post", "delete",
"options", "head", "patch", "custom");
+ }
+
+ /**
+ * Test method for case-insensitive ordering.
+ */
+ @Test void a02_caseInsensitiveOrdering() {
+ var map = operationMap();
+
+ // Add operations with different cases
+ map.append("DELETE", operation()).append("Get",
operation()).append("POST", operation()).append("put", operation());
+
+ // Verify ordering is case-insensitive - all keys should be
normalized to lowercase
+ assertList(map.keySet(), "get", "put", "post", "delete");
+ }
+
+ /**
+ * Test method for custom methods.
+ */
+ @Test void a04_customMethods() {
+ var map = operationMap();
+
+ // Add standard methods
+ map.put("get", operation().setSummary("Get operation"));
+ map.put("post", operation().setSummary("Post operation"));
+
+ // Add custom methods
+ map.put("custom1", operation().setSummary("Custom1 operation"));
+ map.put("custom2", operation().setSummary("Custom2 operation"));
+
+ // Verify custom methods come after standard methods
+ assertBeans(map, "key,value{summary}", "get,{Get operation}",
"post,{Post operation}", "custom1,{Custom1 operation}", "custom2,{Custom2
operation}");
+ }
+
+ /**
+ * Test method for empty map.
+ */
+ @Test void a05_emptyMap() {
+ var map = operationMap();
+ assertTrue(map.isEmpty());
+ assertEquals(0, map.size());
+ }
+
+ /**
+ * Test method for duplicate keys.
+ */
+ @Test void a06_duplicateKeys() {
+ var map = operationMap();
+
+ map.put("get", operation().setSummary("First operation"));
+ map.put("get", operation().setSummary("Second operation"));
+
+ // Verify the second operation overwrites the first
+ assertBeans(map, "key,value{summary}", "get,{Second
operation}");
+ }
+
+ /**
+ * Test method for null values.
+ */
+ @Test void a07_nullValues() {
+ var map = operationMap();
+
+ // Should not throw exception when adding null value
+ assertDoesNotThrow(() -> map.put("get", null));
+ assertTrue(map.containsKey("get"));
+ assertNull(map.get("get"));
+ }
+
+ /**
+ * Test method for serialization.
+ */
+ @Test void a08_serialization() {
+ var map = operationMap();
+ map.put("get", operation().setSummary("Get operation"));
+ map.put("post", operation().setSummary("Post operation"));
+
+ // Test that it can be serialized to JSON
+ var json = Json5Serializer.DEFAULT.toString(map);
+ assertNotNull(json);
+ assertEquals("{get:{summary:'Get
operation'},post:{summary:'Post operation'}}", json);
+ }
+
+ /**
+ * Test method for deserialization.
+ */
+ @Test void a09_deserialization() {
+ var json = "{get:{summary:'Get operation'},post:{summary:'Post
operation'}}";
+ var map = Json5Parser.DEFAULT.parse(json, OperationMap.class);
+ assertBeans(map, "key,value{summary}", "get,{Get operation}",
"post,{Post operation}");
+ }
+
+ /**
+ * Test method for iteration order.
+ */
+ @Test void a10_iterationOrder() {
+ var map = operationMap();
+ map.put("delete", operation().setSummary("Delete"));
+ map.put("get", operation().setSummary("Get"));
+ map.put("post", operation().setSummary("Post"));
+ map.put("put", operation().setSummary("Put"));
+
+ assertList(map.keySet(), "get", "put", "post", "delete");
+ }
+
+ /**
+ * Test method for key normalization in put method.
+ */
+ @Test void a11_keyNormalization() {
+ var map = operationMap();
+
+ // Test that put() normalizes keys to lowercase
+ map.put("GET", operation().setSummary("Get operation"));
+ map.put("Post", operation().setSummary("Post operation"));
+ map.put("DELETE", operation().setSummary("Delete operation"));
+
+
+ // Verify that keys are stored in lowercase
+ assertTrue(map.containsKey("get"));
+ assertTrue(map.containsKey("post"));
+ assertTrue(map.containsKey("delete"));
+
+ // Verify that original case keys are not present (TreeMap with
custom comparator may be case-insensitive)
+ // Since our comparator normalizes keys, containsKey() may also
be case-insensitive
+ // Let's verify the actual keys in the map instead
+ var keys = new ArrayList<>(map.keySet());
+ assertTrue(keys.contains("get"));
+ assertTrue(keys.contains("post"));
+ assertTrue(keys.contains("delete"));
+ assertFalse(keys.contains("GET"));
+ assertFalse(keys.contains("Post"));
+ assertFalse(keys.contains("DELETE"));
+
+ // Verify that we can retrieve using lowercase keys
+ assertBeans(map, "value{summary}", "{Get operation}", "{Post
operation}", "{Delete operation}");
+ }
+}
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
new file mode 100644
index 000000000..9238ab518
--- /dev/null
+++
b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/SwaggerElement_Test.java
@@ -0,0 +1,177 @@
+//
***************************************************************************************************************************
+// * 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. *
+//
***************************************************************************************************************************
+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.*;
+
+/**
+ * Testcase for {@link SwaggerElement}.
+ */
+class SwaggerElement_Test extends SimpleTestBase {
+
+ /**
+ * Test class that extends SwaggerElement for testing purposes.
+ */
+ public static class TestSwaggerElement extends SwaggerElement {
+ private String testProperty;
+
+ public TestSwaggerElement() {}
+
+ public TestSwaggerElement(TestSwaggerElement copyFrom) {
+ super(copyFrom);
+ this.testProperty = copyFrom.testProperty;
+ }
+
+ public String getTestProperty() { return testProperty; }
+ public TestSwaggerElement setTestProperty(String testProperty)
{ this.testProperty = testProperty; return this; }
+ }
+
+ /**
+ * Test method for strict mode.
+ */
+ @Test void a01_strictMode() {
+ var t = new TestSwaggerElement();
+
+ // Default should be non-strict
+ assertFalse(t.isStrict());
+
+ // Test setting strict mode
+ assertBean(t.strict(true), "strict", "true");
+ assertTrue(t.isStrict());
+
+ assertBean(t.strict(false), "strict", "false");
+ assertFalse(t.isStrict());
+ }
+
+ /**
+ * Test method for extra properties.
+ */
+ @Test void a02_extraProperties() {
+ var t = new TestSwaggerElement();
+
+ // Test setting extra properties
+ t.set("key1", "value1");
+ t.set("key2", "value2");
+
+ // Test getting extra properties
+ assertBean(t, "key1,key2", "value1,value2");
+ }
+
+ /**
+ * Test method for extra properties with null.
+ */
+ @Test void a03_extraPropertiesNull() {
+ var t = new TestSwaggerElement();
+
+ // Test setting null extra properties
+ t.set("key1", null);
+ assertNull(t.get("key1"));
+ }
+
+ /**
+ * Test method for extra properties with empty map.
+ */
+ @Test void a04_extraPropertiesEmpty() {
+ var t = new TestSwaggerElement();
+
+ // Test that no extra properties are set initially
+ assertTrue(t.extraKeys().isEmpty());
+ }
+
+ /**
+ * Test method for copy constructor.
+ */
+ @Test void a05_copyConstructor() {
+ var original = new TestSwaggerElement();
+ original.setTestProperty("test");
+ original.strict(true);
+ original.set("key", "value");
+
+ var copy = new TestSwaggerElement(original);
+
+ // Test that properties are copied
+ assertEquals("test", copy.getTestProperty());
+ assertTrue(copy.isStrict());
+ assertEquals("value", copy.get("key"));
+ }
+
+ /**
+ * Test method for serialization with extra properties.
+ */
+ @Test void a06_serializationWithExtra() {
+ var t = new TestSwaggerElement();
+ t.setTestProperty("test");
+ t.set("extraKey", "extraValue");
+
+
assertEquals("{\"testProperty\":\"test\",\"extraKey\":\"extraValue\"}",
t.toString());
+ }
+
+ /**
+ * Test method for deserialization with extra properties.
+ */
+ @Test void a07_deserializationWithExtra() {
+ var json =
"{\"testProperty\":\"test\",\"extraKey\":\"extraValue\"}";
+
+ var t = JsonParser.DEFAULT.parse(json,
TestSwaggerElement.class);
+ assertBean(t, "testProperty,extraKey", "test,extraValue");
+ }
+
+ /**
+ * Test method for fluent setters.
+ */
+ @Test void a08_fluentSetters() {
+ var t = new TestSwaggerElement();
+
+ // Test chaining
+ var result = t.setTestProperty("test")
+ .strict(true)
+ .set("key", "value");
+
+ assertSame(t, result);
+ assertBean(t, "testProperty,strict,key", "test,true,value");
+ }
+
+ /**
+ * Test method for extra properties modification.
+ */
+ @Test void a09_extraPropertiesModification() {
+ var t = new TestSwaggerElement();
+ t.set("key1", "value1");
+
+ // Modify the extra properties
+ t.set("key2", "value2");
+
+ // Verify the modification
+ assertBean(t, "key1,key2", "value1,value2");
+ }
+
+ /**
+ * Test method for complex extra properties.
+ */
+ @Test void a10_complexExtraProperties() {
+ var t = new TestSwaggerElement();
+
+ t.set("string", "value");
+ t.set("number", 123);
+ t.set("boolean", true);
+ t.set("array", list("a", "b", "c"));
+ t.set("object", map("nested", "value"));
+
+ assertBean(t, "string,number,boolean,array,object",
"value,123,true,[a,b,c],{nested=value}");
+ }
+}
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 568fb07bd..1d69518d5 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
@@ -83,7 +83,7 @@ class Swagger_Test extends SimpleTestBase {
// addX methods.
assertBean(t.setPaths(null).addPath("a", "a1",
operation().setDescription("a2")).addPath("b", null, null),
- "paths",
"{a={a1={\"description\":\"a2\"}},b={<null>=<null>}}");
+ "paths",
"{a={a1={\"description\":\"a2\"}},b={=<null>}}");
assertBean(t.setDefinitions(null).addDefinition("a",
JsonMap.of("type","a1")).addDefinition("b", (JsonMap)null).addDefinition(null,
JsonMap.of("type", "c1")),
"definitions",
"{a={type=a1},b=<null>,<null>={type=c1}}");
assertBean(t.setParameters(null).addParameter("a",
parameterInfo().setIn("a1")).addParameter("b", null).addParameter(null,
parameterInfo().setIn("c1")),
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
new file mode 100644
index 000000000..76334e843
--- /dev/null
+++
b/juneau-utest/src/test/java/org/apache/juneau/bean/swagger/ui/SwaggerUI_Test.java
@@ -0,0 +1,342 @@
+//
***************************************************************************************************************************
+// * 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. *
+//
***************************************************************************************************************************
+package org.apache.juneau.bean.swagger.ui;
+
+import static org.apache.juneau.TestUtils.*;
+import static org.apache.juneau.bean.swagger.SwaggerBuilder.*;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.util.*;
+
+import org.apache.juneau.*;
+import org.junit.jupiter.api.*;
+
+/**
+ * Testcase for {@link SwaggerUI}.
+ */
+class SwaggerUI_Test extends SimpleTestBase {
+
+ private final BeanSession bs = BeanContext.DEFAULT_SESSION;
+
+ /**
+ * Test method for media types.
+ */
+ @Test void a01_mediaTypes() {
+ assertList(
+ new SwaggerUI().forMediaTypes(),
+ "text/html"
+ );
+ }
+
+ /**
+ * Test method for basic Swagger document conversion.
+ */
+ @Test void a02_basicSwaggerConversion() throws Exception {
+ var swagger = swagger()
+ .setInfo(info("Test API", "1.0.0").setDescription("Test
API Description"))
+ .setHost("localhost:8080")
+ .setBasePath("/api")
+ .setPaths(map("/test", operationMap().append("get",
operation().setSummary("Test operation"))));
+
+ assertString(
+ """
+ <div class='swagger-ui'>
+ <style nil='true'></style>
+ <script type='text/javascript'><sp/></script>
+ <table class='header'>
+ <tr><th>Description:</th><td>Test API
Description</td></tr>
+ <tr><th>Version:</th><td>1.0.0</td></tr>
+ </table>
+ <div class='tag-block tag-block-open'>
+ <div class='tag-block-contents'>
+ <div class='op-block
op-block-closed get'>
+ <div
class='op-block-summary' onclick='toggleOpBlock(this)'>
+ <span
class='method-button'>GET</span>
+ <span
class='path'>/test</span>
+ <span
class='summary'>Test operation</span>
+ </div>
+ <div
class='op-block-contents'>
+ <div
class='table-container' nil='true'></div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ """.replaceAll("\\n\\s*", ""),
+ new SwaggerUI().swap(bs, swagger)
+ );
+ }
+
+ /**
+ * Test method for Swagger document with tags.
+ */
+ @Test void a03_swaggerWithTags() throws Exception {
+ var swagger = swagger()
+ .setInfo(info("Test API", "1.0.0"))
+ .setTags(list(
+ tag("users").setDescription("User operations"),
+ tag("orders").setDescription("Order operations")
+ ));
+
+ assertString(
+ """
+ <div class='swagger-ui'>
+ <style nil='true'></style>
+ <script type='text/javascript'><sp/></script>
+ <table class='header'>
+ <tr><th>Version:</th><td>1.0.0</td></tr>
+ </table>
+ <div class='tag-block tag-block-open'>
+ <div class='tag-block-contents'
nil='true'></div>
+ </div>
+ <div class='tag-block tag-block-open'>
+ <div class='tag-block-summary'
onclick='toggleTagBlock(this)'>
+ <span class='name'>users</span>
+ <span class='description'>User
operations</span>
+ </div>
+ <div class='tag-block-contents'
nil='true'></div>
+ </div>
+ <div class='tag-block tag-block-open'>
+ <div class='tag-block-summary'
onclick='toggleTagBlock(this)'>
+ <span class='name'>orders</span>
+ <span class='description'>Order
operations</span>
+ </div>
+ <div class='tag-block-contents'
nil='true'></div>
+ </div>
+ </div>
+ """.replaceAll("\\n\\s*", ""),
+ new SwaggerUI().swap(bs, swagger)
+ );
+ }
+
+ /**
+ * Test method for Swagger document with parameters.
+ */
+ @Test void a04_swaggerWithParameters() throws Exception {
+ var swagger = swagger()
+ .setInfo(info("Test API", "1.0.0"))
+ .setPaths(new HashMap<>());
+
+ assertString(
+ """
+ <div class='swagger-ui'>
+ <style nil='true'></style>
+ <script type='text/javascript'><sp/></script>
+ <table class='header'>
+ <tr><th>Version:</th><td>1.0.0</td></tr>
+ </table>
+ <div class='tag-block tag-block-open'>
+ <div class='tag-block-contents'
nil='true'></div>
+ </div>
+ </div>
+ """.replaceAll("\\n\\s*", ""),
+ new SwaggerUI().swap(bs, swagger)
+ );
+ }
+
+ /**
+ * Test method for Swagger document with responses.
+ */
+ @Test void a05_swaggerWithResponses() throws Exception {
+ var swagger = swagger()
+ .setInfo(info("Test API", "1.0.0"))
+ .setPaths(new HashMap<>());
+
+ assertString(
+ """
+ <div class='swagger-ui'>
+ <style nil='true'></style>
+ <script type='text/javascript'><sp/></script>
+ <table class='header'>
+ <tr><th>Version:</th><td>1.0.0</td></tr>
+ </table>
+ <div class='tag-block tag-block-open'>
+ <div class='tag-block-contents'
nil='true'></div>
+ </div>
+ </div>
+ """.replaceAll("\\n\\s*", ""),
+ new SwaggerUI().swap(bs, swagger)
+ );
+ }
+
+ /**
+ * Test method for Swagger document with models.
+ */
+ @Test void a06_swaggerWithModels() throws Exception {
+ var swagger = swagger()
+ .setInfo(info("Test API", "1.0.0"))
+ .setPaths(new HashMap<>());
+
+ assertString(
+ """
+ <div class='swagger-ui'>
+ <style nil='true'></style>
+ <script type='text/javascript'><sp/></script>
+ <table class='header'>
+ <tr><th>Version:</th><td>1.0.0</td></tr>
+ </table>
+ <div class='tag-block tag-block-open'>
+ <div class='tag-block-contents'
nil='true'></div>
+ </div>
+ </div>
+ """.replaceAll("\\n\\s*", ""),
+ new SwaggerUI().swap(bs, swagger)
+ );
+ }
+
+ /**
+ * Test method for empty Swagger document.
+ */
+ @Test void a07_emptySwaggerDocument() throws Exception {
+ var swagger = swagger()
+ .setInfo(info("Test API", "1.0.0"))
+ .setPaths(new HashMap<>());
+
+ assertString(
+ """
+ <div class='swagger-ui'>
+ <style nil='true'></style>
+ <script type='text/javascript'><sp/></script>
+ <table class='header'>
+ <tr><th>Version:</th><td>1.0.0</td></tr>
+ </table>
+ <div class='tag-block tag-block-open'>
+ <div class='tag-block-contents'
nil='true'></div>
+ </div>
+ </div>
+ """.replaceAll("\\n\\s*", ""),
+ new SwaggerUI().swap(bs, swagger)
+ );
+ }
+
+ /**
+ * Test method for Swagger document with external documentation.
+ */
+ @Test void a08_swaggerWithExternalDocs() throws Exception {
+ var swagger = swagger()
+ .setInfo(info("Test API", "1.0.0"))
+ .setPaths(new HashMap<>());
+
+ assertString(
+ """
+ <div class='swagger-ui'>
+ <style nil='true'></style>
+ <script type='text/javascript'><sp/></script>
+ <table class='header'>
+ <tr><th>Version:</th><td>1.0.0</td></tr>
+ </table>
+ <div class='tag-block tag-block-open'>
+ <div class='tag-block-contents'
nil='true'></div>
+ </div>
+ </div>
+ """.replaceAll("\\n\\s*", ""),
+ new SwaggerUI().swap(bs, swagger)
+ );
+ }
+
+ /**
+ * Test method for Swagger document with security schemes.
+ */
+ @Test void a09_swaggerWithSecuritySchemes() throws Exception {
+ var swagger = swagger()
+ .setInfo(info("Test API", "1.0.0"))
+ .setPaths(new HashMap<>());
+
+ assertString(
+ """
+ <div class='swagger-ui'>
+ <style nil='true'></style>
+ <script type='text/javascript'><sp/></script>
+ <table class='header'>
+ <tr><th>Version:</th><td>1.0.0</td></tr>
+ </table>
+ <div class='tag-block tag-block-open'>
+ <div class='tag-block-contents'
nil='true'></div>
+ </div>
+ </div>
+ """.replaceAll("\\n\\s*", ""),
+ new SwaggerUI().swap(bs, swagger)
+ );
+ }
+
+ /**
+ * Test method for Swagger document with multiple operations.
+ */
+ @Test void a10_swaggerWithMultipleOperations() throws Exception {
+ var swagger = swagger()
+ .setInfo(info("Test API", "1.0.0"))
+ .setPaths(new HashMap<>());
+
+ assertString(
+ """
+ <div class='swagger-ui'>
+ <style nil='true'></style>
+ <script type='text/javascript'><sp/></script>
+ <table class='header'>
+ <tr><th>Version:</th><td>1.0.0</td></tr>
+ </table>
+ <div class='tag-block tag-block-open'>
+ <div class='tag-block-contents'
nil='true'></div>
+ </div>
+ </div>
+ """.replaceAll("\\n\\s*", ""),
+ new SwaggerUI().swap(bs, swagger)
+ );
+ }
+
+ /**
+ * Test method for null input.
+ */
+ @Test void a11_nullInput() {
+ assertThrows(NullPointerException.class, () -> {
+ new SwaggerUI().swap(bs, null);
+ });
+ }
+
+ /**
+ * Test method for HTML output structure.
+ */
+ @Test void a12_htmlOutputStructure() throws Exception {
+ var swagger = swagger()
+ .setInfo(info("Test API", "1.0.0"))
+
.setPaths(org.apache.juneau.common.internal.Utils.map("/test", operationMap()
+ .append("get", operation().setSummary("Test
operation"))));
+
+ assertString(
+ """
+ <div class='swagger-ui'>
+ <style nil='true'></style>
+ <script type='text/javascript'><sp/></script>
+ <table class='header'>
+ <tr><th>Version:</th><td>1.0.0</td></tr>
+ </table>
+ <div class='tag-block tag-block-open'>
+ <div class='tag-block-contents'>
+ <div class='op-block
op-block-closed get'>
+ <div
class='op-block-summary' onclick='toggleOpBlock(this)'>
+ <span
class='method-button'>GET</span>
+ <span
class='path'>/test</span>
+ <span
class='summary'>Test operation</span>
+ </div>
+ <div
class='op-block-contents'>
+ <div
class='table-container' nil='true'></div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ """.replaceAll("\\n\\s*", ""),
+ new SwaggerUI().swap(bs, swagger)
+ );
+ }
+}