use of io.arlas.server.core.model.Link in project ARLAS-server by gisaia.
the class StacRESTService method getCollection.
protected Collection getCollection(CollectionReference collectionReference, UriInfo uriInfo) throws ArlasException {
// https://github.com/radiantearth/stac-spec/blob/master/collection-spec/collection-spec.md#link-object
List<StacLink> cLinks = new ArrayList<>();
cLinks.add(getRootLink(uriInfo));
// TODO
cLinks.add(getRawLink("TODO", "licence"));
cLinks.add(getLink(uriInfo, "collections/" + collectionReference.collectionName, "self", MediaType.APPLICATION_JSON));
cLinks.add(getLink(uriInfo, "collections/" + collectionReference.collectionName + "/items", "items", "application/geo+json"));
// https://github.com/radiantearth/stac-spec/blob/master/collection-spec/collection-spec.md#collection-fields
return new Collection().id(collectionReference.collectionName).stacVersion(configuration.stacVersion).stacExtensions(// TODO optional
new ArrayList<>()).title(collectionReference.params.dublinCoreElementName.title).description(collectionReference.params.dublinCoreElementName.description).keywords(collectionReference.params.inspire.keywords.stream().map(k -> k.value).collect(Collectors.toList())).license(// TODO *required*
"proprietary").extent(new Extent().spatial(getSpatialExtent(collectionReference)).temporal(getTemporalExtent(collectionReference))).links(cLinks);
}
use of io.arlas.server.core.model.Link in project ARLAS-server by gisaia.
the class StacRESTService method getStacFeatureCollection.
protected StacFeatureCollection getStacFeatureCollection(CollectionReference collectionReference, String partitionFilter, Optional<String> columnFilter, SearchBody body, List<String> filter, UriInfo uriInfo, String method, boolean isOgc) throws ArlasException {
Search search = new Search();
search.filter = ParamsParser.getFilter(collectionReference, filter, null, null);
if (body != null) {
search.page = ParamsParser.getPage(new IntParam(body.getLimit().toString()), new IntParam(body.getFrom().toString()), getCleanSortBy(collectionReference.params.idPath, body.getSortBy()), body.getAfter(), body.getBefore());
}
exploreService.setValidGeoFilters(collectionReference, search);
ColumnFilterUtil.assertRequestAllowed(columnFilter, collectionReference, search);
Search searchHeader = new Search();
searchHeader.filter = ParamsParser.getFilter(partitionFilter);
MixedRequest request = new MixedRequest();
request.basicRequest = search;
request.headerRequest = searchHeader;
request.columnFilter = ColumnFilterUtil.getCollectionRelatedColumnFilter(columnFilter, collectionReference);
;
HashMap<String, Object> context = new HashMap<>();
FeatureCollection features = exploreService.getFeatures(request, collectionReference, false, uriInfo, method, context);
// TODO what do we put in there?
List<StacLink> links = new ArrayList<>();
links.add(getRootLink(uriInfo));
if (context.get("self") == null) {
links.add(getSelfLink(uriInfo));
} else {
Arrays.asList("self", "next", "previous").forEach(rel -> {
if (context.containsKey(rel)) {
if (method.equals("POST")) {
links.add(getRawLink(((Link) context.get(rel)).href, rel, getSearchBody(body, (Search) ((Link) context.get(rel)).body)));
} else {
links.add(getRawLink(((Link) context.get(rel)).href, rel));
}
}
});
}
List<Item> items = features.getFeatures().stream().map(feat -> getItem(feat, collectionReference, uriInfo)).collect(Collectors.toList());
StacFeatureCollection response = new StacFeatureCollection();
response.setFeatures(items);
response.setLinks(links);
if (isOgc) {
response.setNumberMatched(((Long) context.get("matched")).intValue());
response.setNumberReturned(items.size());
response.setTimeStamp(ITU.formatUtc(OffsetDateTime.now()));
} else {
Map<String, Object> ctx = new HashMap<>();
ctx.put("returned", Long.valueOf(items.size()));
ctx.put("limit", body.getLimit());
ctx.put("matched", (Long) context.get("matched"));
response.setContext(ctx);
}
return response;
}
use of io.arlas.server.core.model.Link in project ARLAS-server by gisaia.
the class ElasticExploreService method getLinks.
private HashMap<String, Link> getLinks(Search searchRequest, CollectionReference collectionReference, long nbhits, List<SearchHit> searchHitList, UriInfo uriInfo, String method) {
HashMap<String, Link> links = new HashMap<>();
UriInfoWrapper uriInfoUtil = new UriInfoWrapper(uriInfo, getBaseUri());
Link self = new Link();
self.href = uriInfoUtil.getRequestUri();
self.method = method;
Link next = null;
Link previous = null;
int lastIndex = (int) nbhits - 1;
String sortParam = searchRequest.page != null ? searchRequest.page.sort : null;
String afterParam = searchRequest.page != null ? searchRequest.page.after : null;
String beforeParam = searchRequest.page != null ? searchRequest.page.before : null;
Integer sizeParam = searchRequest.page != null ? searchRequest.page.size : SEARCH_DEFAULT_PAGE_SIZE;
String lastHitAfter = "";
String firstHitAfter = "";
if (lastIndex >= 0 && sizeParam == nbhits && sortParam != null && (afterParam != null || sortParam.contains(collectionReference.params.idPath))) {
next = new Link();
next.method = method;
// Use sorted value of last element return by ES to build after param of next & previous link
lastHitAfter = Arrays.stream(searchHitList.get(lastIndex).getSortValues()).map(Object::toString).collect(Collectors.joining(","));
}
if (searchHitList.size() > 0 && sortParam != null && (beforeParam != null || sortParam.contains(collectionReference.params.idPath))) {
previous = new Link();
previous.method = method;
firstHitAfter = Arrays.stream(searchHitList.get(0).getSortValues()).map(Object::toString).collect(Collectors.joining(","));
}
switch(method) {
case "GET":
links.put("self", self);
if (next != null) {
next.href = uriInfoUtil.getNextHref(lastHitAfter);
links.put("next", next);
}
if (previous != null) {
previous.href = uriInfoUtil.getPreviousHref(firstHitAfter);
links.put("previous", previous);
}
break;
case "POST":
self.body = searchRequest;
links.put("self", self);
if (next != null) {
Page nextPage = new Page();
Search search = new Search();
search.filter = searchRequest.filter;
search.form = searchRequest.form;
search.projection = searchRequest.projection;
search.returned_geometries = searchRequest.returned_geometries;
nextPage.sort = searchRequest.page.sort;
nextPage.size = searchRequest.page.size;
nextPage.from = searchRequest.page.from;
nextPage.after = lastHitAfter;
search.page = nextPage;
next.href = self.href;
next.body = search;
links.put("next", next);
}
if (previous != null) {
Page previousPage = new Page();
Search search = new Search();
search.filter = searchRequest.filter;
search.form = searchRequest.form;
search.projection = searchRequest.projection;
search.returned_geometries = searchRequest.returned_geometries;
previousPage.sort = searchRequest.page.sort;
previousPage.size = searchRequest.page.size;
previousPage.from = searchRequest.page.from;
previousPage.before = firstHitAfter;
search.page = previousPage;
previous.href = self.href;
previous.body = search;
links.put("previous", previous);
}
break;
}
return links;
}
Aggregations