package org.bbaw.wsp.cms.transform; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.net.URL; import javax.xml.transform.stream.StreamSource; import org.bbaw.wsp.cms.document.MetadataRecord; 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 PageTransformer { private Processor processor; private XsltCompiler xsltCompiler; private XsltTransformer pageTeiTransformer; private XsltTransformer pageXhtmlTransformer; private XsltTransformer pageDiverseTransformer; private XsltTransformer pageXmlTransformer; public PageTransformer() throws ApplicationException { init(); } private void init() throws ApplicationException { try { processor = new Processor(false); xsltCompiler = processor.newXsltCompiler(); URL getFragmentXslUrl = PageTransformer.class.getResource("pageTei.xsl"); StreamSource xslStreamSource = new StreamSource(getFragmentXslUrl.openStream()); XsltExecutable xsltExecutable = xsltCompiler.compile(xslStreamSource); pageTeiTransformer = xsltExecutable.load(); getFragmentXslUrl = PageTransformer.class.getResource("pageXhtml.xsl"); xslStreamSource = new StreamSource(getFragmentXslUrl.openStream()); xsltExecutable = xsltCompiler.compile(xslStreamSource); pageXhtmlTransformer = xsltExecutable.load(); getFragmentXslUrl = PageTransformer.class.getResource("pageDiverse.xsl"); xslStreamSource = new StreamSource(getFragmentXslUrl.openStream()); xsltExecutable = xsltCompiler.compile(xslStreamSource); pageDiverseTransformer = xsltExecutable.load(); getFragmentXslUrl = PageTransformer.class.getResource("pageXml.xsl"); xslStreamSource = new StreamSource(getFragmentXslUrl.openStream()); xsltExecutable = xsltCompiler.compile(xslStreamSource); pageXmlTransformer = xsltExecutable.load(); } catch (SaxonApiException e) { throw new ApplicationException(e); } catch (IOException e) { throw new ApplicationException(e); } } public String transform(String inputStr, MetadataRecord mdRecord, String mode, String page, String normMethod, String outputFormat) throws ApplicationException { String pageFragment = null; String docId = mdRecord.getDocId(); String schemaName = mdRecord.getSchemaName(); if (schemaName != null) schemaName = schemaName.toLowerCase(); try { XsltTransformer transformer = null; if (schemaName != null && schemaName.equals("tei") && outputFormat.equals("html")) transformer = pageTeiTransformer; else if (schemaName != null && schemaName.equals("xhtml") && outputFormat.equals("html")) transformer = pageXhtmlTransformer; else if (outputFormat.equals("xmlDisplay")) transformer = pageXmlTransformer; else transformer = pageDiverseTransformer; StringReader inputStrReader = new StringReader(inputStr); StreamSource xmlDoc = new StreamSource(inputStrReader); Serializer serializer = new Serializer(); serializer.setOutputWriter(new StringWriter()); serializer.setOutputProperty(Serializer.Property.SAXON_STYLESHEET_VERSION, "2.0"); serializer.setOutputProperty(Serializer.Property.METHOD, "xml"); serializer.setOutputProperty(Serializer.Property.MEDIA_TYPE, "text/html"); serializer.setOutputProperty(Serializer.Property.INDENT, "no"); serializer.setOutputProperty(Serializer.Property.OMIT_XML_DECLARATION, "yes"); serializer.setOutputProperty(Serializer.Property.ENCODING, "utf-8"); transformer.setSource(xmlDoc); transformer.setDestination(serializer); QName docIdQName = new QName("docId"); XdmValue docIdXdmValue = new XdmAtomicValue(docId); QName modeQName = new QName("mode"); XdmValue modeXdmValue = new XdmAtomicValue(mode); QName pageQName = new QName("page"); XdmValue pageXdmValue = new XdmAtomicValue(page); QName normalizationQName = new QName("normalization"); XdmValue normalizationXdmValue = new XdmAtomicValue(normMethod); transformer.setParameter(docIdQName, docIdXdmValue); transformer.setParameter(modeQName, modeXdmValue); transformer.setParameter(pageQName, pageXdmValue); transformer.setParameter(normalizationQName, normalizationXdmValue); transformer.transform(); pageFragment = serializer.getOutputDestination().toString(); } catch (Exception e) { throw new ApplicationException(e); } return pageFragment; } }