Search in sources :

Example 11 with OGCException

use of io.arlas.server.ogc.common.exceptions.OGC.OGCException in project ARLAS-server by gisaia.

the class Version method parseVersion.

/**
 * Parses the string argument as a <code>Version</code>.
 * <p>
 * The string value shall contain one x.y.z "version" value (e.g., "2.1.3"). A version number shall contain three
 * non-negative integers separated by decimal points, in the form "x.y.z". The integers y and z shall not exceed 99.
 *
 * @param s a <code>String</code> containing the <code>Version</code> representation to be parsed
 * @return a corresponding <code>Version</code> object
 * @throws OGCException if the string does not contain a parsable <code>Version</code>
 */
public static Version parseVersion(String s, Service service) throws OGCException {
    String[] parts = s.split("\\.");
    if (parts.length != 3) {
        String msg = "String '" + s + " is not a valid OGC/OWS version value.";
        throw new OGCException(OGCExceptionCode.INVALID_PARAMETER_VALUE, msg, "version", service);
    }
    int x = -1;
    int y = -1;
    int z = -1;
    try {
        x = Integer.parseInt(parts[0]);
        y = Integer.parseInt(parts[1]);
        z = Integer.parseInt(parts[2]);
    } catch (NumberFormatException e) {
        String msg = "String '" + s + " is not a valid OGC/OWS version value.";
        throw new OGCException(OGCExceptionCode.INVALID_PARAMETER_VALUE, msg, "version", service);
    }
    return new Version(x, y, z, service);
}
Also used : OGCException(io.arlas.server.ogc.common.exceptions.OGC.OGCException)

Example 12 with OGCException

use of io.arlas.server.ogc.common.exceptions.OGC.OGCException in project ARLAS-server by gisaia.

the class VersionUtils method checkVersion.

public static Version checkVersion(Version requestedVersion, String supportedVersion, Service service) throws OGCException {
    Version version = requestedVersion;
    SortedSet<Version> offeredVersions = new TreeSet<>();
    try {
        offeredVersions.add(getVersion(supportedVersion, service));
    } catch (OGCException e) {
        throw new OGCException(OGCExceptionCode.INVALID_PARAMETER_VALUE, "INVALID VERSION", "version", service);
    }
    if (!offeredVersions.contains(version)) {
        throw new OGCException(OGCExceptionCode.VERSION_NEGOTIATION_FAILED, "INVALID acceptVersions", "acceptVersions", service);
    }
    return version;
}
Also used : TreeSet(java.util.TreeSet) OGCException(io.arlas.server.ogc.common.exceptions.OGC.OGCException)

Example 13 with OGCException

use of io.arlas.server.ogc.common.exceptions.OGC.OGCException in project ARLAS-server by gisaia.

the class CSWRESTService method doKVP.

@Timed
@Path("/csw")
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.TEXT_XML, ATOM.APPLICATION_ATOM_XML, MIME_TYPE__OPENSEARCH_XML })
@ApiOperation(value = "CSW", produces = MediaType.APPLICATION_XML + "," + MediaType.TEXT_XML + "," + ATOM.APPLICATION_ATOM_XML + "," + MIME_TYPE__OPENSEARCH_XML, notes = "CSW")
@ApiResponses(value = { @ApiResponse(code = 200, message = "Successful operation"), @ApiResponse(code = 500, message = "Arlas Server Error.", response = Error.class) })
public Response doKVP(@ApiParam(name = "version", value = "version", allowMultiple = false, required = true) @QueryParam(value = "version") String version, @ApiParam(name = "acceptversions", value = "acceptversions", allowMultiple = false, required = true) @QueryParam(value = "acceptversions") String acceptVersions, @ApiParam(name = "service", value = "service", allowMultiple = false, required = true) @QueryParam(value = "service") String service, @ApiParam(name = "request", value = "request", allowMultiple = false, required = true) @QueryParam(value = "request") String request, @ApiParam(name = "elementname", value = "elementname", allowMultiple = false, required = true) @QueryParam(value = "elementname") String elementName, @ApiParam(name = "elementsetname", value = "elementsetname", allowMultiple = false, required = true) @QueryParam(value = "elementsetname") String elementSetName, @ApiParam(name = "filter", value = "filter", allowMultiple = false, required = true) @QueryParam(value = "filter") String filter, @ApiParam(name = "constraint", value = "constraint", allowMultiple = false, required = true) @QueryParam(value = "constraint") String constraint, @ApiParam(name = "constraintLanguage", value = "constraintLanguage", allowMultiple = false, required = true) @QueryParam(value = "constraintLanguage") String constraintLanguage, @ApiParam(name = "startposition", value = "startposition", allowMultiple = false, required = false) @QueryParam(value = "startposition") Integer startPosition, @ApiParam(name = "maxrecords", value = "maxrecords", allowMultiple = false, required = false) @QueryParam(value = "maxrecords") Integer maxRecords, @ApiParam(name = "sections", value = "sections", allowMultiple = false, required = false) @QueryParam(value = "sections") String sections, @ApiParam(name = "acceptformats", value = "acceptformats", allowMultiple = false, required = false) @QueryParam(value = "acceptformats") String acceptFormats, @ApiParam(name = "q", value = "q", allowMultiple = false, required = false) @QueryParam(value = "q") String query, @ApiParam(name = "bbox", value = "bbox", allowMultiple = false, required = false) @QueryParam(value = "bbox") String bbox, @ApiParam(name = "outputformat", value = "outputformat", allowMultiple = false, required = false) @QueryParam(value = "outputformat") String outputFormat, @ApiParam(name = "outputschema", value = "outputschema", allowMultiple = false, required = false) @QueryParam(value = "outputschema") String outputSchema, @ApiParam(name = "typenames", value = "typenames", allowMultiple = false, required = false) @QueryParam(value = "typenames") String typeNames, @ApiParam(name = "recordids", value = "recordids", allowMultiple = false, required = false) @QueryParam(value = "recordids") String recordIds, @ApiParam(name = "id", value = "id", allowMultiple = false, required = false) @QueryParam(value = "id") String id, @ApiParam(name = "language", value = "language", allowMultiple = false, required = false) @QueryParam(value = "language") String language, @ApiParam(hidden = true) @HeaderParam(value = "Column-Filter") Optional<String> columnFilter, // --------------------------------------------------------
@ApiParam(name = "pretty", value = Documentation.FORM_PRETTY, allowMultiple = false, defaultValue = "false", required = false) @QueryParam(value = "pretty") Boolean pretty, @Context HttpHeaders headers) throws ArlasException, DatatypeConfigurationException, IOException {
    String acceptFormatMediaType = MediaType.APPLICATION_XML;
    String outputFormatMediaType = MediaType.APPLICATION_XML;
    for (MediaType mediaType : headers.getAcceptableMediaTypes()) {
        if (mediaType.getSubtype().contains("opensearchdescription")) {
            OpenSearchHandler openSearchHandler = cswHandler.openSearchHandler;
            OpenSearchDescription description = openSearchHandler.getOpenSearchDescription(serverBaseUri);
            return Response.ok(description).build();
        } else if (mediaType.getSubtype().contains("atom")) {
            outputFormatMediaType = MediaType.APPLICATION_ATOM_XML;
        }
    }
    if (request == null & version == null & service == null) {
        request = "GetCapabilities";
        version = CSWConstant.SUPPORTED_CSW_VERSION;
        service = CSWConstant.CSW;
    }
    String[] sectionList;
    if (sections == null) {
        sectionList = new String[] { "All" };
    } else {
        sectionList = sections.split(",");
        for (String section : sectionList) {
            if (!Arrays.asList(CSWConstant.SECTION_NAMES).contains(section)) {
                throw new OGCException(OGCExceptionCode.INVALID_PARAMETER_VALUE, "Invalid sections", "sections", Service.CSW);
            }
        }
    }
    if (acceptFormats != null) {
        if (acceptFormats.equals("text/xml")) {
            acceptFormatMediaType = MediaType.TEXT_XML;
        } else if (acceptFormats.equals("application/xml")) {
            acceptFormatMediaType = MediaType.APPLICATION_XML;
        } else {
            throw new OGCException(OGCExceptionCode.INVALID_PARAMETER_VALUE, "Invalid acceptFormats", "acceptFormats", Service.CSW);
        }
    }
    if (outputFormat != null) {
        if (outputFormat.equals("application/xml")) {
            outputFormatMediaType = MediaType.APPLICATION_XML;
        } else if (outputFormat.equals("application/atom+xml")) {
            outputFormatMediaType = MediaType.APPLICATION_ATOM_XML;
        } else {
            throw new OGCException(OGCExceptionCode.INVALID_PARAMETER_VALUE, "Invalid outputFormat", "outputFormat", Service.CSW);
        }
    }
    RequestUtils.checkRequestTypeByName(request, CSWConstant.SUPPORTED_CSW_REQUESTYPE, Service.CSW);
    CSWRequestType requestType = CSWRequestType.valueOf(request);
    CSWCheckParam.checkQuerySyntax(requestType, elementName, elementSetName, acceptVersions, version, service, outputSchema, typeNames, bbox, recordIds, query, id, constraintLanguage);
    String[] ids = null;
    if (recordIds != null && recordIds.length() > 0) {
        ids = recordIds.split(",");
    } else if (id != null) {
        ids = new String[] { id };
    }
    BoundingBox boundingBox = null;
    if (bbox != null && bbox.length() > 0) {
        // west, south, east, north CSW spec
        double[] bboxList = GeoFormat.toDoubles(bbox, Service.CSW);
        if (!(isBboxLatLonInCorrectRanges(bboxList) && bboxList[3] > bboxList[1]) && bboxList[0] != bboxList[2]) {
            throw new OGCException(OGCExceptionCode.INVALID_PARAMETER_VALUE, FluidSearchService.INVALID_BBOX, "bbox", Service.CSW);
        }
        boundingBox = new BoundingBox(bboxList[3], bboxList[1], bboxList[0], bboxList[2]);
    }
    startPosition = Optional.ofNullable(startPosition).orElse(1);
    maxRecords = Optional.ofNullable(maxRecords).orElse(cswHandler.ogcConfiguration.queryMaxFeature.intValue());
    elementSetName = Optional.ofNullable(elementSetName).orElse("summary");
    String[] elements = new String[] {};
    if (elementName != null) {
        elements = new String[elementName.split(",").length];
        int i = 0;
        for (String element : elementName.split(",")) {
            if (element.contains(":")) {
                elements[i] = elementName.split(":")[1];
                element = elements[i];
            } else {
                elements[i] = element;
            }
            if (!Arrays.asList(CSWConstant.DC_FIELDS).contains(element.toLowerCase()))
                throw new OGCException(OGCExceptionCode.INVALID_PARAMETER_VALUE, "Invalid elementName", "elementName", Service.CSW);
            i++;
        }
    }
    List<CollectionReference> collections;
    switch(requestType) {
        case GetCapabilities:
            GetCapabilitiesHandler getCapabilitiesHandler = cswHandler.getCapabilitiesHandler;
            List<String> responseSections = Arrays.asList(sectionList);
            String serviceUrl = serverBaseUri + "ogc/csw/?";
            getCapabilitiesHandler.setCapabilitiesType(responseSections, serviceUrl, serverBaseUri + "ogc/csw/opensearch");
            if (cswHandler.inspireConfiguration.enabled) {
                collections = collectionReferenceService.getAllCollectionReferences(columnFilter);
                collections.removeIf(collectionReference -> collectionReference.collectionName.equals(getMetacollectionName()));
                filterCollectionsByColumnFilter(columnFilter, collections);
                if (CollectionUtils.isNotEmpty(collections)) {
                    getCapabilitiesHandler.addINSPIRECompliantElements(collections, responseSections, serviceUrl, language);
                }
            }
            JAXBElement<CapabilitiesType> getCapabilitiesResponse = getCapabilitiesHandler.getCSWCapabilitiesResponse();
            return Response.ok(getCapabilitiesResponse).type(acceptFormatMediaType).build();
        case GetRecords:
            GetRecordsHandler getRecordsHandler = cswHandler.getRecordsHandler;
            CollectionReferences collectionReferences = getCollectionReferencesForGetRecords(elements, null, maxRecords, startPosition, ids, query, constraint, boundingBox);
            collections = new ArrayList<>(collectionReferences.collectionReferences);
            filterCollectionsByColumnFilter(columnFilter, collections);
            long recordsMatched = collectionReferences.totalCollectionReferences;
            if (recordIds != null && recordIds.length() > 0) {
                if (collections.size() == 0) {
                    throw new OGCException(OGCExceptionCode.NOT_FOUND, "Document not Found", "id", Service.CSW);
                }
            }
            GetRecordsResponseType getRecordsResponse = getRecordsHandler.getCSWGetRecordsResponse(collections, ElementSetName.valueOf(elementSetName), startPosition - 1, recordsMatched, elements, outputSchema);
            return Response.ok(getRecordsResponse).type(outputFormatMediaType).build();
        case GetRecordById:
            GetRecordsByIdHandler getRecordsByIdHandler = cswHandler.getRecordsByIdHandler;
            CollectionReferences recordCollectionReferences = ogcDao.getCollectionReferences(elements, null, maxRecords, startPosition - 1, ids, query, constraint, boundingBox);
            collections = new ArrayList<>(recordCollectionReferences.collectionReferences);
            ColumnFilterUtil.assertCollectionsAllowed(columnFilter, collections);
            if (outputSchema != null && outputSchema.equals(CSWConstant.SUPPORTED_CSW_OUTPUT_SCHEMA[2])) {
                GetRecordByIdResponse getRecordByIdResponse = getRecordsByIdHandler.getMDMetadaTypeResponse(collections, ElementSetName.valueOf(elementSetName));
                return Response.ok(getRecordByIdResponse).type(outputFormatMediaType).build();
            } else {
                AbstractRecordType abstractRecordType = getRecordsByIdHandler.getAbstractRecordTypeResponse(collections, ElementSetName.valueOf(elementSetName));
                return Response.ok(abstractRecordType).type(outputFormatMediaType).build();
            }
        default:
            throw new OGCException(OGCExceptionCode.INTERNAL_SERVER_ERROR, "Internal error: Unhandled request '" + request + "'.", Service.CSW);
    }
}
Also used : GetCapabilitiesHandler(io.arlas.server.ogc.csw.operation.getcapabilities.GetCapabilitiesHandler) GetRecordByIdResponse(io.arlas.server.ogc.csw.operation.getrecordbyid.GetRecordByIdResponse) GetRecordsByIdHandler(io.arlas.server.ogc.csw.operation.getrecordbyid.GetRecordsByIdHandler) OpenSearchHandler(io.arlas.server.ogc.csw.operation.opensearch.OpenSearchHandler) AbstractRecordType(net.opengis.cat.csw._3.AbstractRecordType) CollectionReference(io.arlas.server.core.model.CollectionReference) OpenSearchDescription(com.a9.opensearch.OpenSearchDescription) CapabilitiesType(net.opengis.cat.csw._3.CapabilitiesType) GetRecordsHandler(io.arlas.server.ogc.csw.operation.getrecords.GetRecordsHandler) BoundingBox(io.arlas.server.core.utils.BoundingBox) CollectionReferences(io.arlas.server.core.model.CollectionReferences) GetRecordsResponseType(net.opengis.cat.csw._3.GetRecordsResponseType) OGCException(io.arlas.server.ogc.common.exceptions.OGC.OGCException) CSWRequestType(io.arlas.server.ogc.csw.utils.CSWRequestType) Timed(com.codahale.metrics.annotation.Timed)

Example 14 with OGCException

use of io.arlas.server.ogc.common.exceptions.OGC.OGCException in project ARLAS-server by gisaia.

the class ElasticWFSToolService method getFeature.

@Override
public Map<String, Object> getFeature(String id, String bbox, String constraint, String resourceid, String storedquery_id, String partitionFilter, CollectionReference collectionReference, String[] excludes, Optional<String> columnFilter) throws ArlasException, IOException {
    buildWFSQuery(WFSRequestType.GetFeature, id, bbox, constraint, resourceid, storedquery_id, partitionFilter, collectionReference, columnFilter);
    String[] includes = columnFilterToIncludes(collectionReference, columnFilter);
    SearchRequest request = new SearchRequest(collectionReference.params.indexName);
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.fetchSource(includes, excludes).query(wfsQuery);
    request.source(searchSourceBuilder);
    SearchHits hitsGetFeature = exploreServices.getClient().search(request).getHits();
    if (hitsGetFeature.getHits().length > 0) {
        return hitsGetFeature.getAt(0).getSourceAsMap();
    } else {
        throw new OGCException(OGCExceptionCode.NOT_FOUND, "Data not found", "resourceid", Service.WFS);
    }
}
Also used : SearchRequest(org.elasticsearch.action.search.SearchRequest) SearchHits(org.elasticsearch.search.SearchHits) OGCException(io.arlas.server.ogc.common.exceptions.OGC.OGCException) SearchSourceBuilder(org.elasticsearch.search.builder.SearchSourceBuilder)

Example 15 with OGCException

use of io.arlas.server.ogc.common.exceptions.OGC.OGCException in project ARLAS-server by gisaia.

the class CSWCheckParam method checkQuerySyntax.

public static void checkQuerySyntax(CSWRequestType requestType, String elementName, String elementSetName, String acceptVersions, String version, String service, String outputSchema, String typeNames, String bbox, String resourceid, String query, String id, String constraintLanguage) throws OGCException {
    if (service == null) {
        throw new OGCException(OGCExceptionCode.MISSING_PARAMETER_VALUE, "Missing service", "service", Service.CSW);
    }
    if (requestType.equals(CSWRequestType.GetRecordById)) {
        if (id == null) {
            throw new OGCException(OGCExceptionCode.MISSING_PARAMETER_VALUE, "Missing id", "id", Service.CSW);
        }
    }
    if (bbox != null && resourceid != null) {
        throw new OGCException(OGCExceptionCode.OPERATION_NOT_SUPPORTED, "BBOX and RECORDIDS can't be used together", "bbox,recordIds", Service.CSW);
    } else if (resourceid != null && query != null) {
        throw new OGCException(OGCExceptionCode.OPERATION_NOT_SUPPORTED, "RECORDIDS and Q can't be used together", "bbox,q", Service.CSW);
    }
    if (outputSchema != null) {
        boolean isValidOutputSchema = Arrays.asList(CSWConstant.SUPPORTED_CSW_OUTPUT_SCHEMA).contains(outputSchema);
        if (!isValidOutputSchema)
            throw new OGCException(OGCExceptionCode.INVALID_PARAMETER_VALUE, "Invalid outputSchema", "outputSchema", Service.CSW);
    }
    if (typeNames != null) {
        ArrayList<Pattern> accepTypeName = new ArrayList<>();
        Arrays.asList(CSWConstant.SUPPORTED_TYPE_NAME_PATTERN).forEach(field -> {
            accepTypeName.add(Pattern.compile("^" + field + "$"));
        });
        for (String field : Arrays.asList(typeNames.split(","))) {
            boolean validType = accepTypeName.stream().anyMatch(pattern -> pattern.matcher(field).matches());
            if (!validType)
                throw new OGCException(OGCExceptionCode.INVALID_PARAMETER_VALUE, "Invalid typeNames", "typeNames", Service.CSW);
        }
    }
    if (bbox != null) {
        if (bbox.split(",").length == 5) {
            if (bbox.split(",")[4] != "urn:ogc:def:crs:EPSG::4326") {
                throw new OGCException(OGCExceptionCode.INVALID_PARAMETER_VALUE, "Invalid BBOX", "BBOX", Service.CSW);
            }
        }
    }
    ElementSetName elementSetNameEnum;
    if (elementSetName != null) {
        try {
            elementSetNameEnum = ElementSetName.valueOf(elementSetName);
        } catch (IllegalArgumentException e) {
            String msg = "Invalid elementSetName value, allowed values : " + ElementSetName.brief.name() + ", " + ElementSetName.summary.name() + "or " + ElementSetName.full.name();
            throw new OGCException(OGCExceptionCode.INVALID_PARAMETER_VALUE, "Invalid elementSetName", "elementSetName", Service.CSW);
        }
    }
    if (elementName != null && elementSetName != null) {
        throw new OGCException(OGCExceptionCode.NO_APPLICABLE_CODE_400, "elementName and elementSetName can't be used together", "elementName,elementSetName", Service.CSW);
    }
    Version requestVersion = null;
    if (acceptVersions != null) {
        List<String> versions = Arrays.asList(acceptVersions.split(","));
        for (String v : versions) {
            requestVersion = VersionUtils.getVersion(v, Service.CSW);
            VersionUtils.checkVersion(requestVersion, CSWConstant.SUPPORTED_CSW_VERSION, Service.CSW);
        }
    } else {
        requestVersion = VersionUtils.getVersion(version, Service.CSW);
        VersionUtils.checkVersion(requestVersion, CSWConstant.SUPPORTED_CSW_VERSION, Service.CSW);
    }
    if (constraintLanguage != null && !constraintLanguage.equals("") && !Arrays.asList(CSWConstant.SUPPORTED_CSW_CONSTRAINTLANGUAGE).contains(constraintLanguage)) {
        throw new OGCException(OGCExceptionCode.INVALID_PARAMETER_VALUE, "Invalid constraintLanguage. Supported constraint languages are : 'Filter'. ", "outputSchema", Service.CSW);
    }
}
Also used : Pattern(java.util.regex.Pattern) Version(io.arlas.server.ogc.common.utils.Version) ArrayList(java.util.ArrayList) OGCException(io.arlas.server.ogc.common.exceptions.OGC.OGCException)

Aggregations

OGCException (io.arlas.server.ogc.common.exceptions.OGC.OGCException)15 OGCExceptionMessage (io.arlas.server.ogc.common.exceptions.OGC.OGCExceptionMessage)6 Timed (com.codahale.metrics.annotation.Timed)2 CollectionReference (io.arlas.server.core.model.CollectionReference)2 Version (io.arlas.server.ogc.common.utils.Version)2 MDMetadataType (org.isotc211._2005.gmd.MDMetadataType)2 AttributeDescriptor (org.opengis.feature.type.AttributeDescriptor)2 OpenSearchDescription (com.a9.opensearch.OpenSearchDescription)1 ImmutableList (com.google.common.collect.ImmutableList)1 ArlasException (io.arlas.server.core.exceptions.ArlasException)1 CollectionReferences (io.arlas.server.core.model.CollectionReferences)1 CollectionReferenceDescription (io.arlas.server.core.model.response.CollectionReferenceDescription)1 BoundingBox (io.arlas.server.core.utils.BoundingBox)1 GetCapabilitiesHandler (io.arlas.server.ogc.csw.operation.getcapabilities.GetCapabilitiesHandler)1 GetRecordByIdResponse (io.arlas.server.ogc.csw.operation.getrecordbyid.GetRecordByIdResponse)1 GetRecordsByIdHandler (io.arlas.server.ogc.csw.operation.getrecordbyid.GetRecordsByIdHandler)1 GetRecordsHandler (io.arlas.server.ogc.csw.operation.getrecords.GetRecordsHandler)1 OpenSearchHandler (io.arlas.server.ogc.csw.operation.opensearch.OpenSearchHandler)1 CSWRequestType (io.arlas.server.ogc.csw.utils.CSWRequestType)1 GetCapabilitiesHandler (io.arlas.server.ogc.wfs.operation.getcapabilities.GetCapabilitiesHandler)1