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