Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -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();
Comment on lines 298 to 299

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Record the HTTP server only after startup succeeds

When JavalinHttpServer.start() throws, such as while the configured port is temporarily occupied, httpServer remains non-null. If the caller fixes the cause and retries startHttpServer(), the new guard returns without attempting to bind, leaving this MainImplementation permanently unable to start; assign the field only after a successful start or clear it on failure.

Useful? React with 👍 / 👎.


System.out.println("Running on " + proxyport);
System.out.println(" e.g. http://localhost:" + proxyport);
}

public ThingifierHttpApiRoutings startRestServer() {
configureRestServer();
startHttpServer();

return restServer;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1146,7 +1146,9 @@ private List<String> 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);
}
}

/**
Expand All @@ -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);
}
}

/**
Expand All @@ -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);
}
}

/**
Expand All @@ -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);
}
}

/**
Expand All @@ -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);
}
}

/**
Expand All @@ -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);
}
}

/**
Expand All @@ -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);
}
}

/**
Expand All @@ -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);
}

/**
Expand Down
Loading