From 15d8d44e49670f993c790aa0a0b48e541df163f7 Mon Sep 17 00:00:00 2001 From: Alan Richardson Date: Thu, 17 Sep 2026 10:01:01 +0100 Subject: [PATCH] Stabilize HTTP API startup and request handling --- .../httpserver/MainImplementation.java | 22 +++++++- .../api/http/ThingifierHttpApi.java | 55 +++++++++++++------ 2 files changed, 58 insertions(+), 19 deletions(-) diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/httpserver/MainImplementation.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/httpserver/MainImplementation.java index ee721632..7ef5175a 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/httpserver/MainImplementation.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/adapter/httpserver/MainImplementation.java @@ -271,7 +271,10 @@ public void setupDefaultGui() { new DefaultGuiRoutings(thingifier, guiManagement).configureRoutes("/gui"); } - public ThingifierHttpApiRoutings startRestServer() { + public ThingifierHttpApiRoutings configureRestServer() { + if (restServer != null) { + return restServer; + } if (thingifier == null) { throw new RuntimeException("No Thingifier Model Setup"); @@ -280,11 +283,28 @@ public ThingifierHttpApiRoutings startRestServer() { restServer = new ThingifierServerBootstrap().startRestServer(thingifier, apiDefn, guiManagement); + return restServer; + } + + public void startHttpServer() { + if (httpServer != null) { + return; + } + + if (restServer == null) { + configureRestServer(); + } + httpServer = new JavalinHttpServer(proxyport, staticFilePath, routeRegistry); httpServer.start(); System.out.println("Running on " + proxyport); System.out.println(" e.g. http://localhost:" + proxyport); + } + + public ThingifierHttpApiRoutings startRestServer() { + configureRestServer(); + startHttpServer(); return restServer; } diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/http/ThingifierHttpApi.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/http/ThingifierHttpApi.java index e96f8538..adcae368 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/http/ThingifierHttpApi.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/http/ThingifierHttpApi.java @@ -1146,7 +1146,9 @@ private List xmlEntityNamesFor(final String path, final HttpVerb verb) { * @return HTTP API response */ public HttpApiResponse get(final HttpApiRequest request) { - return handleRequest(request, HttpVerb.GET); + synchronized (thingifier) { + return handleRequest(request, HttpVerb.GET); + } } /** @@ -1156,7 +1158,9 @@ public HttpApiResponse get(final HttpApiRequest request) { * @return HTTP API response */ public HttpApiResponse head(final HttpApiRequest request) { - return handleRequest(request, HttpVerb.HEAD); + synchronized (thingifier) { + return handleRequest(request, HttpVerb.HEAD); + } } /** @@ -1166,7 +1170,9 @@ public HttpApiResponse head(final HttpApiRequest request) { * @return HTTP API response */ public HttpApiResponse delete(final HttpApiRequest request) { - return handleRequest(request, HttpVerb.DELETE); + synchronized (thingifier) { + return handleRequest(request, HttpVerb.DELETE); + } } /** @@ -1176,7 +1182,9 @@ public HttpApiResponse delete(final HttpApiRequest request) { * @return HTTP API response */ public HttpApiResponse post(final HttpApiRequest request) { - return handleRequest(request, HttpVerb.POST); + synchronized (thingifier) { + return handleRequest(request, HttpVerb.POST); + } } /** @@ -1186,7 +1194,9 @@ public HttpApiResponse post(final HttpApiRequest request) { * @return HTTP API response */ public HttpApiResponse put(final HttpApiRequest request) { - return handleRequest(request, HttpVerb.PUT); + synchronized (thingifier) { + return handleRequest(request, HttpVerb.PUT); + } } /** @@ -1196,7 +1206,9 @@ public HttpApiResponse put(final HttpApiRequest request) { * @return HTTP API response */ public HttpApiResponse patch(final HttpApiRequest request) { - return handleRequest(request, HttpVerb.PATCH); + synchronized (thingifier) { + return handleRequest(request, HttpVerb.PATCH); + } } /** @@ -1206,7 +1218,9 @@ public HttpApiResponse patch(final HttpApiRequest request) { * @return HTTP API response */ public HttpApiResponse queryRequest(final HttpApiRequest request) { - return handleRequest(request, HttpVerb.QUERY); + synchronized (thingifier) { + return handleRequest(request, HttpVerb.QUERY); + } } /** @@ -1217,19 +1231,24 @@ public HttpApiResponse queryRequest(final HttpApiRequest request) { * @return HTTP API response */ public HttpApiResponse query(final HttpApiRequest request, final String query) { - resolveMountedPath(request); - - HttpApiResponse httpResponse = runTheHttpApiRequestHooksOn(request, HttpVerb.GET); + synchronized (thingifier) { + resolveMountedPath(request); + + HttpApiResponse httpResponse = runTheHttpApiRequestHooksOn(request, HttpVerb.GET); + + if (httpResponse == null) { + ApiResponse apiResponse = + thingifier + .api() + .get( + query, + request.getFilterableQueryParams(), + request.getHeaders()); + httpResponse = httpResponseFor(request, HttpVerb.GET, apiResponse); + } - if (httpResponse == null) { - ApiResponse apiResponse = - thingifier - .api() - .get(query, request.getFilterableQueryParams(), request.getHeaders()); - httpResponse = httpResponseFor(request, HttpVerb.GET, apiResponse); + return runTheHttpApiResponseHooksOn(request, httpResponse, HttpVerb.GET); } - - return runTheHttpApiResponseHooksOn(request, httpResponse, HttpVerb.GET); } /**