From f7bea014aaa893cb336d496db579c82850bf28b5 Mon Sep 17 00:00:00 2001 From: muaz-32 <96006730+muaz-32@users.noreply.github.com> Date: Wed, 20 Mar 2024 17:58:47 +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 | 11 +++++++++ .../org/polypheny/db/webui/HttpServer.java | 23 +++++++++++++++++++ 6 files changed, 44 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 00fdac3dd5..33d066d1b1 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( " Polypheny-DB successfully started and ready to process your queries!" ); 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( " For Swagger documentation:" ); + log.info( " http://localhost:{}/swagger", RuntimeConfig.WEBUI_SERVER_PORT.getInteger() ); log.info( "****************************************************************************************************" ); isReady = true; diff --git a/gradle.properties b/gradle.properties index 35f774fda0..28f5bbeb01 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..70f0550d76 100644 --- a/webui/build.gradle +++ b/webui/build.gradle @@ -26,6 +26,10 @@ 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 314da24ff9..dea66a316d 100644 --- a/webui/src/main/java/org/polypheny/db/webui/Crud.java +++ b/webui/src/main/java/org/polypheny/db/webui/Crud.java @@ -67,6 +67,10 @@ 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; @@ -2058,6 +2062,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 ) { AdapterModel a = ctx.bodyAsClass( AdapterModel.class ); Map settings = new HashMap<>(); 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..4858b40534 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,7 @@ public class HttpServer implements Runnable { @Getter private WebSocket webSocketHandler; + String deprecatedDocsPath = "/swagger-docs"; public static HttpServer getInstance() { if ( INSTANCE == null ) { @@ -82,12 +87,30 @@ public static HttpServer getInstance() { writerWithDefaultPrettyPrinter(); } }; + + + 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; + } + @Getter private final Javalin server = Javalin.create( config -> { 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;