From 97181b72dbee6eb95488c77c3e615afe2a00af6d Mon Sep 17 00:00:00 2001 From: Alex Leigh Date: Sun, 18 Jun 2023 00:28:55 -0700 Subject: [PATCH] Sketching out Object service. --- .../lc/mecha/http/server/PrefixedHandler.java | 5 +- .../lc/mecha/http/server/WebPipeline.java | 2 +- .../main/java/lc/obj/svc/BucketHandler.java | 31 ++++++++++++ .../java/lc/obj/svc/ObjectHandlerRouter.java | 50 +++++++++++++++++++ .../main/java/lc/obj/svc/ObjectService.java | 7 +++ java/lc-obj/build.gradle | 1 + java/lc-obj/openapi.yaml | 35 +++++++++++++ .../src/main/java/lc/obj/ObjectStore.java | 5 ++ 8 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 java/lc-obj-svc/src/main/java/lc/obj/svc/BucketHandler.java create mode 100644 java/lc-obj-svc/src/main/java/lc/obj/svc/ObjectHandlerRouter.java create mode 100644 java/lc-obj/openapi.yaml create mode 100644 java/lc-obj/src/main/java/lc/obj/ObjectStore.java diff --git a/java/lc-mecha-http-server/src/main/java/lc/mecha/http/server/PrefixedHandler.java b/java/lc-mecha-http-server/src/main/java/lc/mecha/http/server/PrefixedHandler.java index 63bd5f59e..9691cc164 100644 --- a/java/lc-mecha-http-server/src/main/java/lc/mecha/http/server/PrefixedHandler.java +++ b/java/lc-mecha-http-server/src/main/java/lc/mecha/http/server/PrefixedHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-2017, by Alex Leigh. + * Copyright (c) 2004-2023, by Alex Leigh. * All rights reserved. * * THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE @@ -19,7 +19,8 @@ import java.util.Set; /** * This handler implements a WebHandler that will only execute - * if the requested path starts with the associated prefix path. + * if the requested path starts with the associated prefix path. More than one path can be associated + * with the handler. *

* Note: It is not particularly well performing to use a lot of these; in the case where you need * more than 20 or 30 in a single WebServer it may be better to implement diff --git a/java/lc-mecha-http-server/src/main/java/lc/mecha/http/server/WebPipeline.java b/java/lc-mecha-http-server/src/main/java/lc/mecha/http/server/WebPipeline.java index 4b91fe997..7a5ee36f9 100644 --- a/java/lc-mecha-http-server/src/main/java/lc/mecha/http/server/WebPipeline.java +++ b/java/lc-mecha-http-server/src/main/java/lc/mecha/http/server/WebPipeline.java @@ -64,7 +64,7 @@ public final class WebPipeline extends AbstractHandler { try { servicePipeline.send(KEY_SERVICE, wr); } catch (Throwable e) { - logger.debug("Handler threw", e); + logger.warn("Handler threw", e); try { httpServletResponse.sendError(500); } catch (IOException e1) { diff --git a/java/lc-obj-svc/src/main/java/lc/obj/svc/BucketHandler.java b/java/lc-obj-svc/src/main/java/lc/obj/svc/BucketHandler.java new file mode 100644 index 000000000..80c91d7a9 --- /dev/null +++ b/java/lc-obj-svc/src/main/java/lc/obj/svc/BucketHandler.java @@ -0,0 +1,31 @@ +package lc.obj.svc; + +import lc.esp.engine.AuthenticatedHandler; +import lc.esp.engine.Directory; +import lc.mecha.fabric.HandlerStatus; +import lc.mecha.http.server.WebTransaction; +import lc.mecha.log.MechaLogger; +import lc.mecha.log.MechaLoggerFactory; + +import java.util.Set; + +/** + * Implements the handler for root bucket interactions, including creating and deleting buckets. + * + * @author Alex Leigh + * @since mk1 + */ +public class BucketHandler extends AuthenticatedHandler { + private static final MechaLogger logger = MechaLoggerFactory.getLogger(BucketHandler.class); + + public BucketHandler(Set path, Directory dir) { + super(path, dir); + } + + @Override + public HandlerStatus handleAuthenticated(WebTransaction request, Directory dir, String userId) throws Exception { + logger.info("Received request to create bucket: [request: {}]", request); + + return HandlerStatus.BREAK; + } +} diff --git a/java/lc-obj-svc/src/main/java/lc/obj/svc/ObjectHandlerRouter.java b/java/lc-obj-svc/src/main/java/lc/obj/svc/ObjectHandlerRouter.java new file mode 100644 index 000000000..26a893208 --- /dev/null +++ b/java/lc-obj-svc/src/main/java/lc/obj/svc/ObjectHandlerRouter.java @@ -0,0 +1,50 @@ +package lc.obj.svc; + +import lc.esp.engine.ESPEngine; +import lc.mecha.fabric.HandlerStatus; +import lc.mecha.http.server.PrefixedHandler; +import lc.mecha.http.server.WebTransaction; +import lc.mecha.log.MechaLogger; +import lc.mecha.log.MechaLoggerFactory; + +import java.util.Set; + +/** + * This class is intended to be registered within an {@link lc.esp.engine.ESPEngine} and provides the main entry + * point for the overall Object service. Depending on the URL provided in the request it routes the request to + * the implementing handler. + * + * @author Alex Leigh + * @since mk1 + */ +public class ObjectHandlerRouter extends PrefixedHandler { + private static final MechaLogger logger = MechaLoggerFactory.getLogger(ESPEngine.class); + private final BucketHandler bucketHandler = new BucketHandler(Set.of("/"), null); + + /** + * Create a new ObjectHandlerRouter and set the path prefix for the service. This path will be removed from + * the front of all requests prior to processing. For a typical production service, / is the + * expected path. + * + * @param pathPrefix The string path prefix. + */ + public ObjectHandlerRouter(String pathPrefix) { + super(Set.of(pathPrefix)); + } + + @Override + public HandlerStatus handlePrefixedWebRequest(WebTransaction request) throws Throwable { + logger.info("Router received request: {}", request); + + String pathInfo = request.getPathInfo(); + if (pathInfo.equals("")) { + logger.info("root handler"); + } else { + // TODO: Send a proper error? + request.httpServletResponse.setStatus(404); + request.httpServletResponse.getWriter().println("Not Found"); + } + + return HandlerStatus.BREAK; + } +} diff --git a/java/lc-obj-svc/src/main/java/lc/obj/svc/ObjectService.java b/java/lc-obj-svc/src/main/java/lc/obj/svc/ObjectService.java index 3f23a7318..07d899fbc 100644 --- a/java/lc-obj-svc/src/main/java/lc/obj/svc/ObjectService.java +++ b/java/lc-obj-svc/src/main/java/lc/obj/svc/ObjectService.java @@ -2,9 +2,16 @@ package lc.obj.svc; import lc.esp.engine.ESPEngine; +/** + * Implementation of the OBJECT API service. + * + * @author Alex Leigh + * @since mk1 + */ public class ObjectService { public static void main(String[] args) throws Exception { ESPEngine engine = new ESPEngine(); + engine.register(new ObjectHandlerRouter("/")); engine.runDangerously(); } } diff --git a/java/lc-obj/build.gradle b/java/lc-obj/build.gradle index ff662a854..872bedaf6 100644 --- a/java/lc-obj/build.gradle +++ b/java/lc-obj/build.gradle @@ -12,6 +12,7 @@ repositories { dependencies { api project(':lc-esp-engine') + api project(':lc-mecha-db-mysql') testImplementation platform('org.junit:junit-bom:5.9.1') testImplementation 'org.junit.jupiter:junit-jupiter' } diff --git a/java/lc-obj/openapi.yaml b/java/lc-obj/openapi.yaml new file mode 100644 index 000000000..e52e1d53e --- /dev/null +++ b/java/lc-obj/openapi.yaml @@ -0,0 +1,35 @@ +openapi: 3.0.3 +info: + title: Object Service API mk1 + description: Object Service API mk1 + version: 1.0.0 +servers: + - url: https://leigh-co.com/api/obj/v1 + - url: http://localhost:8080/api/obj/v1 +components: + securitySchemes: + BasicAuth: + scheme: basic + type: http +paths: + /: + put: + description: Create a new bucket. + security: + - BasicAuth: [ ] + responses: + '200': + description: OK + content: + application/json: + examples: + Success: + value: '{"router":["gw0.gdn.leigh-co.com","gw3.gdn.leigh-co.com"]}' + NOP: + value: '{"router":[]}' + '500': + description: Operation failed. An internal service error has occured. + '404': + description: Authorization failed. + '422': + description: A bucket by that name already exists. \ No newline at end of file diff --git a/java/lc-obj/src/main/java/lc/obj/ObjectStore.java b/java/lc-obj/src/main/java/lc/obj/ObjectStore.java new file mode 100644 index 000000000..959d6df05 --- /dev/null +++ b/java/lc-obj/src/main/java/lc/obj/ObjectStore.java @@ -0,0 +1,5 @@ +package lc.obj; + +public class ObjectStore { + +} -- GitLab