Search in sources :

Example 36 with CatalogTransformerException

use of ddf.catalog.transform.CatalogTransformerException in project ddf by codice.

the class XmlInputTransformer method transform.

/**
 * Takes in an XML {@link InputStream} and returns a populated {@link Metacard} The Metacard is
 * populated with all attributes that have been parsed by the {@link SaxEventHandler}s declared in
 * {@link XmlInputTransformer#saxEventHandlerConfiguration}s
 *
 * @param inputStream an XML input stream to be turned into a Metacard
 * @return a populated Metacard
 * @throws CatalogTransformerException
 * @throws IOException
 */
@Override
public Metacard transform(InputStream inputStream) throws CatalogTransformerException {
    if (inputStream == null) {
        throw new CatalogTransformerException();
    }
    /*
     * Create the necessary new SaxEventHandlerDelegate
     */
    SaxEventHandlerDelegate delegate = create();
    /*
     * Split the input stream, so that we can use it for parsing as well as read it into the Metacard.METADATA attribute
     */
    try (OutputStream baos = new ByteArrayOutputStream();
        OutputStream outputStream = new BufferedOutputStream(baos);
        InputStream teeInputStream = new BufferedInputStream(delegate.getMetadataStream(inputStream, outputStream))) {
        /*
       * Read the input stream into the metacard - where all the magic happens
       */
        Metacard metacard = delegate.read(teeInputStream).getMetacard(id);
        /*
       * Read the metadata from the split input stream and set it on the Metacard.METADATA attribute.
       * However, if the metadata is null or empty, throw an exception - we can't return a metacard
       * with no metadata
       */
        outputStream.flush();
        String metadata = baos.toString();
        if (metadata.isEmpty()) {
            throw new CatalogTransformerException("Metadata is empty from output stream. Could not properly parse metacard.");
        }
        metacard.setAttribute(new AttributeImpl(Metacard.METADATA, metadata));
        return metacard;
    } catch (IOException e) {
        LOGGER.debug("IO Exception during parsing", e);
        throw new CatalogTransformerException("Could not finish transforming metacard because of IOException", e);
    }
}
Also used : Metacard(ddf.catalog.data.Metacard) BufferedInputStream(java.io.BufferedInputStream) BufferedInputStream(java.io.BufferedInputStream) InputStream(java.io.InputStream) OutputStream(java.io.OutputStream) ByteArrayOutputStream(java.io.ByteArrayOutputStream) BufferedOutputStream(java.io.BufferedOutputStream) AttributeImpl(ddf.catalog.data.impl.AttributeImpl) CatalogTransformerException(ddf.catalog.transform.CatalogTransformerException) ByteArrayOutputStream(java.io.ByteArrayOutputStream) IOException(java.io.IOException) BufferedOutputStream(java.io.BufferedOutputStream)

Example 37 with CatalogTransformerException

use of ddf.catalog.transform.CatalogTransformerException in project ddf by codice.

the class CswQueryResponseTransformer method writeAcknowledgement.

private ByteArrayOutputStream writeAcknowledgement(GetRecordsType request) throws CatalogTransformerException {
    try {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        JAXBContext jaxBContext = JAXBContext.newInstance("net.opengis.cat.csw.v_2_0_2:" + "net.opengis.filter.v_1_1_0:net.opengis.gml.v_3_1_1:net.opengis.ows.v_1_0_0");
        Marshaller marshaller = jaxBContext.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        AcknowledgementType ack = new AcknowledgementType();
        EchoedRequestType echoedRequest = new EchoedRequestType();
        JAXBElement<GetRecordsType> jaxBRequest = new ObjectFactory().createGetRecords(request);
        echoedRequest.setAny(jaxBRequest);
        ack.setEchoedRequest(echoedRequest);
        try {
            ack.setTimeStamp(DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar()));
        } catch (DatatypeConfigurationException e) {
            LOGGER.debug("Failed to set timestamp on Acknowledgement", e);
        }
        JAXBElement<AcknowledgementType> jaxBAck = new ObjectFactory().createAcknowledgement(ack);
        marshaller.marshal(jaxBAck, byteArrayOutputStream);
        return byteArrayOutputStream;
    } catch (JAXBException e) {
        throw new CatalogTransformerException(e);
    }
}
Also used : Marshaller(javax.xml.bind.Marshaller) JAXBException(javax.xml.bind.JAXBException) GregorianCalendar(java.util.GregorianCalendar) EchoedRequestType(net.opengis.cat.csw.v_2_0_2.EchoedRequestType) GetRecordsType(net.opengis.cat.csw.v_2_0_2.GetRecordsType) JAXBContext(javax.xml.bind.JAXBContext) CatalogTransformerException(ddf.catalog.transform.CatalogTransformerException) ByteArrayOutputStream(java.io.ByteArrayOutputStream) DatatypeConfigurationException(javax.xml.datatype.DatatypeConfigurationException) ObjectFactory(net.opengis.cat.csw.v_2_0_2.ObjectFactory) AcknowledgementType(net.opengis.cat.csw.v_2_0_2.AcknowledgementType)

Example 38 with CatalogTransformerException

use of ddf.catalog.transform.CatalogTransformerException in project ddf by codice.

the class CswRecordConverter method transform.

@Override
public BinaryContent transform(Metacard metacard, Map<String, Serializable> arguments) throws CatalogTransformerException {
    if (StringUtils.isNotBlank(metacard.getMetadata())) {
        // Check if the metadata is csw:Record
        try {
            StringReader xml = new StringReader(metacard.getMetadata());
            XMLEventReader reader = factory.createXMLEventReader(xml);
            boolean rootFound = false;
            while (reader.hasNext() && !rootFound) {
                XMLEvent event = reader.nextEvent();
                if (event.isStartElement()) {
                    rootFound = true;
                    QName name = event.asStartElement().getName();
                    if (StringUtils.equals(CswConstants.CSW_RECORD_LOCAL_NAME, name.getLocalPart()) && StringUtils.equals(CswConstants.CSW_OUTPUT_SCHEMA, name.getNamespaceURI())) {
                        return new BinaryContentImpl(IOUtils.toInputStream(metacard.getMetadata(), StandardCharsets.UTF_8), XML_MIME_TYPE);
                    }
                }
            }
        } catch (Exception e) {
        // Ignore and proceed with the transform.
        }
    }
    StringWriter stringWriter = new StringWriter();
    Boolean omitXmlDec = null;
    if (arguments != null) {
        omitXmlDec = (Boolean) arguments.get(CswConstants.OMIT_XML_DECLARATION);
    }
    if (omitXmlDec == null || !omitXmlDec) {
        stringWriter.append("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n");
    }
    PrettyPrintWriter writer = new PrettyPrintWriter(stringWriter);
    MarshallingContext context = new TreeMarshaller(writer, null, null);
    context.put(CswConstants.WRITE_NAMESPACES, true);
    copyArgumentsToContext(context, arguments);
    this.marshal(metacard, writer, context);
    BinaryContent transformedContent;
    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(stringWriter.toString().getBytes(StandardCharsets.UTF_8));
    transformedContent = new BinaryContentImpl(byteArrayInputStream, XML_MIME_TYPE);
    return transformedContent;
}
Also used : QName(javax.xml.namespace.QName) BinaryContentImpl(ddf.catalog.data.impl.BinaryContentImpl) BinaryContent(ddf.catalog.data.BinaryContent) XStreamException(com.thoughtworks.xstream.XStreamException) CatalogTransformerException(ddf.catalog.transform.CatalogTransformerException) MimeTypeParseException(javax.activation.MimeTypeParseException) IOException(java.io.IOException) TreeMarshaller(com.thoughtworks.xstream.core.TreeMarshaller) StringWriter(java.io.StringWriter) ByteArrayInputStream(java.io.ByteArrayInputStream) StringReader(java.io.StringReader) XMLEvent(javax.xml.stream.events.XMLEvent) XMLEventReader(javax.xml.stream.XMLEventReader) PrettyPrintWriter(com.thoughtworks.xstream.io.xml.PrettyPrintWriter) MarshallingContext(com.thoughtworks.xstream.converters.MarshallingContext)

Example 39 with CatalogTransformerException

use of ddf.catalog.transform.CatalogTransformerException in project ddf by codice.

the class TestCswSourceBase method setUp.

@Before
public void setUp() {
    ServiceReference ref = mock(ServiceReference.class);
    ServiceReference[] serviceRefs = new ServiceReference[] { ref };
    try {
        when(mockContext.getServiceReferences(eq(MetadataTransformer.class.getName()), anyString())).thenReturn(serviceRefs);
    } catch (InvalidSyntaxException e) {
        LOGGER.error(e.getMessage(), e);
    }
    MetadataTransformer transformer = mock(MetadataTransformer.class);
    // Just return same Metacard that was passed in
    when(mockContext.getService(any(ServiceReference.class))).thenReturn(transformer);
    try {
        when(transformer.transform(any(Metacard.class))).thenAnswer(invocation -> invocation.getArguments()[0]);
    } catch (CatalogTransformerException e) {
        LOGGER.error(e.getMessage(), e);
    }
    when(mockAvailabilityTask.isAvailable()).thenReturn(true);
}
Also used : Metacard(ddf.catalog.data.Metacard) MetadataTransformer(org.codice.ddf.spatial.ogc.catalog.MetadataTransformer) InvalidSyntaxException(org.osgi.framework.InvalidSyntaxException) CatalogTransformerException(ddf.catalog.transform.CatalogTransformerException) ServiceReference(org.osgi.framework.ServiceReference) Before(org.junit.Before)

Example 40 with CatalogTransformerException

use of ddf.catalog.transform.CatalogTransformerException in project ddf by codice.

the class GeoJsonInputTransformer method getMetacard.

private MetacardImpl getMetacard(String propertyTypeName, Map<String, Object> properties) throws CatalogTransformerException {
    if (isEmpty(propertyTypeName) || metacardTypes == null) {
        LOGGER.debug("MetacardType specified in input is null or empty.  Trying all transformers in order...");
        Optional<MetacardImpl> first = inputTransformers == null ? Optional.of(new MetacardImpl()) : inputTransformers.stream().map(service -> tryTransformers(properties, service)).filter(Objects::nonNull).findFirst();
        return first.orElse(new MetacardImpl());
    } else {
        MetacardType metacardType = metacardTypes.stream().filter(type -> type.getName().equals(propertyTypeName)).findFirst().orElseThrow(() -> new CatalogTransformerException("MetacardType specified in input has not been registered with the system." + " Cannot parse input. MetacardType name: " + propertyTypeName));
        LOGGER.debug("Found registered MetacardType: {}", propertyTypeName);
        return new MetacardImpl(metacardType);
    }
}
Also used : JsonParseException(com.google.gson.JsonParseException) DateTimeFormatterBuilder(java.time.format.DateTimeFormatterBuilder) AttributeFormat(ddf.catalog.data.AttributeType.AttributeFormat) Date(java.util.Date) StringUtils.isNotEmpty(org.apache.commons.lang.StringUtils.isNotEmpty) LoggerFactory(org.slf4j.LoggerFactory) AttributeRegistry(ddf.catalog.data.AttributeRegistry) Function(java.util.function.Function) StringUtils(org.apache.commons.lang3.StringUtils) GsonBuilder(com.google.gson.GsonBuilder) ArrayList(java.util.ArrayList) Collectors.toMap(java.util.stream.Collectors.toMap) ByteArrayInputStream(java.io.ByteArrayInputStream) Metacard(ddf.catalog.data.Metacard) Gson(com.google.gson.Gson) MetacardImpl(ddf.catalog.data.impl.MetacardImpl) Map(java.util.Map) SortedServiceList(org.codice.ddf.platform.util.SortedServiceList) ParseException(java.text.ParseException) InputTransformer(ddf.catalog.transform.InputTransformer) LongDoubleTypeAdapter(org.codice.gsonsupport.GsonTypeAdapters.LongDoubleTypeAdapter) AttributeDescriptor(ddf.catalog.data.AttributeDescriptor) Logger(org.slf4j.Logger) StringUtils.isEmpty(org.apache.commons.lang.StringUtils.isEmpty) IOException(java.io.IOException) Instant(java.time.Instant) InputStreamReader(java.io.InputStreamReader) MetacardType(ddf.catalog.data.MetacardType) StandardCharsets(java.nio.charset.StandardCharsets) MAP_STRING_TO_OBJECT_TYPE(org.codice.gsonsupport.GsonTypeAdapters.MAP_STRING_TO_OBJECT_TYPE) CatalogTransformerException(ddf.catalog.transform.CatalogTransformerException) Serializable(java.io.Serializable) Objects(java.util.Objects) CompositeGeometry(ddf.geo.formatter.CompositeGeometry) List(java.util.List) DateTimeFormatter(java.time.format.DateTimeFormatter) Entry(java.util.Map.Entry) Optional(java.util.Optional) DatatypeConverter(javax.xml.bind.DatatypeConverter) InputStream(java.io.InputStream) Objects(java.util.Objects) CatalogTransformerException(ddf.catalog.transform.CatalogTransformerException) MetacardImpl(ddf.catalog.data.impl.MetacardImpl) MetacardType(ddf.catalog.data.MetacardType)

Aggregations

CatalogTransformerException (ddf.catalog.transform.CatalogTransformerException)112 IOException (java.io.IOException)53 Metacard (ddf.catalog.data.Metacard)44 InputStream (java.io.InputStream)40 ByteArrayInputStream (java.io.ByteArrayInputStream)29 BinaryContent (ddf.catalog.data.BinaryContent)25 InputTransformer (ddf.catalog.transform.InputTransformer)21 Serializable (java.io.Serializable)21 HashMap (java.util.HashMap)21 Result (ddf.catalog.data.Result)16 BinaryContentImpl (ddf.catalog.data.impl.BinaryContentImpl)15 TemporaryFileBackedOutputStream (org.codice.ddf.platform.util.TemporaryFileBackedOutputStream)14 ArrayList (java.util.ArrayList)13 MetacardImpl (ddf.catalog.data.impl.MetacardImpl)12 Test (org.junit.Test)12 AttributeImpl (ddf.catalog.data.impl.AttributeImpl)10 MimeType (javax.activation.MimeType)10 SourceResponse (ddf.catalog.operation.SourceResponse)9 MetacardTransformer (ddf.catalog.transform.MetacardTransformer)8 List (java.util.List)8