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

update to return fault sections

parent 93690e97
No related branches found
No related tags found
2 merge requests!675Production Release | nshmp-haz,!674Resolves - Add fault section service endpoint for loaded model
......@@ -3,14 +3,17 @@ package gov.usgs.earthquake.nshmp.www.source;
import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet;
import gov.usgs.earthquake.nshmp.www.ResponseBody;
import gov.usgs.earthquake.nshmp.www.ServletUtil;
import gov.usgs.earthquake.nshmp.www.source.FeaturesService.FaultType;
import gov.usgs.earthquake.nshmp.www.source.FeaturesService.Metadata;
import gov.usgs.earthquake.nshmp.www.source.FeaturesService.RequestData;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.http.HttpRequest;
import io.micronaut.http.HttpResponse;
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.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
......@@ -39,28 +42,22 @@ public class FeaturesController {
@Inject
private NshmpMicronautServlet servlet;
/*
* Not sure we need metadata for this. Issue #542 describes the various groups
* that could be supported. However instead of 'all' one could consider just
* having no argument such that the root endpoint path would just return all
* features.
*/
@Operation(
summary = "Source model logic tree listing",
description = "Returns the ID's of logic trees in the model",
operationId = "source-feature-metadata")
summary = "Source model features listing",
description = "Returns the fault features in a source model",
operationId = "fault-sections")
@ApiResponse(
description = "Source logic tree metadata",
responseCode = "200",
content = @Content(
schema = @Schema(
implementation = MetadataResponse.class)))
@Get
@Deprecated
public HttpResponse<String> doGetMetadata(HttpRequest<?> http) {
@Get(uri = "{?faultType,raw}")
public HttpResponse<String> doGet(
HttpRequest<?> http, @QueryValue @Nullable FaultType faultType,
@QueryValue(defaultValue = "false") @Nullable Boolean raw) {
try {
return FeaturesService.getMetadata(http);
return FeaturesService.getFaultSections(http, faultType, raw);
} catch (Exception e) {
return ServletUtil.error(
FeaturesService.LOG, e,
......@@ -69,29 +66,37 @@ public class FeaturesController {
}
}
/**
* @param id Source tree id
*/
@Operation(
summary = "Get the GeoJSON features in a source tree",
description = "Returns the features for the supplied ID",
operationId = "source-features")
summary = "Get the GeoJSON fault features in a source model",
description = "Returns the fault features for the supplied fault type",
operationId = "fault-sections-slash")
@ApiResponse(
description = "NSHM source features",
responseCode = "200",
content = @Content(
schema = @Schema(implementation = TreeResponse.class)))
@Get(uri = "/{id}")
@Deprecated
public HttpResponse<String> doGetTree(HttpRequest<?> http, @PathVariable int id) {
try {
return FeaturesService.getTree(http, id);
} catch (Exception e) {
return ServletUtil.error(
FeaturesService.LOG, e,
FeaturesService.NAME,
http.getUri().toString());
}
@Get(uri = "/{faultType}")
public HttpResponse<String> doGetSlash(
HttpRequest<?> http,
@PathVariable FaultType faultType) {
return doGet(http, faultType, null);
}
@Operation(
summary = "Get the GeoJSON fault features in a source model",
description = "Returns the fault features for the supplied fault type",
operationId = "fault-sections-slash-raw")
@ApiResponse(
description = "NSHM source features",
responseCode = "200",
content = @Content(
schema = @Schema(implementation = TreeResponse.class)))
@Get(uri = "/{faultType}/{raw}")
public HttpResponse<String> doGetSlashRaw(
HttpRequest<?> http,
@PathVariable FaultType faultType,
@PathVariable Boolean raw) {
return doGet(http, faultType, raw);
}
// Swagger schema
......
package gov.usgs.earthquake.nshmp.www.source;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.CaseFormat;
import gov.usgs.earthquake.nshmp.model.HazardModel;
import gov.usgs.earthquake.nshmp.model.Models;
import gov.usgs.earthquake.nshmp.model.SourceType;
import gov.usgs.earthquake.nshmp.www.HazVersion;
import gov.usgs.earthquake.nshmp.www.ResponseBody;
import gov.usgs.earthquake.nshmp.www.ResponseMetadata;
import gov.usgs.earthquake.nshmp.www.ServletUtil;
import gov.usgs.earthquake.nshmp.www.meta.Parameter;
import gov.usgs.earthquake.nshmp.www.source.SourceService.SourceModel;
import io.micronaut.http.HttpRequest;
......@@ -16,8 +25,6 @@ import io.micronaut.http.HttpResponse;
import jakarta.inject.Singleton;
/**
* Source model tree feature handler for {@link FeaturesController}
*
* @author U.S. Geological Survey
*/
@Singleton
......@@ -26,8 +33,43 @@ public class FeaturesService {
static final String NAME = "Model Features";
static final Logger LOG = LoggerFactory.getLogger(FeaturesService.class);
@Deprecated
public static HttpResponse<String> getMetadata(HttpRequest<?> request) {
public static HttpResponse<String> getFaultSections(
HttpRequest<?> request,
FaultType faultType,
Boolean raw) {
if (faultType == null && raw == null) {
return metadata(request);
} else {
return processResponse(request, new RequestData(faultType, raw));
}
}
private static HttpResponse<String> processResponse(
HttpRequest<?> request,
RequestData requestData) {
var url = request.getUri().toString();
var features = requestData.faultType == FaultType.ALL
? Models.features(ServletUtil.model(), Optional.empty())
: Models.features(ServletUtil.model(),
Optional.of(SourceType.valueOf(requestData.faultType.name())));
if (requestData.raw) {
return HttpResponse.ok(features.toJson());
} else {
var response = ResponseBody.success()
.name(NAME)
.url(url)
.metadata(new ResponseMetadata(HazVersion.appVersions()))
.request(requestData)
.response(features.toJsonTree())
.build();
return HttpResponse.ok(ServletUtil.GSON2.toJson(response));
}
}
private static HttpResponse<String> metadata(HttpRequest<?> request) {
var url = request.getUri().toString();
var metadata = new Metadata(ServletUtil.model());
var response = ResponseBody.usage()
......@@ -40,48 +82,57 @@ public class FeaturesService {
return HttpResponse.ok(ServletUtil.GSON2.toJson(response));
}
@Deprecated
public static HttpResponse<String> getTree(HttpRequest<?> request, Integer id) {
var url = request.getUri().toString();
var features = Models.features(ServletUtil.model(), id);
var requestData = new RequestData(id);
var response = ResponseBody.success()
.name(NAME)
.url(url)
.metadata(new ResponseMetadata(HazVersion.appVersions()))
.request(requestData)
.response(features)
.build();
return HttpResponse.ok(ServletUtil.GSON2.toJson(response));
}
static class RequestData {
final int id;
final FaultType faultType;
final boolean raw;
RequestData(int id) {
this.id = id;
RequestData(FaultType sourceType, Boolean raw) {
this.raw = raw == null ? false : raw;
this.faultType = sourceType;
}
public int getId() {
return id;
public FaultType getFaultType() {
return faultType;
}
public boolean getRaw() {
return raw;
}
}
/**
* Subset of {@code SourceType}
*/
static enum FaultType {
ALL,
DECOLLMENT,
FAULT,
INTERFACE,
ZONE;
@Override
public String toString() {
return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name());
}
}
static class Metadata {
final SourceModel model;
final Object trees;
final List<Parameter> faultType;
Metadata(HazardModel model) {
this.model = new SourceModel(model);
trees = Models.trees(model);
this.faultType = Arrays.stream(FaultType.values())
.map(faultType -> new Parameter(faultType.toString(), faultType.name()))
.collect(Collectors.toList());
}
public SourceModel getModel() {
return model;
}
public Object getTrees() {
return trees;
public List<Parameter> getSourceType() {
return faultType;
}
}
}
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