Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: aodn/ogcapi-java
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v0.0.23
Choose a base ref
...
head repository: aodn/ogcapi-java
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: main
Choose a head ref
Loading
Showing with 4,217 additions and 454 deletions.
  1. +1 −0 Dockerfile
  2. +17 −1 pom.xml
  3. +17 −0 server/pom.xml
  4. +5 −1 server/src/main/java/au/org/aodn/ogcapi/server/common/RestApi.java
  5. +31 −0 server/src/main/java/au/org/aodn/ogcapi/server/core/configuration/AwsConfig.java
  6. +30 −12 server/src/main/java/au/org/aodn/ogcapi/server/core/mapper/Converter.java
  7. +4 −3 server/src/main/java/au/org/aodn/ogcapi/server/core/mapper/StacToCollections.java
  8. +50 −0 server/src/main/java/au/org/aodn/ogcapi/server/core/mapper/StacToFeatureCollection.java
  9. +3 −2 server/src/main/java/au/org/aodn/ogcapi/server/core/mapper/StacToInlineResponse2002.java
  10. +2 −2 server/src/main/java/au/org/aodn/ogcapi/server/core/mapper/StacToTileSetWmWGS84Q.java
  11. +53 −0 server/src/main/java/au/org/aodn/ogcapi/server/core/model/AssetModel.java
  12. +30 −10 ...main/java/au/org/aodn/ogcapi/server/core/model/{DatasetSearchResult.java → DataSearchResult.java}
  13. +0 −12 server/src/main/java/au/org/aodn/ogcapi/server/core/model/DatasetModel.java
  14. +0 −18 server/src/main/java/au/org/aodn/ogcapi/server/core/model/DatumModel.java
  15. +5 −0 server/src/main/java/au/org/aodn/ogcapi/server/core/model/InlineValue.java
  16. +2 −0 server/src/main/java/au/org/aodn/ogcapi/server/core/model/StacCollectionModel.java
  17. +76 −0 server/src/main/java/au/org/aodn/ogcapi/server/core/model/StacItemModel.java
  18. +3 −3 server/src/main/java/au/org/aodn/ogcapi/server/core/model/SummariesModel.java
  19. +146 −0 server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/CQLFeatureFields.java
  20. +7 −0 server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/CQLFields.java
  21. +1 −1 server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/CollectionProperty.java
  22. +46 −0 server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/DatasetDownloadEnums.java
  23. +11 −0 server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/FeatureId.java
  24. +2 −2 server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/FeatureProperty.java
  25. +15 −0 server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/InlineResponseKeyEnum.java
  26. +15 −0 server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/ProcessIdEnum.java
  27. +3 −1 server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/StacBasicField.java
  28. +1 −0 server/src/main/java/au/org/aodn/ogcapi/server/core/parser/elastic/BBoxImpl.java
  29. +82 −16 server/src/main/java/au/org/aodn/ogcapi/server/core/parser/stac/GeometryVisitor.java
  30. +1 −1 server/src/main/java/au/org/aodn/ogcapi/server/core/service/CacheNoLandGeometry.java
  31. +224 −81 server/src/main/java/au/org/aodn/ogcapi/server/core/service/ElasticSearch.java
  32. +155 −9 server/src/main/java/au/org/aodn/ogcapi/server/core/service/ElasticSearchBase.java
  33. +52 −5 server/src/main/java/au/org/aodn/ogcapi/server/core/service/OGCApiService.java
  34. +8 −7 server/src/main/java/au/org/aodn/ogcapi/server/core/service/Search.java
  35. +17 −0 server/src/main/java/au/org/aodn/ogcapi/server/core/util/CommonUtils.java
  36. +11 −2 server/src/main/java/au/org/aodn/ogcapi/server/core/util/GeometryUtils.java
  37. +86 −16 server/src/main/java/au/org/aodn/ogcapi/server/features/RestApi.java
  38. +3 −18 server/src/main/java/au/org/aodn/ogcapi/server/features/RestServices.java
  39. +102 −0 server/src/main/java/au/org/aodn/ogcapi/server/processes/RestApi.java
  40. +100 −0 server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java
  41. +18 −0 server/src/main/java/au/org/aodn/ogcapi/server/processes/config/generate-csv-data-file.json
  42. +5 −2 server/src/main/resources/application.yaml
  43. +30 −12 server/src/test/java/au/org/aodn/ogcapi/server/BaseTestClass.java
  44. +57 −27 server/src/test/java/au/org/aodn/ogcapi/server/common/RestApiTest.java
  45. +15 −15 server/src/test/java/au/org/aodn/ogcapi/server/common/RestExtApiTest.java
  46. +0 −80 server/src/test/java/au/org/aodn/ogcapi/server/core/parser/stac/ParserTest.java
  47. +7 −6 server/src/test/java/au/org/aodn/ogcapi/server/core/service/OGCApiServiceTest.java
  48. +151 −8 server/src/test/java/au/org/aodn/ogcapi/server/features/RestApiTest.java
  49. +89 −0 server/src/test/java/au/org/aodn/ogcapi/server/processes/RestApiTest.java
  50. +71 −0 server/src/test/java/au/org/aodn/ogcapi/server/processes/RestServicesTest.java
  51. +15 −14 server/src/test/java/au/org/aodn/ogcapi/server/tile/RestApiTest.java
  52. +46 −0 server/src/test/resources/data_index_schema.json
  53. +1,798 −0 server/src/test/resources/databag/35234913-aa3c-48ec-b9a4-77f822f66ef8.json
  54. +31 −0 server/src/test/resources/databag/cloudoptimized/35234913-aa3c-48ec-b9a4-77f822f66ef8/sample1.0.json
  55. +31 −0 server/src/test/resources/databag/cloudoptimized/35234913-aa3c-48ec-b9a4-77f822f66ef8/sample1.1.json
  56. +31 −0 server/src/test/resources/databag/cloudoptimized/35234913-aa3c-48ec-b9a4-77f822f66ef8/sample1.2.json
  57. +31 −0 server/src/test/resources/databag/cloudoptimized/35234913-aa3c-48ec-b9a4-77f822f66ef8/sample2.0.json
  58. +31 −0 server/src/test/resources/databag/cloudoptimized/35234913-aa3c-48ec-b9a4-77f822f66ef8/sample3.0.json
  59. +31 −0 server/src/test/resources/databag/cloudoptimized/35234913-aa3c-48ec-b9a4-77f822f66ef8/sample3.1.json
  60. +31 −0 server/src/test/resources/databag/cloudoptimized/35234913-aa3c-48ec-b9a4-77f822f66ef8/sample3.2.json
  61. +31 −0 server/src/test/resources/databag/cloudoptimized/35234913-aa3c-48ec-b9a4-77f822f66ef8/sample4.0.json
  62. +31 −0 server/src/test/resources/databag/cloudoptimized/35234913-aa3c-48ec-b9a4-77f822f66ef8/sample5.0.json
  63. +31 −0 server/src/test/resources/databag/cloudoptimized/35234913-aa3c-48ec-b9a4-77f822f66ef8/sample5.1.json
  64. +188 −67 server/src/test/resources/portal_records_index_schema.json
1 change: 1 addition & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -5,6 +5,7 @@ COPY ./server/target/ogcapi-java-server-*-exec.jar app.jar
ENTRYPOINT [\
"java",\
"-Delasticsearch.index.name=${INDEX_NAME}",\
"-Delasticsearch.cloud_optimized_index.name=${CO_INDEX_NAME}",\
"-Delasticsearch.vocabs_index.name=${VOCABS_INDEX_NAME}",\
"-Dapi.host=${HOST}:${PORT}",\
"-Dserver.port=${PORT}",\
18 changes: 17 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.3</version>
<version>3.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>au.org.aodn.ogcapi</groupId>
@@ -26,6 +26,7 @@
<org.geotools.version>29.2</org.geotools.version>
<maven.deploy.skip>true</maven.deploy.skip>
<versioning.updatePom>true</versioning.updatePom>
<aws.sdk.version>2.29.52</aws.sdk.version>
</properties>
<repositories>
<repository>
@@ -137,6 +138,21 @@
<artifactId>spatial4j</artifactId>
<version>0.8</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>batch</artifactId>
<version>${aws.sdk.version}</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>auth</artifactId>
<version>${aws.sdk.version}</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>ses</artifactId>
<version>${aws.sdk.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<distributionManagement>
17 changes: 17 additions & 0 deletions server/pom.xml
Original file line number Diff line number Diff line change
@@ -20,6 +20,18 @@
</properties>

<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>batch</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>auth</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>ses</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
@@ -71,6 +83,11 @@
<artifactId>ogcapi-features-java</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>au.org.aodn.ogcapi</groupId>
<artifactId>ogcapi-processes-java</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
Original file line number Diff line number Diff line change
@@ -9,6 +9,7 @@
import au.org.aodn.ogcapi.features.model.Exception;
import au.org.aodn.ogcapi.server.core.mapper.StacToCollections;
import au.org.aodn.ogcapi.server.core.model.enumeration.CQLCrsType;
import au.org.aodn.ogcapi.server.core.model.enumeration.CQLFields;
import au.org.aodn.ogcapi.server.core.model.enumeration.CQLFilterType;
import au.org.aodn.ogcapi.server.core.model.enumeration.OGCMediaTypeMapper;
import au.org.aodn.ogcapi.server.core.service.OGCApiService;
@@ -154,7 +155,10 @@ public ResponseEntity<?> getCollections(
// TODO: Support other CRS.
if (CQLFilterType.convert(filterLang) == CQLFilterType.CQL && CQLCrsType.convertFromUrl(crs) == CQLCrsType.EPSG4326) {
if (datetime != null) {
filter = OGCApiService.processDatetimeParameter(datetime, filter);
filter = OGCApiService.processDatetimeParameter(CQLFields.temporal.name(), datetime, filter);
}
if (bbox != null) {
filter = OGCApiService.processBBoxParameter(CQLFields.geometry.name(), bbox, filter);
}
return commonService.getCollectionList(
q,
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package au.org.aodn.ogcapi.server.core.configuration;

import au.org.aodn.ogcapi.server.processes.RestServices;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.batch.BatchClient;

@Configuration
public class AwsConfig {

@Value("${aws.region}")
private String awsRegion;

@Bean
public BatchClient batchClient() {
return BatchClient
.builder()
.region(Region.of(awsRegion))
.credentialsProvider(DefaultCredentialsProvider.create())
.build();
}

@Bean
public RestServices awsBatchService(BatchClient batchClient, ObjectMapper objectMapper) {
return new RestServices(batchClient, objectMapper);
}
}
Original file line number Diff line number Diff line change
@@ -18,8 +18,8 @@
import org.slf4j.LoggerFactory;
import org.springframework.http.MediaType;

import java.util.ArrayList;
import java.util.Map;
import java.util.stream.Collectors;

import static au.org.aodn.ogcapi.server.core.util.GeometryUtils.createCentroid;

@@ -101,18 +101,32 @@ default <D extends StacCollectionModel> Collection getCollection(D m, Filter fil
collection.setExtent(extent);
}

if(m.getLinks() != null) {
if(m.getLinks() != null || m.getUuid() != null || m.getAssets() != null) {
collection.setLinks(new ArrayList<>());

// Convert object type.
collection.setLinks(
m.getLinks()
.stream()
.map(l -> new Link()
.href(l.getHref())
.type(l.getType())
.rel(l.getRel())
.title(l.getTitle())
)
.collect(Collectors.toList()));
if(m.getLinks() != null) {
collection.getLinks().addAll(
m.getLinks()
.stream()
.map(l -> new Link()
.href(l.getHref())
.type(l.getType())
.rel(l.getRel())
.title(l.getTitle())
)
.toList()
);
}

if(m.getAssets() != null) {
m.getAssets().values().forEach(i -> collection.getLinks().add(new Link()
.title(i.getTitle())
.href(host + "/api/v1/ogc" + i.getHref())
.type(i.getType())
.rel(i.getRole().toString().toLowerCase())
));
}
}

if (m.getContacts() != null) {
@@ -155,6 +169,10 @@ default <D extends StacCollectionModel> Collection getCollection(D m, Filter fil
collection.getProperties().put(CollectionProperty.credits, m.getSummaries().getCredits());
}

if (m.getSummaries().getUpdateFrequency() != null) {
collection.getProperties().put(CollectionProperty.pace, m.getSummaries().getUpdateFrequency());
}

if (m.getSummaries().getGeometry() != null) {
collection.getProperties().put(CollectionProperty.geometry, m.getSummaries().getGeometry());
}
Original file line number Diff line number Diff line change
@@ -3,6 +3,7 @@
import au.org.aodn.ogcapi.features.model.Collection;
import au.org.aodn.ogcapi.features.model.Collections;
import au.org.aodn.ogcapi.server.core.model.ExtendedCollections;
import au.org.aodn.ogcapi.server.core.model.StacCollectionModel;
import au.org.aodn.ogcapi.server.core.service.ElasticSearch;
import org.mapstruct.Mapper;
import org.opengis.filter.Filter;
@@ -14,17 +15,17 @@

@Service
@Mapper(componentModel = "spring")
public abstract class StacToCollections implements Converter<ElasticSearch.SearchResult, Collections> {
public abstract class StacToCollections implements Converter<ElasticSearch.SearchResult<StacCollectionModel>, Collections> {

@Value("${api.host}")
protected String hostname;

@Override
public Collections convert(ElasticSearch.SearchResult model, Filter filter) {
public Collections convert(ElasticSearch.SearchResult<StacCollectionModel> model, Filter filter) {

List<Collection> collections = model.getCollections().parallelStream()
.map(m -> getCollection(m, filter, hostname))
.collect(Collectors.toList());
.toList();

ExtendedCollections result = new ExtendedCollections();
result.setTotal(model.getTotal());
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package au.org.aodn.ogcapi.server.core.mapper;

import au.org.aodn.ogcapi.features.model.FeatureCollectionGeoJSON;
import au.org.aodn.ogcapi.features.model.FeatureGeoJSON;
import au.org.aodn.ogcapi.features.model.PointGeoJSON;
import au.org.aodn.ogcapi.server.core.model.StacItemModel;
import au.org.aodn.ogcapi.server.core.service.ElasticSearch;
import org.mapstruct.Mapper;
import org.opengis.filter.Filter;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

@Service
@Mapper(componentModel = "spring")
public abstract class StacToFeatureCollection implements Converter<ElasticSearch.SearchResult<StacItemModel>, FeatureCollectionGeoJSON> {

@Override
public FeatureCollectionGeoJSON convert(ElasticSearch.SearchResult<StacItemModel> model, Filter filter) {
FeatureCollectionGeoJSON f = new FeatureCollectionGeoJSON();
f.setType(FeatureCollectionGeoJSON.TypeEnum.FEATURECOLLECTION);

List<FeatureGeoJSON> features = model.getCollections().parallelStream()
.map(i -> {
FeatureGeoJSON feature = new FeatureGeoJSON();
feature.setType(FeatureGeoJSON.TypeEnum.FEATURE);

if(i.getGeometry().get("geometry") instanceof Map<?, ?> map) {
if(map.get("coordinates") instanceof List<?> coords) {
List<BigDecimal> c = coords.stream()
.filter(item -> item instanceof BigDecimal)
.map(item -> (BigDecimal)item)
.toList();

feature.setGeometry(new PointGeoJSON().type(PointGeoJSON.TypeEnum.POINT).coordinates(c));
}
}
feature.setProperties(i.getProperties());

return feature;
})
.filter(i -> i.getGeometry() != null)
.toList();

f.setFeatures(features);
return f;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package au.org.aodn.ogcapi.server.core.mapper;

import au.org.aodn.ogcapi.server.core.model.StacCollectionModel;
import au.org.aodn.ogcapi.server.core.model.enumeration.CQLCrsType;
import au.org.aodn.ogcapi.server.core.service.ElasticSearch;
import au.org.aodn.ogcapi.tile.model.InlineResponse2002;
@@ -14,13 +15,13 @@

@Service
@Mapper(componentModel = "spring")
public abstract class StacToInlineResponse2002 implements Converter<ElasticSearch.SearchResult, InlineResponse2002> {
public abstract class StacToInlineResponse2002 implements Converter<ElasticSearch.SearchResult<StacCollectionModel>, InlineResponse2002> {

@Value("${api.host}")
protected String hostname;

@Override
public InlineResponse2002 convert(ElasticSearch.SearchResult model, Filter noUse) {
public InlineResponse2002 convert(ElasticSearch.SearchResult<StacCollectionModel> model, Filter noUse) {
List<TileSetItem> items = model.getCollections().stream()
.map(m -> {
TileSetItem item = new TileSetItem();
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@

@Service
@Mapper(componentModel = "spring")
public abstract class StacToTileSetWmWGS84Q implements Converter<ElasticSearch.SearchResult, TileSet> {
public abstract class StacToTileSetWmWGS84Q implements Converter<ElasticSearch.SearchResult<StacCollectionModel>, TileSet> {

@Value("${api.host}")
protected String hostname;
@@ -27,7 +27,7 @@ protected static class TileSetWorldMercatorWGS84Quad extends TileSet {
}

@Override
public TileSet convert(ElasticSearch.SearchResult from, Filter noUse) {
public TileSet convert(ElasticSearch.SearchResult<StacCollectionModel> from, Filter noUse) {
TileSetWorldMercatorWGS84Quad tileSet = new TileSetWorldMercatorWGS84Quad();

tileSet.setTileMatrixSetURI("http://www.opengis.net/def/tilematrixset/OGC/1.0/WorldMercatorWGS84Quad");
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package au.org.aodn.ogcapi.server.core.model;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class AssetModel {
// https://github.com/radiantearth/stac-spec/blob/master/best-practices.md#list-of-asset-roles
public enum Role {
DATA("data"),
METADATA("metadata"),
THUMBNAIL("thumbnail"),
SUMMARY("summary"),
OVERVIEW("overview"),
VISUAL("visual"),
DATE("date"),
GRAPHIC("graphic"),
DATA_MASK("data-mask"),
SNOW_ICE("snow-ice"),
LAND_WATER("land-water"),
WATER_MASK("water-mask"),
ISO_19115("iso-19115");

private final String role;

Role(String role) {
this.role = role;
}

@Override
public String toString() {
return role;
}
}
/**
* REQUIRED. URI to the asset object. Relative and absolute URI are both allowed. Trailing slashes are significant.
*/
protected String href;
protected String title;
protected String description;
protected String type;
/**
* The semantic roles of the asset, similar to the use of rel in links.
*/
protected Role role;
}
Loading