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 63bd5f59eab0bf33ec29742501374adcda56a247..9691cc164154336344e5bae8c2f390f05675e416 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 4b91fe9979eb91312b3990820649b5d1100a3d28..7a5ee36f9b7c276294281cb8cc53f6fe39a23dcf 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 0000000000000000000000000000000000000000..80c91d7a92ff32231b6d2fd85c6d5ea13e5544ab --- /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 0000000000000000000000000000000000000000..26a893208cc9539daf8478fa4e69d212f92bbdbc --- /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 3f23a73184f3f58f305d8863e2631bc9365431ad..07d899fbcb68f5f1735d17b0e88a2a1ddb2d86bd 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 ff662a854083bb4e1d24830efb47badb9d0e7a00..872bedaf646ddd30dcca8ead28f20b7876868d68 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 0000000000000000000000000000000000000000..e52e1d53ee94a9dcd177a487c5154f44015f22fb --- /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 0000000000000000000000000000000000000000..959d6df0561e3f1cda35c3ddfc4b1762e195a5fc --- /dev/null +++ b/java/lc-obj/src/main/java/lc/obj/ObjectStore.java @@ -0,0 +1,5 @@ +package lc.obj; + +public class ObjectStore { + +}