Mercurial > hg > mpdl-group
diff software/mpdl-services/mpiwg-mpdl-cms/src/de/mpg/mpiwg/berlin/mpdl/cms/transform/PageTransformer.java @ 23:e845310098ba
diverse Korrekturen
author | Josef Willenborg <jwillenborg@mpiwg-berlin.mpg.de> |
---|---|
date | Tue, 27 Nov 2012 12:35:19 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/mpdl-services/mpiwg-mpdl-cms/src/de/mpg/mpiwg/berlin/mpdl/cms/transform/PageTransformer.java Tue Nov 27 12:35:19 2012 +0100 @@ -0,0 +1,118 @@ +package de.mpg.mpiwg.berlin.mpdl.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 de.mpg.mpiwg.berlin.mpdl.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 int counter = 0; + private Processor processor; + private XsltCompiler xsltCompiler; + private XsltTransformer pageTeiTransformer; + private XsltTransformer pageEchoTransformer; + private XsltTransformer pageArchimedesTransformer; + private XsltTransformer pageXhtmlTransformer; + 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("pageEcho.xsl"); + xslStreamSource = new StreamSource(getFragmentXslUrl.openStream()); + xsltExecutable = xsltCompiler.compile(xslStreamSource); + pageEchoTransformer = xsltExecutable.load(); + getFragmentXslUrl = PageTransformer.class.getResource("pageArchimedes.xsl"); + xslStreamSource = new StreamSource(getFragmentXslUrl.openStream()); + xsltExecutable = xsltCompiler.compile(xslStreamSource); + pageArchimedesTransformer = xsltExecutable.load(); + getFragmentXslUrl = PageTransformer.class.getResource("pageXhtml.xsl"); + xslStreamSource = new StreamSource(getFragmentXslUrl.openStream()); + xsltExecutable = xsltCompiler.compile(xslStreamSource); + pageXhtmlTransformer = 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, int page, String outputFormat) throws ApplicationException { + String pageFragment = null; + 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("echo") && outputFormat.equals("html")) + transformer = pageEchoTransformer; + else if (schemaName != null && schemaName.equals("archimedes") && outputFormat.equals("html")) + transformer = pageArchimedesTransformer; + else if (schemaName != null && (schemaName.equals("html") || schemaName.equals("xhtml")) && outputFormat.equals("html")) + transformer = pageXhtmlTransformer; + else if (outputFormat.equals("xmlDisplay")) + transformer = pageXmlTransformer; + else + transformer = pageTeiTransformer; + 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); + String echoFiguresDir = mdRecord.getEchoFiguresDir(); + QName echoFiguresDirQName = new QName("echoFiguresDir"); + XdmValue echoFiguresDirXdmValue = new XdmAtomicValue(echoFiguresDir); + transformer.setParameter(echoFiguresDirQName, echoFiguresDirXdmValue); + String echoPageImgDir = mdRecord.getEchoPageImageDir(); + QName echoPageImgDirQName = new QName("echoPageImgDir"); + XdmValue echoPageImgDirXdmValue = new XdmAtomicValue(echoPageImgDir); + transformer.setParameter(echoPageImgDirQName, echoPageImgDirXdmValue); + transformer.transform(); + pageFragment = serializer.getOutputDestination().toString(); + } catch (Exception e) { + throw new ApplicationException(e); + } + counter++; + if (counter == 100) + init(); + return pageFragment; + } + +}