From ce53fde40de5ec24bdfd543e7e343afb268ae29a Mon Sep 17 00:00:00 2001 From: Brandon Clayton <bclayton@usgs.gov> Date: Mon, 21 Nov 2022 13:00:47 -0700 Subject: [PATCH] add test sites service and controller --- .../nshmp/netcdf/www/TestSitesController.java | 91 +++++++++++++++++++ .../nshmp/netcdf/www/TestSitesService.java | 49 ++++++++++ 2 files changed, 140 insertions(+) create mode 100644 src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/TestSitesController.java create mode 100644 src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/TestSitesService.java diff --git a/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/TestSitesController.java b/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/TestSitesController.java new file mode 100644 index 0000000..4a1b436 --- /dev/null +++ b/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/TestSitesController.java @@ -0,0 +1,91 @@ +package gov.usgs.earthquake.nshmp.netcdf.www; + +import java.nio.file.Path; + +import gov.usgs.earthquake.nshmp.geo.json.FeatureCollection; +import gov.usgs.earthquake.nshmp.netcdf.NetcdfDataFilesHazardCurves; +import gov.usgs.earthquake.nshmp.netcdf.www.TestSitesService.RequestData; +import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet; +import gov.usgs.earthquake.nshmp.www.ResponseBody; + +import io.micronaut.context.annotation.Value; +import io.micronaut.context.event.StartupEvent; +import io.micronaut.core.annotation.Nullable; +import io.micronaut.http.HttpRequest; +import io.micronaut.http.HttpResponse; +import io.micronaut.http.MediaType; +import io.micronaut.http.annotation.Controller; +import io.micronaut.http.annotation.Get; +import io.micronaut.http.annotation.PathVariable; +import io.micronaut.http.annotation.QueryValue; +import io.micronaut.runtime.event.annotation.EventListener; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.inject.Inject; + +@Tag(name = TestSitesService.NAME) +@Controller("/sites") +public class TestSitesController { + + @Inject + private NshmpMicronautServlet servlet; + + /** + * The path to a hazard NetCDF file + */ + @Value("${nshmp-ws-static.netcdf-path}") + Path netcdfPath; + + NetcdfServiceHazardCurves service; + + /** + * Read in data type and return the appropriate service to use. + */ + @EventListener + void startup(StartupEvent event) { + var netcdfDataFiles = new NetcdfDataFilesHazardCurves(netcdfPath); + service = new NetcdfServiceHazardCurves(netcdfDataFiles); + } + + @Operation( + summary = "Get the GeoJSON Feature Collection of test sites", + description = "Returns the feature collection of test sites", + operationId = "test-sites") + @ApiResponse( + description = "NSHM test sites", + responseCode = "200", + content = @Content( + schema = @Schema(implementation = Response.class))) + @Get(uri = "{?raw}", produces = MediaType.APPLICATION_JSON) + public HttpResponse<String> doGet( + HttpRequest<?> http, + @QueryValue(defaultValue = "false") @Nullable Boolean raw) { + try { + return HttpResponse.ok(TestSitesService.handleSites(http, service.netcdf(), raw)); + } catch (Exception e) { + return NetcdfWsUtils.handleError(e, TestSitesService.NAME, http.getUri().toString()); + } + } + + @Operation( + summary = "Get the GeoJSON Feature Collection of test sites", + description = "Returns the feature collection of test sites", + operationId = "test-sites-slash") + @ApiResponse( + description = "NSHM test sites", + responseCode = "200", + content = @Content( + schema = @Schema(implementation = Response.class))) + @Get(uri = "/{raw}", produces = MediaType.APPLICATION_JSON) + public HttpResponse<String> doGetSlash( + HttpRequest<?> http, + @PathVariable(defaultValue = "false") @Nullable Boolean raw) { + return doGet(http, raw); + } + + // Swagger schema + private static class Response extends ResponseBody<RequestData, FeatureCollection> {}; +} diff --git a/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/TestSitesService.java b/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/TestSitesService.java new file mode 100644 index 0000000..771ef45 --- /dev/null +++ b/src/hazard/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/TestSitesService.java @@ -0,0 +1,49 @@ +package gov.usgs.earthquake.nshmp.netcdf.www; + +import com.google.gson.JsonElement; + +import gov.usgs.earthquake.nshmp.geo.json.FeatureCollection; +import gov.usgs.earthquake.nshmp.netcdf.NetcdfHazardCurves; +import gov.usgs.earthquake.nshmp.netcdf.NetcdfVersion; +import gov.usgs.earthquake.nshmp.www.ResponseBody; +import gov.usgs.earthquake.nshmp.www.ResponseMetadata; + +import io.micronaut.http.HttpRequest; +import jakarta.inject.Singleton; + +/** + * Test sites handler for {@link TestSitesController}. + * + * @author U.S. Geological Survey + */ +@Singleton +public class TestSitesService { + static final String NAME = "Test Sites"; + + static String handleSites(HttpRequest<?> http, NetcdfHazardCurves netcdf, Boolean raw) { + RequestData requestData = new RequestData(raw); + FeatureCollection sites = netcdf.netcdfData().sites(); + + if (requestData.raw) { + return sites.toJson(); + } else { + var response = ResponseBody.<RequestData, JsonElement> success() + .name(NAME) + .url(http.getUri().toString()) + .metadata(new ResponseMetadata(NetcdfVersion.appVersions())) + .request(requestData) + .response(sites.toJsonTree()) + .build(); + + return NetcdfWsUtils.GSON.toJson(response); + } + } + + static class RequestData { + public boolean raw; + + RequestData(Boolean raw) { + this.raw = raw == null ? false : raw; + } + } +} -- GitLab