Skip to content
Snippets Groups Projects
Commit cd750da9 authored by Clayton, Brandon Scott's avatar Clayton, Brandon Scott
Browse files

Merge branch 'utils' into 'main'

Utils

See merge request !157
parents 2fbebe0d bca26253
Branches main
Tags 0.5.0
1 merge request!157Utils
Pipeline #576040 passed
Showing
with 162 additions and 45 deletions
......@@ -6,8 +6,7 @@ micronautVersion = 3.10.1
netcdfVersion = 5.5.2
nodePluginVersion = 3.0.1
nodeVersion = 16.3.0
nshmpLibVersion = 1.4.8
nshmpUtilsJavaVersion = 0.4.0
nshmpLibVersion = 1.6.1
shadowVersion = 7.1.1
slfVersion = 1.7.30
spotbugsVersion = 4.7.0
......
......@@ -2,7 +2,6 @@
dependencies {
// NSHMP
implementation "ghsc:nshmp-lib:${nshmpLibVersion}"
implementation "ghsc:nshmp-utils-java:${nshmpUtilsJavaVersion}"
// NetCDF
implementation "edu.ucar:cdm-core:${netcdfVersion}"
......
package gov.usgs.earthquake.nshmp.netcdf.www;
import gov.usgs.earthquake.nshmp.gmm.NehrpSiteClass;
import gov.usgs.earthquake.nshmp.internal.www.NshmpMicronautServlet;
import gov.usgs.earthquake.nshmp.internal.www.ResponseBody;
import gov.usgs.earthquake.nshmp.netcdf.www.Metadata.ServiceResponseMetadata;
import gov.usgs.earthquake.nshmp.netcdf.www.Request.RequestDataSiteClass;
import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet;
import gov.usgs.earthquake.nshmp.www.ResponseBody;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.http.HttpRequest;
......
......@@ -5,6 +5,9 @@ import java.util.stream.Collectors;
import gov.usgs.earthquake.nshmp.data.XySequence;
import gov.usgs.earthquake.nshmp.geo.Location;
import gov.usgs.earthquake.nshmp.internal.www.ResponseBody;
import gov.usgs.earthquake.nshmp.internal.www.ResponseMetadata;
import gov.usgs.earthquake.nshmp.internal.www.WsUtils;
import gov.usgs.earthquake.nshmp.netcdf.NetcdfDataFilesGroundMotions;
import gov.usgs.earthquake.nshmp.netcdf.NetcdfGroundMotions;
import gov.usgs.earthquake.nshmp.netcdf.NetcdfVersion;
......@@ -15,9 +18,6 @@ import gov.usgs.earthquake.nshmp.netcdf.www.NetcdfWsUtils.Key;
import gov.usgs.earthquake.nshmp.netcdf.www.Query.Service;
import gov.usgs.earthquake.nshmp.netcdf.www.Request.RequestData;
import gov.usgs.earthquake.nshmp.netcdf.www.Request.RequestDataSiteClass;
import gov.usgs.earthquake.nshmp.www.ResponseBody;
import gov.usgs.earthquake.nshmp.www.ResponseMetadata;
import gov.usgs.earthquake.nshmp.www.WsUtils;
import io.micronaut.http.HttpRequest;
......
package gov.usgs.earthquake.nshmp.netcdf.www;
import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet;
import gov.usgs.earthquake.nshmp.internal.www.NshmpMicronautServlet;
import io.micronaut.http.HttpRequest;
import io.micronaut.http.HttpResponse;
......
......@@ -3,9 +3,9 @@ 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.internal.www.ResponseBody;
import gov.usgs.earthquake.nshmp.internal.www.ResponseMetadata;
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;
......
package gov.usgs.earthquake.nshmp.netcdf.www;
import gov.usgs.earthquake.nshmp.geo.json.FeatureCollection;
import gov.usgs.earthquake.nshmp.internal.www.NshmpMicronautServlet;
import gov.usgs.earthquake.nshmp.internal.www.ResponseBody;
import gov.usgs.earthquake.nshmp.netcdf.www.FeatureCollectionService.RequestData;
import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet;
import gov.usgs.earthquake.nshmp.www.ResponseBody;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.http.HttpRequest;
......
......@@ -4,11 +4,11 @@ import java.util.List;
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.internal.www.ResponseBody;
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;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.http.HttpRequest;
......
......@@ -6,6 +6,9 @@ import java.util.stream.Collectors;
import gov.usgs.earthquake.nshmp.data.XySequence;
import gov.usgs.earthquake.nshmp.geo.Location;
import gov.usgs.earthquake.nshmp.gmm.Imt;
import gov.usgs.earthquake.nshmp.internal.www.ResponseBody;
import gov.usgs.earthquake.nshmp.internal.www.ResponseMetadata;
import gov.usgs.earthquake.nshmp.internal.www.WsUtils;
import gov.usgs.earthquake.nshmp.netcdf.NetcdfDataFilesHazardCurves;
import gov.usgs.earthquake.nshmp.netcdf.NetcdfHazardCurves;
import gov.usgs.earthquake.nshmp.netcdf.NetcdfVersion;
......@@ -18,9 +21,6 @@ import gov.usgs.earthquake.nshmp.netcdf.www.Query.Service;
import gov.usgs.earthquake.nshmp.netcdf.www.Request.RequestData;
import gov.usgs.earthquake.nshmp.netcdf.www.Request.RequestDataSiteClass;
import gov.usgs.earthquake.nshmp.netcdf.www.RequestHazardCurves.HazardRequestDataImt;
import gov.usgs.earthquake.nshmp.www.ResponseBody;
import gov.usgs.earthquake.nshmp.www.ResponseMetadata;
import gov.usgs.earthquake.nshmp.www.WsUtils;
import io.micronaut.http.HttpRequest;
......
......@@ -2,7 +2,6 @@ package gov.usgs.earthquake.nshmp.netcdf.www;
import java.util.List;
import gov.usgs.earthquake.nshmp.Text;
import gov.usgs.earthquake.nshmp.Text.Delimiter;
import gov.usgs.earthquake.nshmp.geo.Location;
import gov.usgs.earthquake.nshmp.gmm.Imt;
......@@ -35,7 +34,7 @@ public class RequestHazardCurves {
@Override
public String toCsv() {
return String.format("%s,%s",
super.toCsv(), Text.join(List.of(Key.IMT.toString(), imt.name()), Delimiter.COMMA));
super.toCsv(), Delimiter.COMMA.joiner().join(List.of(Key.IMT.toString(), imt.name())));
}
}
}
package gov.usgs.earthquake.nshmp.netcdf.www;
import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet;
import gov.usgs.earthquake.nshmp.internal.www.NshmpMicronautServlet;
import io.micronaut.http.HttpRequest;
import io.micronaut.http.HttpResponse;
......
......@@ -2,12 +2,15 @@ package gov.usgs.earthquake.nshmp.netcdf.www;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import gov.usgs.earthquake.nshmp.gmm.Imt;
import gov.usgs.earthquake.nshmp.netcdf.data.ScienceBaseMetadata;
import gov.usgs.earthquake.nshmp.www.SwaggerUtils;
import io.micronaut.http.HttpRequest;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.parser.util.SchemaTypeUtil;
/**
* Swagger page updates for hazard services.
......@@ -99,10 +102,28 @@ public class SwaggerHazardCurves extends Swagger<NetcdfServiceHazardCurves> {
OpenAPI updateOpenApi() throws IOException {
OpenAPI openApi = super.updateOpenApi();
SwaggerUtils.imtSchema(
imtSchema(
openApi.getComponents().getSchemas(),
List.copyOf(service.netcdfDataFiles().imts()));
return openApi;
}
/**
* Returns updated Swagger schemas with provided IMTs.
*
* @param imts The IMTs
*/
private static Map<String, Schema> imtSchema(
Map<String, Schema> schemas,
List<Imt> imts) {
var schema = new Schema<String>();
schema.setType(SchemaTypeUtil.STRING_TYPE);
imts.stream()
.sorted()
.forEach(imt -> schema.addEnumItemObject(imt.name()));
schemas.put(Imt.class.getSimpleName(), schema);
return schemas;
}
}
......@@ -3,10 +3,10 @@ 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.internal.www.NshmpMicronautServlet;
import gov.usgs.earthquake.nshmp.internal.www.ResponseBody;
import gov.usgs.earthquake.nshmp.netcdf.NetcdfDataFilesHazardCurves;
import gov.usgs.earthquake.nshmp.netcdf.www.FeatureCollectionService.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;
......
......@@ -4,7 +4,6 @@ import com.google.common.io.Resources;
import gov.usgs.earthquake.nshmp.internal.AppVersion;
import gov.usgs.earthquake.nshmp.internal.LibVersion;
import gov.usgs.earthquake.nshmp.www.WsUtilsVersion;
public class NetcdfVersion implements AppVersion {
......@@ -12,7 +11,6 @@ public class NetcdfVersion implements AppVersion {
VersionInfo[] versions = {
new NetcdfVersion().getVersionInfo(),
new LibVersion().getVersionInfo(),
new WsUtilsVersion().getVersionInfo(),
};
return versions;
}
......
......@@ -11,6 +11,7 @@ import java.util.stream.Collectors;
import gov.usgs.earthquake.nshmp.Text;
import gov.usgs.earthquake.nshmp.Text.Delimiter;
import gov.usgs.earthquake.nshmp.gmm.NehrpSiteClass;
import gov.usgs.earthquake.nshmp.internal.www.ResponseBody;
import gov.usgs.earthquake.nshmp.netcdf.Netcdf;
import gov.usgs.earthquake.nshmp.netcdf.NetcdfDataFiles;
import gov.usgs.earthquake.nshmp.netcdf.data.ScienceBaseMetadata;
......@@ -18,7 +19,6 @@ import gov.usgs.earthquake.nshmp.netcdf.www.Metadata.ServiceResponseMetadata;
import gov.usgs.earthquake.nshmp.netcdf.www.Query.Service;
import gov.usgs.earthquake.nshmp.netcdf.www.Request.RequestData;
import gov.usgs.earthquake.nshmp.netcdf.www.meta.DoubleParameter;
import gov.usgs.earthquake.nshmp.www.ResponseBody;
import io.micronaut.http.HttpRequest;
import io.micronaut.http.HttpResponse;
......@@ -176,8 +176,8 @@ public abstract class NetcdfService<S, T extends Query> {
var lines = new ArrayList<String>();
lines.add(request.toCsv());
lines.add(Text.join(xs, Delimiter.COMMA));
lines.add(Text.join(ys, Delimiter.COMMA));
lines.add(Delimiter.COMMA.joiner().join(xs));
lines.add(Delimiter.COMMA.joiner().join(ys));
return lines.stream().collect(Collectors.joining(Text.NEWLINE));
}
......
......@@ -9,11 +9,11 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import gov.usgs.earthquake.nshmp.gmm.Imt;
import gov.usgs.earthquake.nshmp.internal.www.ResponseBody;
import gov.usgs.earthquake.nshmp.internal.www.ResponseMetadata;
import gov.usgs.earthquake.nshmp.internal.www.WsUtils.EnumSerializer;
import gov.usgs.earthquake.nshmp.internal.www.WsUtils.NaNSerializer;
import gov.usgs.earthquake.nshmp.netcdf.NetcdfVersion;
import gov.usgs.earthquake.nshmp.www.ResponseBody;
import gov.usgs.earthquake.nshmp.www.ResponseMetadata;
import gov.usgs.earthquake.nshmp.www.WsUtils.EnumSerializer;
import gov.usgs.earthquake.nshmp.www.WsUtils.NaNSerializer;
import io.micronaut.http.HttpResponse;
......
......@@ -2,7 +2,6 @@ package gov.usgs.earthquake.nshmp.netcdf.www;
import java.util.List;
import gov.usgs.earthquake.nshmp.Text;
import gov.usgs.earthquake.nshmp.Text.Delimiter;
import gov.usgs.earthquake.nshmp.geo.Location;
import gov.usgs.earthquake.nshmp.gmm.NehrpSiteClass;
......@@ -39,9 +38,8 @@ public class Request {
}
public String toCsv() {
return Text.join(
List.of(Key.LONGITUDE.toString(), longitude, Key.LATITUDE.toString(), latitude),
Delimiter.COMMA);
return Delimiter.COMMA.joiner().join(
List.of(Key.LONGITUDE.toString(), longitude, Key.LATITUDE.toString(), latitude));
}
}
......@@ -59,7 +57,8 @@ public class Request {
@Override
public String toCsv() {
return String.format("%s,%s",
super.toCsv(), Text.join(List.of(Key.SITE_CLASS.toString(), siteClass), Delimiter.COMMA));
super.toCsv(),
Delimiter.COMMA.joiner().join(List.of(Key.SITE_CLASS.toString(), siteClass)));
}
}
......
package gov.usgs.earthquake.nshmp.netcdf.www;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
......@@ -10,15 +11,17 @@ import java.util.stream.Collectors;
import gov.usgs.earthquake.nshmp.geo.Bounds;
import gov.usgs.earthquake.nshmp.geo.Location;
import gov.usgs.earthquake.nshmp.geo.LocationList;
import gov.usgs.earthquake.nshmp.gmm.NehrpSiteClass;
import gov.usgs.earthquake.nshmp.netcdf.data.NetcdfData;
import gov.usgs.earthquake.nshmp.netcdf.data.ScienceBaseMetadata;
import gov.usgs.earthquake.nshmp.www.SwaggerUtils;
import io.micronaut.http.HttpRequest;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.parameters.Parameter;
import io.swagger.v3.parser.OpenAPIV3Parser;
import io.swagger.v3.parser.util.SchemaTypeUtil;
/**
* Update Swagger landing page.
......@@ -68,9 +71,9 @@ abstract class Swagger<T extends NetcdfService<?, ?>> {
"<details>\n" +
"<summary>Parameters</summary>\n")
.append(
SwaggerUtils.locationBoundsInfo(netcdfData.minimumBounds(), netcdfData.maximumBounds(),
locationBoundsInfo(netcdfData.minimumBounds(), netcdfData.maximumBounds(),
Optional.of("###")))
.append(SwaggerUtils.siteClassInfo(netcdfData.siteClasses(), Optional.of("###")))
.append(siteClassInfo(netcdfData.siteClasses(), Optional.of("###")))
.append("</details>")
.toString();
}
......@@ -126,7 +129,7 @@ abstract class Swagger<T extends NetcdfService<?, ?>> {
.collect(Collectors.toList());
Bounds bounds = LocationList.copyOf(locations).bounds();
SwaggerUtils.addLocationBounds(openApi, bounds.min, bounds.max);
addLocationBounds(openApi, bounds.min, bounds.max);
}
/**
......@@ -139,7 +142,7 @@ abstract class Swagger<T extends NetcdfService<?, ?>> {
updateLocationBounds(openApi);
Components components = openApi.getComponents();
Map<String, Schema> schemas = components.getSchemas();
SwaggerUtils.siteClassSchema(schemas, List.copyOf(service.netcdfDataFiles().siteClasses()));
siteClassSchema(schemas, List.copyOf(service.netcdfDataFiles().siteClasses()));
openApi.servers(null);
openApi.getInfo().setTitle(service.getServiceName());
......@@ -154,4 +157,103 @@ abstract class Swagger<T extends NetcdfService<?, ?>> {
return openApi;
}
/**
* Update "longitude" and "latitude" parameters with min and max bounds and
* add bounds to description.
*
* @param parameters The Swagger parameters
* @param min The minimum bounds
* @param max The maximum bounds
* @return
*/
private static List<Parameter> addLocationBounds(
List<Parameter> parameters,
Location min,
Location max) {
var latitudeDescription = String.format(" [%s, %s]", min.latitude, max.latitude);
var longtudeDescription = String.format(" [%s, %s]", min.longitude, max.longitude);
parameters.forEach(parameter -> {
if (parameter.getName().equals("latitude")) {
parameter.setDescription(parameter.getDescription() + latitudeDescription);
parameter.getSchema().setMinimum(BigDecimal.valueOf(min.latitude));
parameter.getSchema().setMaximum(BigDecimal.valueOf(max.latitude));
} else if (parameter.getName().equals("longitude")) {
parameter.setDescription(parameter.getDescription() + longtudeDescription);
parameter.getSchema().setMinimum(BigDecimal.valueOf(min.longitude));
parameter.getSchema().setMaximum(BigDecimal.valueOf(max.longitude));
}
});
return parameters;
}
/**
* Update any "longitude" and "latitude" parameters with min and max bounds
* and add bounds to description.
*
* @param openApi The Open API
* @param min The minimum location bounds
* @param max The maximum location bounds
*/
private static OpenAPI addLocationBounds(OpenAPI openApi, Location min, Location max) {
openApi.getPaths().values().stream()
.flatMap(path -> path.readOperations().stream())
.forEach(operation -> addLocationBounds(operation.getParameters(), min, max));
return openApi;
}
/**
* Returns markdown string listing the min and max location bounds.
*
* @param min The minimum bounds
* @param max The maximum bounds
* @param heading The Markdown heading value. Default: ###
*/
private static String locationBoundsInfo(Location min, Location max, Optional<String> heading) {
return new StringBuilder()
.append(heading.orElse("###") + " Latitude Bounds\n")
.append(String.format("- Minimum Latitude: %s°\n", min.latitude))
.append(String.format("- Maximum Latitude: %s°\n", max.latitude))
.append(heading.orElse("###") + " Longitude Bounds\n")
.append(String.format("- Minimum Longitude: %s°\n", min.longitude))
.append(String.format("- Maximum Longitude: %s°\n", max.longitude))
.toString();
}
/**
* Returns markdown string listing the site classes.
*
* @param siteClasses The NEHRP site classes
* @param heading The Markdown heading value. Default: ###
*/
private static String siteClassInfo(List<NehrpSiteClass> siteClasses, Optional<String> heading) {
return new StringBuilder()
.append(heading.orElse("###") + " Site Classes\n")
.append(siteClasses.stream().sorted()
.map(siteClass -> "- " + siteClass.toString())
.collect(Collectors.joining("\n")))
.append("\n")
.toString();
}
/**
* Returns updated Swagger schemas with provided site classes.
*
* @param siteClasses The NERHP site classes
*/
private static Map<String, Schema> siteClassSchema(
Map<String, Schema> schemas,
List<NehrpSiteClass> siteClasses) {
var schema = new Schema<NehrpSiteClass>();
schema.setType(SchemaTypeUtil.STRING_TYPE);
siteClasses.stream()
.sorted()
.forEach(siteClass -> schema.addEnumItemObject(siteClass));
schemas.put(NehrpSiteClass.class.getSimpleName(), schema);
return schemas;
}
}
......@@ -7,7 +7,7 @@ import java.util.Optional;
import org.apache.commons.io.IOUtils;
import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet;
import gov.usgs.earthquake.nshmp.internal.www.NshmpMicronautServlet;
import io.micronaut.core.io.scan.ClassPathResourceLoader;
import io.micronaut.http.HttpResponse;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment