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;