From 7cde238b4fd6ae932d3c0561cbf03285e2b07a0d Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Thu, 3 Mar 2022 13:12:40 -0700
Subject: [PATCH] Add source model method

---
 .../www/NetcdfServiceGroundMotions.java       |  5 +++
 .../netcdf/www/NetcdfServiceHazardCurves.java | 44 ++++++++++++++++---
 2 files changed, 43 insertions(+), 6 deletions(-)

diff --git a/src/aashto/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfServiceGroundMotions.java b/src/aashto/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfServiceGroundMotions.java
index 9792bd3..42d3e4a 100644
--- a/src/aashto/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfServiceGroundMotions.java
+++ b/src/aashto/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfServiceGroundMotions.java
@@ -53,6 +53,11 @@ public class NetcdfServiceGroundMotions extends NetcdfService {
     return SERVICE_NAME;
   }
 
+  @Override
+  SourceModel getSourceModel() {
+    return new SourceModel();
+  }
+
   @Override
   NetcdfGroundMotions netcdf() {
     return (NetcdfGroundMotions) netcdf;
diff --git a/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfServiceHazardCurves.java b/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfServiceHazardCurves.java
index 1077ff6..fb78a99 100644
--- a/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfServiceHazardCurves.java
+++ b/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfServiceHazardCurves.java
@@ -51,6 +51,11 @@ public class NetcdfServiceHazardCurves extends NetcdfService {
     return SERVICE_NAME;
   }
 
+  @Override
+  SourceModel getSourceModel() {
+    return new HazardSourceModel();
+  }
+
   @Override
   NetcdfHazardCurves netcdf() {
     return (NetcdfHazardCurves) netcdf;
@@ -91,19 +96,38 @@ public class NetcdfServiceHazardCurves extends NetcdfService {
         .build();
   }
 
+  ResponseBody<RequestDataSiteClass, ResponseData<ResponseMetadata>> processCurvesImt(
+      RequestDataImt request,
+      String url) {
+    WsUtils.checkValue(Key.LATITUDE, request.latitude);
+    WsUtils.checkValue(Key.LONGITUDE, request.longitude);
+    WsUtils.checkValue(Key.SITE_CLASS, request.siteClass);
+    WsUtils.checkValue(Key.IMT, request.imt);
+    var curves = netcdf().staticData(request.site, request.siteClass);
+
+    return ResponseBody.<RequestDataSiteClass, ResponseData<ResponseMetadata>> usage()
+        .name(SERVICE_NAME)
+        .request(request)
+        .response(toResponseData(request, curves.get(request.imt)))
+        .url(url)
+        .build();
+  }
+
   @Override
   ResponseBody<?, ?> processRequest(HttpRequest<?> httpRequest, Query query, Service service) {
     var site = Location.create(query.longitude, query.latitude);
-    var requestData = new RequestData(site);
     var url = httpRequest.getUri().toString();
 
     switch (service) {
       case CURVES:
+        var requestData = new RequestData(site);
         return processCurves(requestData, url);
       case CURVES_BY_SITE_CLASS:
-        requestData = new RequestDataSiteClass(site, query.siteClass);
-        return processCurvesSiteClass(
-            (RequestDataSiteClass) requestData, url);
+        var requestDataSiteClass = new RequestDataSiteClass(site, query.siteClass);
+        return processCurvesSiteClass(requestDataSiteClass, url);
+      case CURVES_BY_IMT:
+        var requestDataImt = new RequestDataImt(site, query.siteClass, query.imt);
+        return processCurvesImt(requestDataImt, url);
       default:
         throw new RuntimeException("Netcdf service [" + service + "] not found");
     }
@@ -114,7 +138,7 @@ public class NetcdfServiceHazardCurves extends NetcdfService {
       StaticDataHazardCurves curves) {
     return curves.entrySet().stream()
         .map((entry) -> {
-          return toResponseData(request, entry.getKey(), entry.getValue());
+          return toResponseData(request, entry.getValue());
         })
         .collect(Collectors.toList());
   }
@@ -132,10 +156,18 @@ public class NetcdfServiceHazardCurves extends NetcdfService {
 
   ResponseData<ResponseMetadata> toResponseData(
       RequestDataSiteClass request,
-      Imt imt,
       XySequence curves) {
     var metadata =
         new ResponseMetadata(X_LABEL, Y_LABEL);
     return new ResponseData<>(metadata, curves);
   }
+
+  class HazardSourceModel extends SourceModel {
+    public final List<Imt> imts;
+
+    HazardSourceModel() {
+      super();
+      imts = netcdf().netcdfData().imts().stream().sorted().collect(Collectors.toList());
+    }
+  }
 }
-- 
GitLab