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

Merge branch 'version' into 'main'

Resolves - Add Version Info

Closes #28

See merge request !112
parents 4e14a1c0 d72a276d
No related branches found
No related tags found
2 merge requests!113Production Release | nshmp-ws-static,!112Resolves - Add Version Info
Pipeline #136637 passed
Showing
with 88 additions and 16 deletions
...@@ -19,6 +19,7 @@ libs ...@@ -19,6 +19,7 @@ libs
.factorypath .factorypath
.apt_* .apt_*
.vscode .vscode
*version.json
# Node # Node
node_modules node_modules
......
...@@ -160,7 +160,9 @@ Build Image: ...@@ -160,7 +160,9 @@ Build Image:
DOCKER_BUILD_ARGS: | DOCKER_BUILD_ARGS: |
BUILD_IMAGE=${DEVOPS_REGISTRY}usgs/amazoncorretto:11 BUILD_IMAGE=${DEVOPS_REGISTRY}usgs/amazoncorretto:11
FROM_IMAGE=${DEVOPS_REGISTRY}usgs/amazoncorretto:11 FROM_IMAGE=${DEVOPS_REGISTRY}usgs/amazoncorretto:11
CI_COMMIT_BRANCH=${CI_COMMIT_BRANCH}
CI_JOB_TOKEN=${CI_JOB_TOKEN} CI_JOB_TOKEN=${CI_JOB_TOKEN}
CI_PROJECT_URL=${CI_PROJECT_URL}
UPSTREAM_PATH: ghsc/nshmp/nshmp-ws-static UPSTREAM_PATH: ghsc/nshmp/nshmp-ws-static
Build Project: Build Project:
......
...@@ -13,6 +13,8 @@ FROM ${BUILD_IMAGE} as builder ...@@ -13,6 +13,8 @@ FROM ${BUILD_IMAGE} as builder
# TODO: Token needed until nshmp-lib is public # TODO: Token needed until nshmp-lib is public
ARG GITLAB_TOKEN=null ARG GITLAB_TOKEN=null
ARG CI_JOB_TOKEN=null ARG CI_JOB_TOKEN=null
ARG CI_PROJECT_URL=null
ARG CI_COMMIT_BRANCH=null
WORKDIR /app WORKDIR /app
......
...@@ -3,6 +3,7 @@ plugins { ...@@ -3,6 +3,7 @@ plugins {
id "com.github.johnrengelman.shadow" version "${shadowVersion}" id "com.github.johnrengelman.shadow" version "${shadowVersion}"
id "com.github.node-gradle.node" version "${nodePluginVersion}" id "com.github.node-gradle.node" version "${nodePluginVersion}"
id "com.github.spotbugs" version "${spotbugsVersion}" id "com.github.spotbugs" version "${spotbugsVersion}"
id "com.palantir.git-version" version "${gitVersionVersion}"
id "com.star-zero.gradle.githook" version "${githooksVersion}" id "com.star-zero.gradle.githook" version "${githooksVersion}"
id "eclipse-wtp" id "eclipse-wtp"
id "jacoco" id "jacoco"
...@@ -26,6 +27,7 @@ subprojects { ...@@ -26,6 +27,7 @@ subprojects {
apply plugin: "com.github.johnrengelman.shadow" apply plugin: "com.github.johnrengelman.shadow"
apply plugin: "com.github.node-gradle.node" apply plugin: "com.github.node-gradle.node"
apply plugin: "com.github.spotbugs" apply plugin: "com.github.spotbugs"
apply plugin: "com.palantir.git-version"
apply plugin: "com.star-zero.gradle.githook" apply plugin: "com.star-zero.gradle.githook"
apply plugin: "com.github.johnrengelman.shadow" apply plugin: "com.github.johnrengelman.shadow"
apply plugin: "eclipse-wtp" apply plugin: "eclipse-wtp"
...@@ -41,6 +43,7 @@ subprojects { ...@@ -41,6 +43,7 @@ subprojects {
sourceCompatibility = JavaVersion.VERSION_11 sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11
apply from: "${rootDir}/gradle/app-version.gradle"
apply from: "${rootDir}/gradle/dependencies.gradle" apply from: "${rootDir}/gradle/dependencies.gradle"
apply from: "${rootDir}/gradle/git-hooks.gradle" apply from: "${rootDir}/gradle/git-hooks.gradle"
apply from: "${rootDir}/gradle/repositories.gradle" apply from: "${rootDir}/gradle/repositories.gradle"
......
githooksVersion = 1.2.0 githooksVersion = 1.2.0
gitVersionVersion = 0.15.0
jacksonVersion = 2.9.0 jacksonVersion = 2.9.0
junitVersion = 5.8.2 junitVersion = 5.8.2
micronautVersion = 3.2.3 micronautVersion = 3.2.3
...@@ -6,8 +7,8 @@ micronautRxVersion = 2.1.1 ...@@ -6,8 +7,8 @@ micronautRxVersion = 2.1.1
netcdfVersion = 5.5.2 netcdfVersion = 5.5.2
nodePluginVersion = 3.0.1 nodePluginVersion = 3.0.1
nodeVersion = 16.3.0 nodeVersion = 16.3.0
nshmpLibVersion = 0.8.2 nshmpLibVersion = 1.0.6
nshmpWsUtilsVersion = 0.3.4 nshmpWsUtilsVersion = 0.3.7
openApiVersion = 4.0.0 openApiVersion = 4.0.0
shadowVersion = 7.1.1 shadowVersion = 7.1.1
slfVersion = 1.7.30 slfVersion = 1.7.30
......
apply plugin: "com.palantir.git-version"
tasks.withType(JavaCompile) {
doFirst {
def versionFile = new File("${projectDir}/src/main/resources/version/nshmp-ws-static-version.json")
new File(versionFile.getParent()).mkdirs()
def details = versionDetails()
def ciProjectUrl = System.getenv("CI_PROJECT_URL")
def branch = System.getenv("CI_COMMIT_BRANCH")
def versionInfo = [
branchName: branch ? branch : details.branchName,
commitDistance: details.commitDistance,
gitHash: details.gitHash,
gitHashFull: details.gitHashFull,
isCleanTag: details.isCleanTag,
lastTag: details.lastTag,
projectName: rootProject.name,
url: ciProjectUrl ? ciProjectUrl : 'git config --get remote.origin.url'.execute().text.replace('\n', ''),
version: details.version,
]
def json = groovy.json.JsonOutput.toJson(versionInfo)
versionFile.write(groovy.json.JsonOutput.prettyPrint(json))
}
}
...@@ -59,7 +59,8 @@ spotless { ...@@ -59,7 +59,8 @@ spotless {
target fileTree(".") { target fileTree(".") {
include "**/*.xml" include "**/*.xml"
exclude "**/build", ".settings", ".classpath", ".project", exclude "**/build", ".settings", ".classpath", ".project",
"tmp", ".gradle", "libs", "node_modules", "**/.gradle", "bin", "**/bin" "tmp", ".gradle", "libs", "node_modules", "**/.gradle",
"bin", "**/bin", "**/.settings"
} }
eclipseWtp("xml") eclipseWtp("xml")
trimTrailingWhitespace() trimTrailingWhitespace()
......
...@@ -6,7 +6,7 @@ import gov.usgs.earthquake.nshmp.gmm.NehrpSiteClass; ...@@ -6,7 +6,7 @@ import gov.usgs.earthquake.nshmp.gmm.NehrpSiteClass;
import gov.usgs.earthquake.nshmp.netcdf.NetcdfGroundMotions; import gov.usgs.earthquake.nshmp.netcdf.NetcdfGroundMotions;
import gov.usgs.earthquake.nshmp.netcdf.www.NetcdfService.RequestDataSiteClass; import gov.usgs.earthquake.nshmp.netcdf.www.NetcdfService.RequestDataSiteClass;
import gov.usgs.earthquake.nshmp.netcdf.www.NetcdfService.ResponseData; import gov.usgs.earthquake.nshmp.netcdf.www.NetcdfService.ResponseData;
import gov.usgs.earthquake.nshmp.netcdf.www.NetcdfService.ResponseMetadata; import gov.usgs.earthquake.nshmp.netcdf.www.NetcdfService.ServiceResponseMetadata;
import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet; import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet;
import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ResponseBody;
...@@ -152,5 +152,5 @@ public class NetcdfController { ...@@ -152,5 +152,5 @@ public class NetcdfController {
// For Swagger schema // For Swagger schema
private static class Response private static class Response
extends extends
ResponseBody<RequestDataSiteClass, ResponseData<ResponseMetadata>> {} ResponseBody<RequestDataSiteClass, ResponseData<ServiceResponseMetadata>> {}
} }
...@@ -6,10 +6,12 @@ import java.util.stream.Collectors; ...@@ -6,10 +6,12 @@ import java.util.stream.Collectors;
import gov.usgs.earthquake.nshmp.data.XySequence; import gov.usgs.earthquake.nshmp.data.XySequence;
import gov.usgs.earthquake.nshmp.geo.Location; import gov.usgs.earthquake.nshmp.geo.Location;
import gov.usgs.earthquake.nshmp.netcdf.NetcdfGroundMotions; import gov.usgs.earthquake.nshmp.netcdf.NetcdfGroundMotions;
import gov.usgs.earthquake.nshmp.netcdf.NetcdfVersion;
import gov.usgs.earthquake.nshmp.netcdf.data.StaticData; import gov.usgs.earthquake.nshmp.netcdf.data.StaticData;
import gov.usgs.earthquake.nshmp.netcdf.www.NetcdfWsUtils.Key; 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.Query.Service;
import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ResponseBody;
import gov.usgs.earthquake.nshmp.www.ResponseMetadata;
import gov.usgs.earthquake.nshmp.www.WsUtils; import gov.usgs.earthquake.nshmp.www.WsUtils;
import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpRequest;
...@@ -37,6 +39,7 @@ public class NetcdfServiceGroundMotions extends NetcdfService<Query> { ...@@ -37,6 +39,7 @@ public class NetcdfServiceGroundMotions extends NetcdfService<Query> {
var metadata = new Metadata(request, SERVICE_DESCRIPTION); var metadata = new Metadata(request, SERVICE_DESCRIPTION);
return ResponseBody.<String, Metadata> usage() return ResponseBody.<String, Metadata> usage()
.metadata(new ResponseMetadata(NetcdfVersion.appVersions()))
.name(SERVICE_NAME) .name(SERVICE_NAME)
.request(NetcdfWsUtils.getRequestUrl(request)) .request(NetcdfWsUtils.getRequestUrl(request))
.response(metadata) .response(metadata)
...@@ -78,7 +81,7 @@ public class NetcdfServiceGroundMotions extends NetcdfService<Query> { ...@@ -78,7 +81,7 @@ public class NetcdfServiceGroundMotions extends NetcdfService<Query> {
} }
@Override @Override
ResponseBody<RequestDataSiteClass, ResponseData<ResponseMetadata>> processCurvesSiteClass( ResponseBody<RequestDataSiteClass, ResponseData<ServiceResponseMetadata>> processCurvesSiteClass(
RequestDataSiteClass request, RequestDataSiteClass request,
String url) { String url) {
WsUtils.checkValue(Key.LATITUDE, request.latitude); WsUtils.checkValue(Key.LATITUDE, request.latitude);
...@@ -87,7 +90,8 @@ public class NetcdfServiceGroundMotions extends NetcdfService<Query> { ...@@ -87,7 +90,8 @@ public class NetcdfServiceGroundMotions extends NetcdfService<Query> {
var curves = netcdf().staticData(request.site, request.siteClass); var curves = netcdf().staticData(request.site, request.siteClass);
var responseData = toResponseData(request, curves); var responseData = toResponseData(request, curves);
return ResponseBody.<RequestDataSiteClass, ResponseData<ResponseMetadata>> success() return ResponseBody.<RequestDataSiteClass, ResponseData<ServiceResponseMetadata>> success()
.metadata(new ResponseMetadata(NetcdfVersion.appVersions()))
.name(SERVICE_NAME) .name(SERVICE_NAME)
.request(request) .request(request)
.response(responseData) .response(responseData)
...@@ -96,7 +100,7 @@ public class NetcdfServiceGroundMotions extends NetcdfService<Query> { ...@@ -96,7 +100,7 @@ public class NetcdfServiceGroundMotions extends NetcdfService<Query> {
} }
@Override @Override
ResponseBody<RequestData, List<ResponseData<ResponseMetadata>>> processCurves( ResponseBody<RequestData, List<ResponseData<ServiceResponseMetadata>>> processCurves(
RequestData request, RequestData request,
String url) { String url) {
WsUtils.checkValue(Key.LATITUDE, request.latitude); WsUtils.checkValue(Key.LATITUDE, request.latitude);
...@@ -104,7 +108,8 @@ public class NetcdfServiceGroundMotions extends NetcdfService<Query> { ...@@ -104,7 +108,8 @@ public class NetcdfServiceGroundMotions extends NetcdfService<Query> {
var curves = netcdf().staticData(request.site); var curves = netcdf().staticData(request.site);
var responseData = toList(request.site, curves); var responseData = toList(request.site, curves);
return ResponseBody.<RequestData, List<ResponseData<ResponseMetadata>>> success() return ResponseBody.<RequestData, List<ResponseData<ServiceResponseMetadata>>> success()
.metadata(new ResponseMetadata(NetcdfVersion.appVersions()))
.name(SERVICE_NAME) .name(SERVICE_NAME)
.request(request) .request(request)
.response(responseData) .response(responseData)
...@@ -112,7 +117,7 @@ public class NetcdfServiceGroundMotions extends NetcdfService<Query> { ...@@ -112,7 +117,7 @@ public class NetcdfServiceGroundMotions extends NetcdfService<Query> {
.build(); .build();
} }
List<ResponseData<ResponseMetadata>> toList( List<ResponseData<ServiceResponseMetadata>> toList(
Location site, Location site,
StaticData<XySequence> curves) { StaticData<XySequence> curves) {
return curves.entrySet().stream() return curves.entrySet().stream()
...@@ -123,10 +128,10 @@ public class NetcdfServiceGroundMotions extends NetcdfService<Query> { ...@@ -123,10 +128,10 @@ public class NetcdfServiceGroundMotions extends NetcdfService<Query> {
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
ResponseData<ResponseMetadata> toResponseData( ResponseData<ServiceResponseMetadata> toResponseData(
RequestDataSiteClass request, RequestDataSiteClass request,
XySequence curves) { XySequence curves) {
var metadata = new ResponseMetadata( var metadata = new ServiceResponseMetadata(
request.siteClass, request.siteClass,
X_LABEL, X_LABEL,
Y_LABEL); Y_LABEL);
......
...@@ -8,11 +8,13 @@ import gov.usgs.earthquake.nshmp.geo.Location; ...@@ -8,11 +8,13 @@ import gov.usgs.earthquake.nshmp.geo.Location;
import gov.usgs.earthquake.nshmp.gmm.Imt; import gov.usgs.earthquake.nshmp.gmm.Imt;
import gov.usgs.earthquake.nshmp.gmm.NehrpSiteClass; import gov.usgs.earthquake.nshmp.gmm.NehrpSiteClass;
import gov.usgs.earthquake.nshmp.netcdf.NetcdfHazardCurves; import gov.usgs.earthquake.nshmp.netcdf.NetcdfHazardCurves;
import gov.usgs.earthquake.nshmp.netcdf.NetcdfVersion;
import gov.usgs.earthquake.nshmp.netcdf.data.StaticData; import gov.usgs.earthquake.nshmp.netcdf.data.StaticData;
import gov.usgs.earthquake.nshmp.netcdf.data.StaticDataHazardCurves; import gov.usgs.earthquake.nshmp.netcdf.data.StaticDataHazardCurves;
import gov.usgs.earthquake.nshmp.netcdf.www.NetcdfWsUtils.Key; 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.Query.Service;
import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ResponseBody;
import gov.usgs.earthquake.nshmp.www.ResponseMetadata;
import gov.usgs.earthquake.nshmp.www.WsUtils; import gov.usgs.earthquake.nshmp.www.WsUtils;
import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpRequest;
...@@ -39,6 +41,7 @@ public class NetcdfServiceHazardCurves extends NetcdfService<HazardQuery> { ...@@ -39,6 +41,7 @@ public class NetcdfServiceHazardCurves extends NetcdfService<HazardQuery> {
ResponseBody<String, Metadata> getMetadataResponse(HttpRequest<?> request) { ResponseBody<String, Metadata> getMetadataResponse(HttpRequest<?> request) {
var metadata = new Metadata(request, SERVICE_DESCRIPTION); var metadata = new Metadata(request, SERVICE_DESCRIPTION);
return ResponseBody.<String, Metadata> usage() return ResponseBody.<String, Metadata> usage()
.metadata(new ResponseMetadata(NetcdfVersion.appVersions()))
.name(SERVICE_NAME) .name(SERVICE_NAME)
.request(NetcdfWsUtils.getRequestUrl(request)) .request(NetcdfWsUtils.getRequestUrl(request))
.response(metadata) .response(metadata)
...@@ -82,6 +85,7 @@ public class NetcdfServiceHazardCurves extends NetcdfService<HazardQuery> { ...@@ -82,6 +85,7 @@ public class NetcdfServiceHazardCurves extends NetcdfService<HazardQuery> {
var curvesAsList = toList(request.site, curves); var curvesAsList = toList(request.site, curves);
return ResponseBody.<RequestData, List<List<ResponseData<HazardResponseMetadata>>>> success() return ResponseBody.<RequestData, List<List<ResponseData<HazardResponseMetadata>>>> success()
.metadata(new ResponseMetadata(NetcdfVersion.appVersions()))
.name(SERVICE_NAME) .name(SERVICE_NAME)
.request(request) .request(request)
.response(curvesAsList) .response(curvesAsList)
...@@ -100,6 +104,7 @@ public class NetcdfServiceHazardCurves extends NetcdfService<HazardQuery> { ...@@ -100,6 +104,7 @@ public class NetcdfServiceHazardCurves extends NetcdfService<HazardQuery> {
var curvesAsList = toList(request, curves); var curvesAsList = toList(request, curves);
return ResponseBody.<RequestDataSiteClass, List<ResponseData<HazardResponseMetadata>>> success() return ResponseBody.<RequestDataSiteClass, List<ResponseData<HazardResponseMetadata>>> success()
.metadata(new ResponseMetadata(NetcdfVersion.appVersions()))
.name(SERVICE_NAME) .name(SERVICE_NAME)
.request(request) .request(request)
.response(curvesAsList) .response(curvesAsList)
...@@ -117,6 +122,7 @@ public class NetcdfServiceHazardCurves extends NetcdfService<HazardQuery> { ...@@ -117,6 +122,7 @@ public class NetcdfServiceHazardCurves extends NetcdfService<HazardQuery> {
var curves = netcdf().staticData(request.site, request.siteClass); var curves = netcdf().staticData(request.site, request.siteClass);
return ResponseBody.<RequestDataSiteClass, ResponseData<HazardResponseMetadata>> success() return ResponseBody.<RequestDataSiteClass, ResponseData<HazardResponseMetadata>> success()
.metadata(new ResponseMetadata(NetcdfVersion.appVersions()))
.name(SERVICE_NAME) .name(SERVICE_NAME)
.request(request) .request(request)
.response(toResponseData(request, request.imt, curves.get(request.imt))) .response(toResponseData(request, request.imt, curves.get(request.imt)))
...@@ -182,7 +188,7 @@ public class NetcdfServiceHazardCurves extends NetcdfService<HazardQuery> { ...@@ -182,7 +188,7 @@ public class NetcdfServiceHazardCurves extends NetcdfService<HazardQuery> {
} }
} }
static class HazardResponseMetadata extends ResponseMetadata { static class HazardResponseMetadata extends ServiceResponseMetadata {
public final Imt imt; public final Imt imt;
HazardResponseMetadata(NehrpSiteClass siteClass, Imt imt, String xLabel, String yLabel) { HazardResponseMetadata(NehrpSiteClass siteClass, Imt imt, String xLabel, String yLabel) {
......
package gov.usgs.earthquake.nshmp.netcdf;
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 {
public static VersionInfo[] appVersions() {
VersionInfo[] versions = {
new NetcdfVersion().getVersionInfo(),
new LibVersion().getVersionInfo(),
new WsUtilsVersion().getVersionInfo(),
};
return versions;
}
public VersionInfo getVersionInfo() {
var resource = Resources.getResource("version/nshmp-ws-static-version.json");
return AppVersion.versionInfo(resource);
}
}
...@@ -197,12 +197,12 @@ public abstract class NetcdfService<T extends Query> { ...@@ -197,12 +197,12 @@ public abstract class NetcdfService<T extends Query> {
} }
} }
static class ResponseMetadata { static class ServiceResponseMetadata {
public NehrpSiteClass siteClass; public NehrpSiteClass siteClass;
public String xLabel; public String xLabel;
public String yLabel; public String yLabel;
ResponseMetadata( ServiceResponseMetadata(
NehrpSiteClass siteClass, NehrpSiteClass siteClass,
String xLabel, String xLabel,
String yLabel) { String yLabel) {
...@@ -212,7 +212,7 @@ public abstract class NetcdfService<T extends Query> { ...@@ -212,7 +212,7 @@ public abstract class NetcdfService<T extends Query> {
} }
} }
static class ResponseData<T extends ResponseMetadata> { static class ResponseData<T extends ServiceResponseMetadata> {
final T metadata; final T metadata;
final XySequence data; final XySequence data;
......
...@@ -13,9 +13,11 @@ import com.google.gson.Gson; ...@@ -13,9 +13,11 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import gov.usgs.earthquake.nshmp.gmm.Imt; import gov.usgs.earthquake.nshmp.gmm.Imt;
import gov.usgs.earthquake.nshmp.netcdf.NetcdfVersion;
import gov.usgs.earthquake.nshmp.netcdf.data.NetcdfData; import gov.usgs.earthquake.nshmp.netcdf.data.NetcdfData;
import gov.usgs.earthquake.nshmp.netcdf.data.ScienceBaseMetadata; import gov.usgs.earthquake.nshmp.netcdf.data.ScienceBaseMetadata;
import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ResponseBody;
import gov.usgs.earthquake.nshmp.www.ResponseMetadata;
import gov.usgs.earthquake.nshmp.www.SwaggerUtils; import gov.usgs.earthquake.nshmp.www.SwaggerUtils;
import gov.usgs.earthquake.nshmp.www.WsUtils.EnumSerializer; import gov.usgs.earthquake.nshmp.www.WsUtils.EnumSerializer;
import gov.usgs.earthquake.nshmp.www.WsUtils.NaNSerializer; import gov.usgs.earthquake.nshmp.www.WsUtils.NaNSerializer;
...@@ -55,6 +57,7 @@ public class NetcdfWsUtils { ...@@ -55,6 +57,7 @@ public class NetcdfWsUtils {
String url) { String url) {
var msg = e.getMessage() + " (see logs)"; var msg = e.getMessage() + " (see logs)";
var svcResponse = ResponseBody.error() var svcResponse = ResponseBody.error()
.metadata(new ResponseMetadata(NetcdfVersion.appVersions()))
.name(name) .name(name)
.request(url) .request(url)
.response(msg) .response(msg)
......
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