From 7041a84e34ce778e7a95bc3837adb3bbfd780e3c Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Thu, 21 Jul 2022 09:40:57 -0600
Subject: [PATCH] Switch to data files, add nshm

---
 .../nshmp/netcdf/www/NetcdfController.java    | 62 +++++++++++--------
 1 file changed, 35 insertions(+), 27 deletions(-)

diff --git a/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfController.java b/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfController.java
index f14d844..32a8b89 100644
--- a/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfController.java
+++ b/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfController.java
@@ -5,10 +5,11 @@ import java.util.List;
 
 import gov.usgs.earthquake.nshmp.gmm.Imt;
 import gov.usgs.earthquake.nshmp.gmm.NehrpSiteClass;
-import gov.usgs.earthquake.nshmp.netcdf.NetcdfHazardCurves;
-import gov.usgs.earthquake.nshmp.netcdf.www.Metadata.HazardResponseMetadata;
-import gov.usgs.earthquake.nshmp.netcdf.www.Request.RequestDataImt;
+import gov.usgs.earthquake.nshmp.netcdf.NetcdfDataFilesHazardCurves;
+import gov.usgs.earthquake.nshmp.netcdf.Nshm;
+import gov.usgs.earthquake.nshmp.netcdf.www.HazardMetadata.HazardResponseMetadata;
 import gov.usgs.earthquake.nshmp.netcdf.www.Request.RequestDataSiteClass;
+import gov.usgs.earthquake.nshmp.netcdf.www.RequestHazardCurves.HazardRequestDataImt;
 import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet;
 import gov.usgs.earthquake.nshmp.www.ResponseBody;
 
@@ -46,7 +47,7 @@ public class NetcdfController {
   @Inject
   private NshmpMicronautServlet servlet;
 
-  @Value("${nshmp-ws-static.netcdf-file}")
+  @Value("${nshmp-ws-static.netcdf-path}")
   Path netcdfPath;
 
   NetcdfServiceHazardCurves service;
@@ -56,8 +57,8 @@ public class NetcdfController {
    */
   @EventListener
   void startup(StartupEvent event) {
-    var netcdfHazard = new NetcdfHazardCurves(netcdfPath);
-    service = new NetcdfServiceHazardCurves(netcdfHazard);
+    var netcdfDataFiles = new NetcdfDataFilesHazardCurves(netcdfPath);
+    service = new NetcdfServiceHazardCurves(netcdfDataFiles);
   }
 
   /**
@@ -86,11 +87,11 @@ public class NetcdfController {
 
           "### Service call pattern\n" +
           "This service call is slashed delimited with pattern: " +
-          "`/hazard/{longitude}/{latitude}/{siteClass}/{imt}`\n" +
+          "`/hazard/{nshm}/{longitude}/{latitude}/{siteClass}/{imt}`\n" +
           "<br><br>" +
-          "Example: `/hazard/-118/34/BC/PGA`" +
+          "Example: `/hazard/CONUS_2018/-118/34/BC/PGA`" +
           "<br><br>" +
-          "CSV Example: `/hazard/-118/34/BC/PGA?format=CSV`",
+          "CSV Example: `/hazard/CONUS_2018/-118/34/BC/PGA?format=CSV`",
       operationId = "hazard-by-imt")
   @ApiResponse(
       description = "Spatially interpolated hazard curves",
@@ -109,17 +110,18 @@ public class NetcdfController {
                       "Ground Motion (g),0.00233,0.0035,0.00524,0.00786,0.0118, ...\n" +
                       "Annual Frequency of Exceedence,0.036386,0.026034,0.018125,0.012197, ...\n"))
       })
-  @Get(uri = "/{longitude}/{latitude}/{siteClass}/{imt}{?format}",
+  @Get(uri = "/{nshm}/{longitude}/{latitude}/{siteClass}/{imt}{?format}",
       produces = MediaType.APPLICATION_JSON)
   public HttpResponse<String> doGetSlashByImt(
       HttpRequest<?> request,
+      @Schema(required = true) @PathVariable Nshm nshm,
       @Schema(required = true) @PathVariable Double latitude,
       @Schema(required = true) @PathVariable Double longitude,
       @Schema(required = true) @PathVariable NehrpSiteClass siteClass,
       @Schema(required = true) @PathVariable Imt imt,
       @Schema(required = false, defaultValue = "JSON",
           implementation = ResponseFormat.class) @QueryValue @Nullable ResponseFormat format) {
-    return doGet(request, longitude, latitude, siteClass, imt, format);
+    return doGet(request, nshm, longitude, latitude, siteClass, imt, format);
   }
 
   /**
@@ -148,11 +150,11 @@ public class NetcdfController {
 
           "### Service call pattern\n" +
           "This service call is slashed delimited with pattern: " +
-          "`/hazard/{longitude}/{latitude}/{siteClass}`\n" +
+          "`/hazard/{nshm}/{longitude}/{latitude}/{siteClass}`\n" +
           "<br><br>" +
-          "Example: `/hazard/-118/34/BC`" +
+          "Example: `/hazard/CONUS_2018/-118/34/BC`" +
           "<br><br>" +
-          "Example: `/hazard/-118/34/BC?format=CSV`",
+          "Example: `/hazard/CONUS_2018/-118/34/BC?format=CSV`",
       operationId = "hazard-by-siteclass")
   @ApiResponse(
       description = "Spatially interpolated hazard curves",
@@ -174,15 +176,17 @@ public class NetcdfController {
                       "..."))
 
       })
-  @Get(uri = "/{longitude}/{latitude}/{siteClass}{?format}", produces = MediaType.APPLICATION_JSON)
+  @Get(uri = "/{nshm}/{longitude}/{latitude}/{siteClass}{?format}",
+      produces = MediaType.APPLICATION_JSON)
   public HttpResponse<String> doGetSlashBySite(
       HttpRequest<?> request,
+      @Schema(required = true) @PathVariable Nshm nshm,
       @Schema(required = true) @PathVariable Double latitude,
       @Schema(required = true) @PathVariable Double longitude,
       @Schema(required = true) @PathVariable NehrpSiteClass siteClass,
       @Schema(required = false, defaultValue = "JSON",
           implementation = ResponseFormat.class) @QueryValue @Nullable ResponseFormat format) {
-    return doGet(request, longitude, latitude, siteClass, null, format);
+    return doGet(request, nshm, longitude, latitude, siteClass, null, format);
   }
 
   /**
@@ -209,11 +213,11 @@ public class NetcdfController {
 
           "### Service call pattern\n" +
           "This service call is slashed delimited with pattern: " +
-          "`/hazard/{longitude}/{latitude}`\n" +
+          "`/hazard/{nshm}/{longitude}/{latitude}`\n" +
           "<br><br>" +
-          "Example: `/hazard/-118/34`" +
+          "Example: `/hazard/CONUS_2018/-118/34`" +
           "<br><br>" +
-          "Example: `/hazard/-118/34?format=CSV`",
+          "Example: `/hazard/conus_2018/-118/34?format=CSV`",
       operationId = "hazard")
   @ApiResponse(
       description = "Returns static curves from the NSHM NetCDF file",
@@ -235,20 +239,22 @@ public class NetcdfController {
                       "..."))
 
       })
-  @Get(uri = "/{longitude}/{latitude}{?format}", produces = MediaType.APPLICATION_JSON)
+  @Get(uri = "/{nshm}/{longitude}/{latitude}{?format}", produces = MediaType.APPLICATION_JSON)
   public HttpResponse<String> doGetSlash(
       HttpRequest<?> request,
+      @Schema(required = true) @PathVariable Nshm nshm,
       @Schema(required = true) @PathVariable Double longitude,
       @Schema(required = true) @PathVariable Double latitude,
       @Schema(required = false, defaultValue = "JSON",
           implementation = ResponseFormat.class) @QueryValue @Nullable ResponseFormat format) {
-    return doGet(request, longitude, latitude, null, null, format);
+    return doGet(request, nshm, longitude, latitude, null, null, format);
   }
 
   /**
    * GET method to return a static curve using URL query.
    *
    * @param request The HTTP request
+   * @param nshm The NSHM to query
    * @param longitude The longitude of the site
    * @param latitude Latitude of the site
    * @param siteClass The site class (optional)
@@ -271,12 +277,12 @@ public class NetcdfController {
 
           "### Service call pattern\n" +
           "This service call is query based with pattern: " +
-          "`/hazard?longitude={number}&latitude={number}" +
+          "`/hazard?nshm={string}&longitude={number}&latitude={number}" +
           "&siteClass={string}&imt={string}&format={CSV|JSON}`\n" +
           "<br><br>" +
-          "Example: `/hazard?longitude=-118&latitude=34&siteClass=A&imt=PGA`" +
+          "Example: `/hazard?nshm=CONUS_2018&longitude=-118&latitude=34&siteClass=A&imt=PGA`" +
           "<br><br>" +
-          "CSV Example: `/hazard?longitude=-118&latitude=34&siteClass=A&imt=PGA?format=CSV`",
+          "CSV Example: `/hazard?nshm=CONUS_2018&longitude=-118&latitude=34&siteClass=A&imt=PGA?format=CSV`",
       operationId = "hazard-by-imt")
   @ApiResponse(
       description = "Spatially interpolated hazard curves",
@@ -298,23 +304,25 @@ public class NetcdfController {
                       "..."))
 
       })
-  @Get(uri = "{?longitude,latitude,siteClass,imt,format}", produces = MediaType.APPLICATION_JSON)
+  @Get(uri = "{?nshm,longitude,latitude,siteClass,imt,format}",
+      produces = MediaType.APPLICATION_JSON)
   public HttpResponse<String> doGet(
       HttpRequest<?> request,
+      @Schema(required = true) @QueryValue @Nullable Nshm nshm,
       @Schema(required = true) @QueryValue @Nullable Double longitude,
       @Schema(required = true) @QueryValue @Nullable Double latitude,
       @QueryValue @Nullable NehrpSiteClass siteClass,
       @QueryValue @Nullable Imt imt,
       @Schema(required = false, defaultValue = "JSON",
           implementation = ResponseFormat.class) @QueryValue @Nullable ResponseFormat format) {
-    var query = new HazardQuery(longitude, latitude, siteClass, imt, format);
+    var query = new HazardQuery(nshm, longitude, latitude, siteClass, imt, format);
     return service.handleServiceCall(request, query);
   }
 
   // For Swagger schema
   private static class ResponseByImt
       extends
-      ResponseBody<RequestDataImt, ResponseData<HazardResponseMetadata>> {}
+      ResponseBody<HazardRequestDataImt, ResponseData<HazardResponseMetadata>> {}
 
   // For Swagger schema
   private static class ResponseBySiteClass
-- 
GitLab