/**
* Copyright (c) Codice Foundation
* <p>
* This is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser
* General Public License as published by the Free Software Foundation, either version 3 of the
* License, or any later version.
* <p>
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details. A copy of the GNU Lesser General Public License
* is distributed along with this program and can be found at
* <http://www.gnu.org/licenses/lgpl.html>.
*/
package ddf.catalog.transformer.input.video;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.apache.tika.sax.ToXMLContentHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLFilterImpl;
import org.xml.sax.helpers.XMLReaderFactory;
import ddf.catalog.data.Metacard;
import ddf.catalog.data.MetacardType;
import ddf.catalog.data.impl.AttributeImpl;
import ddf.catalog.data.types.Core;
import ddf.catalog.data.types.constants.core.DataType;
import ddf.catalog.transform.CatalogTransformerException;
import ddf.catalog.transform.InputTransformer;
import ddf.catalog.transformer.common.tika.MetacardCreator;
import ddf.catalog.transformer.common.tika.TikaMetadataExtractor;
import net.sf.saxon.TransformerFactoryImpl;
public class VideoInputTransformer implements InputTransformer {
private static final Logger LOGGER = LoggerFactory.getLogger(VideoInputTransformer.class);
private Templates templates = null;
private MetacardType metacardType = null;
public VideoInputTransformer(MetacardType metacardType) {
this.metacardType = metacardType;
ClassLoader tccl = Thread.currentThread()
.getContextClassLoader();
try (InputStream stream = TikaMetadataExtractor.class.getResourceAsStream("/metadata.xslt")) {
Thread.currentThread()
.setContextClassLoader(getClass().getClassLoader());
templates = TransformerFactory.newInstance(TransformerFactoryImpl.class.getName(),
this.getClass()
.getClassLoader())
.newTemplates(new StreamSource(stream));
} catch (TransformerConfigurationException e) {
LOGGER.debug("Couldn't create XML transformer", e);
} catch (IOException e) {
LOGGER.debug("Could not get Tiki metadata XSLT", e);
} finally {
Thread.currentThread()
.setContextClassLoader(tccl);
}
}
@Override
public Metacard transform(InputStream input) throws IOException, CatalogTransformerException {
return transform(input, null);
}
@Override
public Metacard transform(InputStream input, String id)
throws IOException, CatalogTransformerException {
Parser parser = new AutoDetectParser();
ToXMLContentHandler handler = new ToXMLContentHandler();
TikaMetadataExtractor tikaMetadataExtractor = new TikaMetadataExtractor(parser, handler);
Metadata metadata = tikaMetadataExtractor.parseMetadata(input, new ParseContext());
String metadataText = handler.toString();
if (templates != null) {
metadataText = transformToXml(metadataText);
}
Metacard metacard = MetacardCreator.createMetacard(metadata,
id,
metadataText,
metacardType);
metacard.setAttribute(new AttributeImpl(Core.DATATYPE, DataType.VIDEO.toString()));
return metacard;
}
private String transformToXml(String xhtml) {
LOGGER.debug("Transforming xhtml to xml.");
XMLReader xmlReader = null;
try {
XMLReader xmlParser = XMLReaderFactory.createXMLReader();
xmlParser.setFeature("http://xml.org/sax/features/external-general-entities", false);
xmlParser.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
xmlParser.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",
false);
xmlReader = new XMLFilterImpl(xmlParser);
} catch (SAXException e) {
LOGGER.debug(e.getMessage(), e);
}
if (xmlReader != null) {
try {
Writer xml = new StringWriter();
Transformer transformer = templates.newTransformer();
transformer.transform(new SAXSource(xmlReader,
new InputSource(new StringReader(xhtml))), new StreamResult(xml));
return xml.toString();
} catch (TransformerException e) {
LOGGER.debug("Unable to transform metadata from XHTML to XML.", e);
}
}
return xhtml;
}
}