From 5501443769bee39ce277337666ac00184f95acda Mon Sep 17 00:00:00 2001 From: Brandon Clayton <bclayton@usgs.gov> Date: Wed, 24 Mar 2021 08:55:20 -0600 Subject: [PATCH] add nshmp-we-utils --- .../nshmp/netcdf/www/NetcdfController.java | 11 +- .../nshmp/netcdf/www/NetcdfService.java | 119 ++++++++++-------- .../nshmp/netcdf/www/NetcdfWsUtils.java | 13 +- 3 files changed, 78 insertions(+), 65 deletions(-) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfController.java b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfController.java index 98cbaa1..42129d2 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfController.java @@ -7,7 +7,7 @@ import javax.inject.Inject; import gov.usgs.earthquake.nshmp.gmm.Imt; import gov.usgs.earthquake.nshmp.gmm.NehrpSiteClass; -import gov.usgs.earthquake.nshmp.internal.www.NshmpMicronautServlet; +import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet; import gov.usgs.earthquake.nshmp.netcdf.NshmGroup; import io.micronaut.context.annotation.Value; @@ -72,9 +72,8 @@ public class NetcdfController { @Schema(required = true) @QueryValue @Nullable Double latitude, @QueryValue @Nullable NehrpSiteClass siteClass, @QueryValue @Nullable Imt imt) { - var urlHelper = servlet.urlHelper(request); var query = new Query(longitude, latitude, siteClass, imt); - return NetcdfService.handleDoGet(nshmGroup, path, urlHelper, query); + return NetcdfService.handleDoGet(request, nshmGroup, path, query); } /** @@ -174,8 +173,7 @@ public class NetcdfController { schema = @Schema(type = "string"))) @Get(uri = "/border", produces = MediaType.APPLICATION_JSON) public HttpResponse<String> doGetBorder(HttpRequest<?> request) { - var urlHelper = servlet.urlHelper(request); - return NetcdfService.handleDoGetBorder(nshmGroup, path, urlHelper); + return NetcdfService.handleDoGetBorder(request, nshmGroup, path); } /** @@ -191,9 +189,8 @@ public class NetcdfController { HttpRequest<?> request, @Schema(required = true) @QueryValue @Nullable Double longitude, @Schema(required = true) @QueryValue @Nullable Double latitude) { - var urlHelper = servlet.urlHelper(request); var query = new Query(longitude, latitude, null, null); - return NetcdfService.handleDoGetBounding(nshmGroup, path, urlHelper, query); + return NetcdfService.handleDoGetBounding(request, nshmGroup, path, query); } /** diff --git a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfService.java b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfService.java index 7df22e0..d020df0 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfService.java @@ -14,10 +14,9 @@ import gov.usgs.earthquake.nshmp.geo.json.Feature; import gov.usgs.earthquake.nshmp.geo.json.GeoJson; import gov.usgs.earthquake.nshmp.gmm.Imt; import gov.usgs.earthquake.nshmp.gmm.NehrpSiteClass; -import gov.usgs.earthquake.nshmp.internal.www.NshmpMicronautServlet.UrlHelper; -import gov.usgs.earthquake.nshmp.internal.www.Response; -import gov.usgs.earthquake.nshmp.internal.www.WsUtils; -import gov.usgs.earthquake.nshmp.internal.www.meta.Status; +import gov.usgs.earthquake.nshmp.www.Response; +import gov.usgs.earthquake.nshmp.www.WsUtils; +import gov.usgs.earthquake.nshmp.www.meta.Status; import gov.usgs.earthquake.nshmp.netcdf.NshmGroup; import gov.usgs.earthquake.nshmp.netcdf.NshmNetcdfReader; import gov.usgs.earthquake.nshmp.netcdf.reader.BoundingHazards; @@ -27,6 +26,7 @@ import gov.usgs.earthquake.nshmp.netcdf.www.NetcdfController.Query; import gov.usgs.earthquake.nshmp.netcdf.www.NetcdfController.Service; import gov.usgs.earthquake.nshmp.netcdf.www.NetcdfWsUtils.Key; +import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; /** @@ -40,62 +40,67 @@ public class NetcdfService { private static NshmNetcdfReader netcdf; - private static final String SERVICE_NAME = "Netcdf NSHM Service"; - private static final String SERVICE_DESCRIPTION = "Get static hazard curves from a NetCDF file"; - private static final String SERVICE_SYNTAX = "%s/"; + private static String SERVICE_NAME = "Netcdf NSHM Service for the %s"; + private static String SERVICE_DESCRIPTION = "Get static hazard curves for the %s"; private static final Logger LOGGER = Logger.getLogger(NetcdfService.class.getName()); static HttpResponse<String> handleDoGet( + HttpRequest<?> request, NshmGroup nshmGroup, Path path, - UrlHelper urlHelper, Query query) { + SERVICE_NAME = String.format(SERVICE_NAME, nshmGroup.toString()); try { setNetcdf(nshmGroup, path); - LOGGER.info(SERVICE_NAME + " - Request: " + urlHelper.url); - LOGGER.info(SERVICE_NAME + " - Query:\n" + GSON.toJson(query)); + var url = request.getUri().toString(); + LOGGER.info(SERVICE_NAME + " - Request: " + url); + LOGGER.fine(SERVICE_NAME + " - Query:\n" + GSON.toJson(query)); if (query.longitude == null && query.latitude == null) { - return metadata(nshmGroup, path, urlHelper); + return metadata(request, nshmGroup, path); } - var service = getService(nshmGroup, path, query, urlHelper); - Response<?, ?> svcResponse = processRequest(netcdf, service, query, urlHelper); + var service = getService(nshmGroup, path, query); + Response<?, ?> svcResponse = processRequest(request, netcdf, service, query); var response = GSON.toJson(svcResponse); - LOGGER.info(SERVICE_NAME + " - Result:\n" + response); + LOGGER.fine(SERVICE_NAME + " - Result:\n" + response); return HttpResponse.ok(response); } catch (Exception e) { - return NetcdfWsUtils.handleError(e, SERVICE_NAME, LOGGER, urlHelper); + var url = request.getUri().toString(); + return NetcdfWsUtils.handleError(e, SERVICE_NAME, LOGGER, url); } } static HttpResponse<String> handleDoGetBounding( + HttpRequest<?> request, NshmGroup nshmGroup, Path path, - UrlHelper urlHelper, Query query) { + SERVICE_NAME = String.format(SERVICE_NAME, nshmGroup.toString()); try { setNetcdf(nshmGroup, path); - LOGGER.info(SERVICE_NAME + " - Request: " + urlHelper.url); - LOGGER.info(SERVICE_NAME + " - Query:\n" + GSON.toJson(query)); + // LOGGER.info(SERVICE_NAME + " - Request: " + urlHelper.url); + LOGGER.fine(SERVICE_NAME + " - Query:\n" + GSON.toJson(query)); if (query.longitude == null && query.latitude == null) { - return metadata(nshmGroup, path, urlHelper); + return metadata(request, nshmGroup, path); } - Response<?, ?> svcResponse = processRequest(netcdf, Service.BOUNDING, query, urlHelper); + Response<?, ?> svcResponse = processRequest(request, netcdf, Service.BOUNDING, query); var response = GSON.toJson(svcResponse); - LOGGER.info(SERVICE_NAME + " - Result:\n" + response); + LOGGER.fine(SERVICE_NAME + " - Result:\n" + response); return HttpResponse.ok(response); } catch (Exception e) { - return NetcdfWsUtils.handleError(e, SERVICE_NAME, LOGGER, urlHelper); + var url = request.getUri().toString(); + return NetcdfWsUtils.handleError(e, SERVICE_NAME, LOGGER, url); } } static HttpResponse<String> handleDoGetBorder( + HttpRequest<?> request, NshmGroup nshmGroup, - Path path, - UrlHelper urlHelper) { + Path path) { + SERVICE_NAME = String.format(SERVICE_NAME, nshmGroup.toString()); try { setNetcdf(nshmGroup, path); var geojson = GeoJson.builder(); @@ -112,26 +117,29 @@ public class NetcdfService { return HttpResponse.ok(geojson.build().toJson()); } catch (Exception e) { - return NetcdfWsUtils.handleError(e, SERVICE_NAME, LOGGER, urlHelper); + var url = request.getUri().toString(); + return NetcdfWsUtils.handleError(e, SERVICE_NAME, LOGGER, url); } } - static HttpResponse<String> metadata(NshmGroup nshmGroup, Path path, UrlHelper urlHelper) { + static HttpResponse<String> metadata(HttpRequest<?> request, NshmGroup nshmGroup, Path path) { try { setNetcdf(nshmGroup, path); String netcdfFile = path == null ? "" : path.toString(); - var metadata = new Metadata(netcdfFile, urlHelper); + var metadata = new Metadata(request, nshmGroup, netcdfFile); + var url = request.getUri().toString(); var svcResponse = - new Response<>(Status.USAGE, SERVICE_NAME, urlHelper.url, metadata, urlHelper); + new Response<>(Status.USAGE, SERVICE_NAME, url, metadata, url); var response = GSON.toJson(svcResponse); - LOGGER.info(SERVICE_NAME + " - Result:\n" + response); + LOGGER.fine(SERVICE_NAME + " - Result:\n" + response); return HttpResponse.ok(response); } catch (Exception e) { - return NetcdfWsUtils.handleError(e, SERVICE_NAME, LOGGER, urlHelper); + var url = request.getUri().toString(); + return NetcdfWsUtils.handleError(e, SERVICE_NAME, LOGGER, url); } } - static Service getService(NshmGroup nshmGroup, Path path, Query query, UrlHelper urlHelper) { + static Service getService(NshmGroup nshmGroup, Path path, Query query) { if (query.siteClass != null && query.imt != null) { return Service.CURVES_BY_SITE_CLASS_IMT; } else if (query.siteClass != null && query.imt == null) { @@ -142,26 +150,26 @@ public class NetcdfService { } static Response<?, ?> processRequest( + HttpRequest<?> request, NshmNetcdfReader netcdf, Service service, - Query query, - UrlHelper urlHelper) { - RequestData requestData = new RequestData(query.longitude, query.latitude); + Query query) { + var requestData = new RequestData(query.longitude, query.latitude); + var url = request.getUri().toString(); switch (service) { case BOUNDING: - return processBounding(requestData, urlHelper); + return processBounding(requestData, url); case CURVES: - return processCurves(requestData, urlHelper); + return processCurves(requestData, url); case CURVES_BY_SITE_CLASS: requestData = new RequestDataCurves(query.longitude, query.latitude, query.siteClass); return processCurvesSiteClass( - (RequestDataCurves) requestData, - urlHelper); + (RequestDataCurves) requestData, url); case CURVES_BY_SITE_CLASS_IMT: requestData = new RequestDataCurve( query.longitude, query.latitude, query.siteClass, query.imt); - return processCurve((RequestDataCurve) requestData, urlHelper); + return processCurve((RequestDataCurve) requestData, url); default: throw new RuntimeException("Netcdf service [" + service + "] not found"); } @@ -169,38 +177,38 @@ public class NetcdfService { static Response<RequestData, List<List<List<ResponseData>>>> processBounding( RequestData request, - UrlHelper urlHelper) { + String url) { WsUtils.checkValue(Key.LATITUDE, request.site.latitude); WsUtils.checkValue(Key.LONGITUDE, request.site.longitude); var bounding = netcdf.boundingHazards(request.site); var boundingAsList = toLists(netcdf.nshmGroup(), request.site, bounding); - return new Response<>(Status.SUCCESS, SERVICE_NAME, request, boundingAsList, urlHelper); + return new Response<>(Status.SUCCESS, SERVICE_NAME, request, boundingAsList, url); } static Response<RequestData, List<List<ResponseData>>> processCurves( RequestData request, - UrlHelper urlHelper) { + String url) { WsUtils.checkValue(Key.LATITUDE, request.site.latitude); WsUtils.checkValue(Key.LONGITUDE, request.site.longitude); var curves = netcdf.hazard(request.site); var curvesAsList = toList(netcdf.nshmGroup(), request.site, curves); - return new Response<>(Status.SUCCESS, SERVICE_NAME, request, curvesAsList, urlHelper); + return new Response<>(Status.SUCCESS, SERVICE_NAME, request, curvesAsList, url); } static Response<RequestDataCurves, List<ResponseData>> processCurvesSiteClass( RequestDataCurves request, - UrlHelper urlHelper) { + String url) { WsUtils.checkValue(Key.LATITUDE, request.site.latitude); WsUtils.checkValue(Key.LONGITUDE, request.site.longitude); WsUtils.checkValue(Key.SITE_CLASS, request.siteClass); var curves = netcdf.hazard(request.site, request.siteClass); var curvesAsList = toList(netcdf.nshmGroup(), request, curves); - return new Response<>(Status.SUCCESS, SERVICE_NAME, request, curvesAsList, urlHelper); + return new Response<>(Status.SUCCESS, SERVICE_NAME, request, curvesAsList, url); } static Response<RequestDataCurve, ResponseData> processCurve( RequestDataCurve request, - UrlHelper urlHelper) { + String url) { WsUtils.checkValue(Key.LATITUDE, request.site.latitude); WsUtils.checkValue(Key.LONGITUDE, request.site.longitude); WsUtils.checkValue(Key.SITE_CLASS, request.siteClass); @@ -211,7 +219,7 @@ public class NetcdfService { netcdf.nshmGroup(), site.longitude, site.latitude, request.siteClass, request.imt); var curve = netcdf.hazard(request.site, request.siteClass, request.imt); var responseData = new ResponseData(metadata, curve); - return new Response<>(Status.SUCCESS, SERVICE_NAME, request, responseData, urlHelper); + return new Response<>(Status.SUCCESS, SERVICE_NAME, request, responseData, url); } static List<List<List<ResponseData>>> toLists( @@ -307,12 +315,21 @@ public class NetcdfService { static class Metadata { final String description; - final String syntax; + final String[] syntax; final Parameters parameters; - Metadata(String netcdfFile, UrlHelper urlHelper) { - description = SERVICE_DESCRIPTION; - syntax = String.format(SERVICE_SYNTAX, urlHelper.urlPrefix); + Metadata(HttpRequest<?> request, NshmGroup nshmGroup, String netcdfFile) { + var url = request.getUri().toString(); + description = String.format(SERVICE_DESCRIPTION, nshmGroup.toString()); + syntax = new String[]{ + url + "/{longitude:number}/{latitude:number}", + url + "?longitude={number}&latitude={number}", + url + "/{longitude:number}/{latitude:number}/{siteClass:NehrpSiteClass}", + url + "?longitude={number}&latitude={number}&siteClass={NehrpSiteClass}", + url + "/{longitude:number}/{latitude:number}/{siteClass:NehrpSiteClass}/{imt:Imt}", + url + "?longitude={number}&latitude={number}&siteClass={NehrpSiteClass}&imt={imt}", + url + "/border" + }; parameters = new Parameters(netcdfFile); } } diff --git a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfWsUtils.java b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfWsUtils.java index 0bc1ebd..44a6ed5 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfWsUtils.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfWsUtils.java @@ -10,11 +10,10 @@ import com.google.gson.GsonBuilder; import gov.usgs.earthquake.nshmp.gmm.Imt; import gov.usgs.earthquake.nshmp.gmm.NehrpSiteClass; -import gov.usgs.earthquake.nshmp.internal.www.NshmpMicronautServlet.UrlHelper; -import gov.usgs.earthquake.nshmp.internal.www.Response; -import gov.usgs.earthquake.nshmp.internal.www.WsUtils.EnumSerializer; -import gov.usgs.earthquake.nshmp.internal.www.WsUtils.NaNSerializer; -import gov.usgs.earthquake.nshmp.internal.www.meta.Status; +import gov.usgs.earthquake.nshmp.www.Response; +import gov.usgs.earthquake.nshmp.www.WsUtils.EnumSerializer; +import gov.usgs.earthquake.nshmp.www.WsUtils.NaNSerializer; +import gov.usgs.earthquake.nshmp.www.meta.Status; import gov.usgs.earthquake.nshmp.netcdf.NshmGroup; import io.micronaut.http.HttpResponse; @@ -39,9 +38,9 @@ public class NetcdfWsUtils { Throwable e, String name, Logger logger, - UrlHelper urlHelper) { + String url) { var msg = e.getMessage() + " (see logs)"; - var svcResponse = new Response<>(Status.ERROR, name, urlHelper.url, msg, urlHelper); + var svcResponse = new Response<>(Status.ERROR, name, url, msg, url); var response = GSON.toJson(svcResponse); logger.severe(name + " -\n" + response); e.printStackTrace(); -- GitLab