Search in sources :

Example 1 with FeatureCollectionType

use of net.opengis.wfs.v_2_0_0.FeatureCollectionType in project arctic-sea by 52North.

the class GmlEncoderv321 method createFeatureCollection.

private XmlObject createFeatureCollection(FeatureCollection element, EncodingContext ctx) throws EncodingException {
    FeatureCollectionDocument featureCollectionDoc = FeatureCollectionDocument.Factory.newInstance(getXmlOptions());
    FeatureCollectionType featureCollection = featureCollectionDoc.addNewFeatureCollection();
    featureCollection.setId(element.getGmlId());
    EncodingContext context = ctx.with(XmlBeansEncodingFlags.PROPERTY_TYPE).without(XmlBeansEncodingFlags.DOCUMENT);
    if (element.isSetMembers()) {
        for (AbstractFeature abstractFeature : element.getMembers().values()) {
            featureCollection.addNewFeatureMember().set(createFeaturePropertyType(abstractFeature, context));
        }
    }
    if (ctx.has(XmlBeansEncodingFlags.DOCUMENT)) {
        return featureCollectionDoc;
    }
    FeaturePropertyType featurePropertyType = FeaturePropertyType.Factory.newInstance(getXmlOptions());
    featurePropertyType.addNewAbstractFeature().set(featureCollection);
    return XmlHelper.substituteElement(featurePropertyType.getAbstractFeature(), featurePropertyType);
// return featureCollection;
}
Also used : FeatureCollectionType(net.opengis.gml.x32.FeatureCollectionType) FeatureCollectionDocument(net.opengis.gml.x32.FeatureCollectionDocument) AbstractFeature(org.n52.shetland.ogc.gml.AbstractFeature) FeaturePropertyType(net.opengis.gml.x32.FeaturePropertyType)

Example 2 with FeatureCollectionType

use of net.opengis.wfs.v_2_0_0.FeatureCollectionType in project ddf by codice.

the class FeatureCollectionMessageBodyReaderWfs20 method readFrom.

@SuppressWarnings({ "unchecked", "squid:S2093" })
@Override
public Wfs20FeatureCollection readFrom(Class<Wfs20FeatureCollection> clazz, Type type, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> headers, InputStream inStream) throws IOException, WebApplicationException {
    // Save original input stream for any exception message that might need to be
    // created and additional attributes
    String originalInputStream = IOUtils.toString(inStream, "UTF-8");
    LOGGER.debug("{}", LogSanitizer.sanitize(originalInputStream));
    ClassLoader ccl = Thread.currentThread().getContextClassLoader();
    try {
        Thread.currentThread().setContextClassLoader(FeatureCollectionMessageBodyReaderWfs20.class.getClassLoader());
        // Fetch FeatureCollection attributes
        Unmarshaller unmarshaller = null;
        JAXBElement<FeatureCollectionType> wfsFeatureCollectionType = null;
        xstream.allowTypeHierarchy(Wfs20FeatureCollection.class);
        try {
            unmarshaller = JAXB_CONTEXT.createUnmarshaller();
            XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
            xmlInputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
            xmlInputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
            xmlInputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
            XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(new StringReader(originalInputStream));
            wfsFeatureCollectionType = (JAXBElement<FeatureCollectionType>) unmarshaller.unmarshal(xmlStreamReader);
        } catch (ClassCastException e1) {
            LOGGER.debug("Exception unmarshalling {}, could be an OWS Exception Report from server.", e1.getMessage());
            // If an ExceptionReport is sent from the remote WFS site it will be sent with an
            // JAX-RS "OK" status, hence the ErrorResponse exception mapper will not fire.
            // Instead the ServiceExceptionReport will come here and be treated like a GetFeature
            // response, resulting in an XStreamException since ExceptionReport cannot be
            // unmarshalled. So this catch clause is responsible for catching that XStream
            // exception and creating a JAX-RS response containing the original stream
            // (with the ExceptionReport) and rethrowing it as a WebApplicationException,
            // which CXF will wrap as a ClientException that the WfsSource catches, converts
            // to a WfsException, and logs.
            ByteArrayInputStream bis = new ByteArrayInputStream(originalInputStream.getBytes(StandardCharsets.UTF_8));
            ResponseBuilder responseBuilder = Response.ok(bis);
            responseBuilder.type("text/xml");
            Response response = responseBuilder.build();
            throw new WebApplicationException(e1, response);
        } catch (VirtualMachineError e) {
            throw e;
        } catch (JAXBException | XMLStreamException e1) {
            LOGGER.debug("Error in retrieving feature collection.", e1);
        } catch (RuntimeException e) {
            LOGGER.debug("Error processing collection", e);
            throw e;
        }
        Wfs20FeatureCollection featureCollection = null;
        if (null != wfsFeatureCollectionType && null != wfsFeatureCollectionType.getValue()) {
            BigInteger numberReturned = wfsFeatureCollectionType.getValue().getNumberReturned();
            String numberMatched = wfsFeatureCollectionType.getValue().getNumberMatched();
            // Re-create the input stream (since it has already been read for potential
            // exception message creation)
            inStream = new ByteArrayInputStream(originalInputStream.getBytes("UTF-8"));
            try {
                xstream.allowTypeHierarchy(Wfs20FeatureCollection.class);
                featureCollection = (Wfs20FeatureCollection) xstream.fromXML(inStream);
                featureCollection.setNumberMatched(numberMatched);
                featureCollection.setNumberReturned(numberReturned);
            } catch (XStreamException e) {
                LOGGER.debug("Exception unmarshalling", e);
            } finally {
                IOUtils.closeQuietly(inStream);
            }
        }
        return featureCollection;
    } finally {
        Thread.currentThread().setContextClassLoader(ccl);
    }
}
Also used : FeatureCollectionType(net.opengis.wfs.v_2_0_0.FeatureCollectionType) XMLStreamReader(javax.xml.stream.XMLStreamReader) WebApplicationException(javax.ws.rs.WebApplicationException) JAXBException(javax.xml.bind.JAXBException) Wfs20FeatureCollection(org.codice.ddf.spatial.ogc.wfs.v2_0_0.catalog.common.Wfs20FeatureCollection) Response(javax.ws.rs.core.Response) XStreamException(com.thoughtworks.xstream.XStreamException) XMLStreamException(javax.xml.stream.XMLStreamException) ByteArrayInputStream(java.io.ByteArrayInputStream) StringReader(java.io.StringReader) BigInteger(java.math.BigInteger) Unmarshaller(javax.xml.bind.Unmarshaller) ResponseBuilder(javax.ws.rs.core.Response.ResponseBuilder) XMLInputFactory(javax.xml.stream.XMLInputFactory)

Aggregations

XStreamException (com.thoughtworks.xstream.XStreamException)1 ByteArrayInputStream (java.io.ByteArrayInputStream)1 StringReader (java.io.StringReader)1 BigInteger (java.math.BigInteger)1 WebApplicationException (javax.ws.rs.WebApplicationException)1 Response (javax.ws.rs.core.Response)1 ResponseBuilder (javax.ws.rs.core.Response.ResponseBuilder)1 JAXBException (javax.xml.bind.JAXBException)1 Unmarshaller (javax.xml.bind.Unmarshaller)1 XMLInputFactory (javax.xml.stream.XMLInputFactory)1 XMLStreamException (javax.xml.stream.XMLStreamException)1 XMLStreamReader (javax.xml.stream.XMLStreamReader)1 FeatureCollectionDocument (net.opengis.gml.x32.FeatureCollectionDocument)1 FeatureCollectionType (net.opengis.gml.x32.FeatureCollectionType)1 FeaturePropertyType (net.opengis.gml.x32.FeaturePropertyType)1 FeatureCollectionType (net.opengis.wfs.v_2_0_0.FeatureCollectionType)1 Wfs20FeatureCollection (org.codice.ddf.spatial.ogc.wfs.v2_0_0.catalog.common.Wfs20FeatureCollection)1 AbstractFeature (org.n52.shetland.ogc.gml.AbstractFeature)1