Search in sources :

Example 1 with Link

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);
}
Also used : java.util(java.util) Link(io.arlas.server.core.model.Link) MixedRequest(io.arlas.server.core.model.request.MixedRequest) Path(javax.ws.rs.Path) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Feature(org.geojson.Feature) ComputationRequest(io.arlas.server.core.model.request.ComputationRequest) Collection(io.arlas.server.stac.model.Collection) MediaType(javax.ws.rs.core.MediaType) ArlasException(io.arlas.server.core.exceptions.ArlasException) ExploreService(io.arlas.server.core.services.ExploreService) FeatureCollection(org.geojson.FeatureCollection) InvalidParameterException(io.arlas.server.core.exceptions.InvalidParameterException) IntParam(io.dropwizard.jersey.params.IntParam) io.arlas.server.core.utils(io.arlas.server.core.utils) UriBuilder(javax.ws.rs.core.UriBuilder) Api(io.swagger.annotations.Api) ZoneOffset(java.time.ZoneOffset) Search(io.arlas.server.core.model.request.Search) Polygon(org.geojson.Polygon) CollectionReference(io.arlas.server.core.model.CollectionReference) CollectionReferenceService(io.arlas.server.core.services.CollectionReferenceService) GeoJsonObject(org.geojson.GeoJsonObject) ITU(com.ethlo.time.ITU) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) Instant(java.time.Instant) ComputationEnum(io.arlas.server.core.model.enumerations.ComputationEnum) io.arlas.server.stac.model(io.arlas.server.stac.model) Collectors(java.util.stream.Collectors) MD(io.arlas.server.core.model.response.MD) TimestampTypeMapper.formatDate(io.arlas.server.core.utils.TimestampTypeMapper.formatDate) DateTimeParseException(java.time.format.DateTimeParseException) OffsetDateTime(java.time.OffsetDateTime) Stream(java.util.stream.Stream) Response(javax.ws.rs.core.Response) ParseException(org.locationtech.jts.io.ParseException) STACConfiguration(io.arlas.server.core.app.STACConfiguration) Geometry(org.locationtech.jts.geom.Geometry) UriInfo(javax.ws.rs.core.UriInfo) OperatorEnum(io.arlas.server.core.model.enumerations.OperatorEnum) Collection(io.arlas.server.stac.model.Collection) FeatureCollection(org.geojson.FeatureCollection)

Example 2 with Link

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;
}
Also used : java.util(java.util) Link(io.arlas.server.core.model.Link) MixedRequest(io.arlas.server.core.model.request.MixedRequest) Path(javax.ws.rs.Path) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Feature(org.geojson.Feature) ComputationRequest(io.arlas.server.core.model.request.ComputationRequest) Collection(io.arlas.server.stac.model.Collection) MediaType(javax.ws.rs.core.MediaType) ArlasException(io.arlas.server.core.exceptions.ArlasException) ExploreService(io.arlas.server.core.services.ExploreService) FeatureCollection(org.geojson.FeatureCollection) InvalidParameterException(io.arlas.server.core.exceptions.InvalidParameterException) IntParam(io.dropwizard.jersey.params.IntParam) io.arlas.server.core.utils(io.arlas.server.core.utils) UriBuilder(javax.ws.rs.core.UriBuilder) Api(io.swagger.annotations.Api) ZoneOffset(java.time.ZoneOffset) Search(io.arlas.server.core.model.request.Search) Polygon(org.geojson.Polygon) CollectionReference(io.arlas.server.core.model.CollectionReference) CollectionReferenceService(io.arlas.server.core.services.CollectionReferenceService) GeoJsonObject(org.geojson.GeoJsonObject) ITU(com.ethlo.time.ITU) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) Instant(java.time.Instant) ComputationEnum(io.arlas.server.core.model.enumerations.ComputationEnum) io.arlas.server.stac.model(io.arlas.server.stac.model) Collectors(java.util.stream.Collectors) MD(io.arlas.server.core.model.response.MD) TimestampTypeMapper.formatDate(io.arlas.server.core.utils.TimestampTypeMapper.formatDate) DateTimeParseException(java.time.format.DateTimeParseException) OffsetDateTime(java.time.OffsetDateTime) Stream(java.util.stream.Stream) Response(javax.ws.rs.core.Response) ParseException(org.locationtech.jts.io.ParseException) STACConfiguration(io.arlas.server.core.app.STACConfiguration) Geometry(org.locationtech.jts.geom.Geometry) UriInfo(javax.ws.rs.core.UriInfo) OperatorEnum(io.arlas.server.core.model.enumerations.OperatorEnum) MixedRequest(io.arlas.server.core.model.request.MixedRequest) IntParam(io.dropwizard.jersey.params.IntParam) FeatureCollection(org.geojson.FeatureCollection) Search(io.arlas.server.core.model.request.Search) GeoJsonObject(org.geojson.GeoJsonObject) Link(io.arlas.server.core.model.Link)

Example 3 with Link

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;
}
Also used : Link(io.arlas.server.core.model.Link) GeoPoint(org.elasticsearch.common.geo.GeoPoint)

Aggregations

Link (io.arlas.server.core.model.Link)3 ITU (com.ethlo.time.ITU)2 JsonProcessingException (com.fasterxml.jackson.core.JsonProcessingException)2 STACConfiguration (io.arlas.server.core.app.STACConfiguration)2 ArlasException (io.arlas.server.core.exceptions.ArlasException)2 InvalidParameterException (io.arlas.server.core.exceptions.InvalidParameterException)2 CollectionReference (io.arlas.server.core.model.CollectionReference)2 ComputationEnum (io.arlas.server.core.model.enumerations.ComputationEnum)2 OperatorEnum (io.arlas.server.core.model.enumerations.OperatorEnum)2 ComputationRequest (io.arlas.server.core.model.request.ComputationRequest)2 MixedRequest (io.arlas.server.core.model.request.MixedRequest)2 Search (io.arlas.server.core.model.request.Search)2 MD (io.arlas.server.core.model.response.MD)2 CollectionReferenceService (io.arlas.server.core.services.CollectionReferenceService)2 ExploreService (io.arlas.server.core.services.ExploreService)2 io.arlas.server.core.utils (io.arlas.server.core.utils)2 TimestampTypeMapper.formatDate (io.arlas.server.core.utils.TimestampTypeMapper.formatDate)2 io.arlas.server.stac.model (io.arlas.server.stac.model)2 Collection (io.arlas.server.stac.model.Collection)2 IntParam (io.dropwizard.jersey.params.IntParam)2