From cd77329192930b1e1eb62e46c784c7000f3a294d Mon Sep 17 00:00:00 2001 From: muaz-32 <96006730+muaz-32@users.noreply.github.com> Date: Tue, 16 Apr 2024 16:14:59 +0600 Subject: [PATCH] Configured Swagger in the project I have used the swagger plugin for Javalin to configure Swagger. However the annotated endpoints are shown in the Swagger UI but annotations are unable to access any user defined class in the annotation, as a result the request format is not shown properly. --- build.gradle | 3 +++ .../java/org/polypheny/db/PolyphenyDb.java | 2 ++ gradle.properties | 1 + webui/build.gradle | 4 ++++ .../java/org/polypheny/db/webui/Crud.java | 12 ++++++++++ .../org/polypheny/db/webui/HttpServer.java | 23 +++++++++++++++++++ 6 files changed, 45 insertions(+) diff --git a/build.gradle b/build.gradle index 69e526f869..597e2f9c4c 100644 --- a/build.gradle +++ b/build.gradle @@ -78,6 +78,9 @@ allprojects { maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } + maven{ + url "https://maven.reposilite.com/releases/" + } } configurations.configureEach { diff --git a/dbms/src/main/java/org/polypheny/db/PolyphenyDb.java b/dbms/src/main/java/org/polypheny/db/PolyphenyDb.java index d30c84a726..e570d1a3c6 100644 --- a/dbms/src/main/java/org/polypheny/db/PolyphenyDb.java +++ b/dbms/src/main/java/org/polypheny/db/PolyphenyDb.java @@ -455,6 +455,8 @@ public void join( final long millis ) throws InterruptedException { log.info( "****************************************************************************************************" ); log.info( " Polypheny-DB successfully started and ready to process your queries!" ); + log.info( " For Swagger documentation:" ); + log.info( " http://localhost:{}/swagger", RuntimeConfig.WEBUI_SERVER_PORT.getInteger() ); log.info( " The UI is waiting for you on port {}:", RuntimeConfig.WEBUI_SERVER_PORT.getInteger() ); log.info( " http://localhost:{}", RuntimeConfig.WEBUI_SERVER_PORT.getInteger() ); log.info( "****************************************************************************************************" ); diff --git a/gradle.properties b/gradle.properties index 9827f734f9..1c636bc9fd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -99,3 +99,4 @@ slf4j_api_version = 2.0.12 typesafe_config_version = 1.2.1 unirest_version = 3.14.5 web3j_version = 5.0.0 +openapi = 1.1.7 diff --git a/webui/build.gradle b/webui/build.gradle index c2d969820a..f6ffc0b294 100644 --- a/webui/build.gradle +++ b/webui/build.gradle @@ -26,7 +26,11 @@ dependencies { implementation group: "com.fasterxml.jackson.core", name: "jackson-core", version: jackson_core_version // Apache 2.0 implementation group: "com.fasterxml.jackson.core", name: "jackson-annotations", version: jackson_annotations_version // Apache 2.0 + annotationProcessor group: "io.javalin-rfc", name: "openapi-annotation-processor", version: openapi + implementation group: "io.javalin-rfc", name: "javalin-openapi-plugin", version: openapi + implementation group: "io.javalin-rfc", name: "javalin-swagger-plugin", version: openapi + // --- Test Compile --- testImplementation project(path: ":core", configuration: "tests") } diff --git a/webui/src/main/java/org/polypheny/db/webui/Crud.java b/webui/src/main/java/org/polypheny/db/webui/Crud.java index 9a53d7a8ef..9703e6a0e6 100644 --- a/webui/src/main/java/org/polypheny/db/webui/Crud.java +++ b/webui/src/main/java/org/polypheny/db/webui/Crud.java @@ -68,6 +68,11 @@ import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.Part; + +import io.javalin.openapi.HttpMethod; +import io.javalin.openapi.OpenApi; +import io.javalin.openapi.OpenApiContent; +import io.javalin.openapi.OpenApiRequestBody; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; @@ -2079,6 +2084,13 @@ void getSources( final Context ctx ) { /** * Deploy a new adapter */ + @OpenApi( + path = "/createAdapter", + summary = "Deploy a new adapter", + tags = { "Adapter" }, + methods = {HttpMethod.POST}, + requestBody = @OpenApiRequestBody(content = @OpenApiContent(from = AdapterModel.class)) + ) void addAdapter( final Context ctx ) throws ServletException, IOException { initMultipart( ctx ); String body = ""; diff --git a/webui/src/main/java/org/polypheny/db/webui/HttpServer.java b/webui/src/main/java/org/polypheny/db/webui/HttpServer.java index 21b7001d05..107ec8222d 100644 --- a/webui/src/main/java/org/polypheny/db/webui/HttpServer.java +++ b/webui/src/main/java/org/polypheny/db/webui/HttpServer.java @@ -24,6 +24,10 @@ import com.fasterxml.jackson.databind.SerializationFeature; import io.javalin.Javalin; import io.javalin.http.Context; +import io.javalin.openapi.plugin.OpenApiConfiguration; +import io.javalin.openapi.plugin.OpenApiPlugin; +import io.javalin.openapi.plugin.swagger.SwaggerConfiguration; +import io.javalin.openapi.plugin.swagger.SwaggerPlugin; import io.javalin.plugin.json.JavalinJackson; import io.javalin.websocket.WsConfig; import java.io.BufferedReader; @@ -61,6 +65,8 @@ public class HttpServer implements Runnable { @Getter private WebSocket webSocketHandler; + String deprecatedDocsPath = "/swagger-docs"; + public static HttpServer getInstance() { if ( INSTANCE == null ) { @@ -70,6 +76,21 @@ public static HttpServer getInstance() { } + private OpenApiConfiguration getOpenApiConfiguration() { + OpenApiConfiguration openApiConfiguration = new OpenApiConfiguration(); + openApiConfiguration.setTitle( "Polypheny-DB WebUI" ); + openApiConfiguration.setDocumentationPath(deprecatedDocsPath); // by default it's /openapi + return openApiConfiguration; + } + + + private SwaggerConfiguration getSwaggerConfiguration() { + SwaggerConfiguration swaggerConfiguration = new SwaggerConfiguration(); + swaggerConfiguration.setDocumentationPath(deprecatedDocsPath); + return swaggerConfiguration; + } + + public static final ObjectMapper mapper = new ObjectMapper() { { setSerializationInclusion( JsonInclude.Include.NON_NULL ); @@ -88,6 +109,8 @@ public static HttpServer getInstance() { config.jsonMapper( new JavalinJackson( mapper ) ); config.enableCorsForAllOrigins(); config.addStaticFiles( staticFileConfig -> staticFileConfig.directory = "webapp/" ); + config.registerPlugin( new OpenApiPlugin( getOpenApiConfiguration() ) ); + config.registerPlugin( new SwaggerPlugin( getSwaggerConfiguration() ) ); } ).start( RuntimeConfig.WEBUI_SERVER_PORT.getInteger() ); private Crud crud;