package org.bbaw.wsp.cms.transform;
import java.io.IOException;
import java.io.StringWriter;
import java.net.URL;
import javax.xml.transform.stream.StreamSource;
import de.mpg.mpiwg.berlin.mpdl.exception.ApplicationException;
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.QName;
import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.s9api.Serializer;
import net.sf.saxon.s9api.XdmAtomicValue;
import net.sf.saxon.s9api.XdmValue;
import net.sf.saxon.s9api.XsltCompiler;
import net.sf.saxon.s9api.XsltExecutable;
import net.sf.saxon.s9api.XsltTransformer;
public class QueryTransformer {
private Processor processor;
private XsltCompiler xsltCompiler;
private XsltTransformer xsltQueryDocument;
public QueryTransformer() throws ApplicationException {
init();
}
private void init() throws ApplicationException {
try {
processor = new Processor(false);
xsltCompiler = processor.newXsltCompiler();
URL queryDocumentXslUrl = QueryTransformer.class.getResource("queryDocument.xsl");
StreamSource xslStreamSource = new StreamSource(queryDocumentXslUrl.openStream());
XsltExecutable xsltExecutable = xsltCompiler.compile(xslStreamSource);
xsltQueryDocument = xsltExecutable.load();
} catch (SaxonApiException e) {
throw new ApplicationException(e);
} catch (IOException e) {
throw new ApplicationException(e);
}
}
public String queryDocument(String xmlFileName, String query, String flags, String outputFormat) throws ApplicationException {
String pageFragment = null;
try {
StreamSource xmlDoc = new StreamSource(xmlFileName);
Serializer serializer = new Serializer();
serializer.setOutputWriter(new StringWriter());
serializer.setOutputProperty(Serializer.Property.INDENT, "yes");
xsltQueryDocument.setSource(xmlDoc); // needs some time for bigger documents
xsltQueryDocument.setDestination(serializer);
QName queryQName = new QName("query");
XdmValue queryXdmValue = new XdmAtomicValue(query);
QName flagsQName = new QName("flags");
XdmValue flagsXdmValue = new XdmAtomicValue(flags);
QName outputFormatQName = new QName("outputFormat");
XdmValue outputFormatXdmValue = new XdmAtomicValue(outputFormat);
xsltQueryDocument.setParameter(queryQName, queryXdmValue);
xsltQueryDocument.setParameter(flagsQName, flagsXdmValue);
xsltQueryDocument.setParameter(outputFormatQName, outputFormatXdmValue);
xsltQueryDocument.transform(); // needs some time for bigger documents
pageFragment = serializer.getOutputDestination().toString();
} catch (Exception e) {
throw new ApplicationException(e);
}
return pageFragment;
}
}