diff options
-rw-r--r-- | test/java/org/apache/fop/URIResolutionTestCase.java | 209 | ||||
-rw-r--r-- | test/xml/uri-resolution1.fo | 31 | ||||
-rw-r--r-- | test/xml/uri-resolution2.fo | 39 |
3 files changed, 279 insertions, 0 deletions
diff --git a/test/java/org/apache/fop/URIResolutionTestCase.java b/test/java/org/apache/fop/URIResolutionTestCase.java new file mode 100644 index 000000000..148195c88 --- /dev/null +++ b/test/java/org/apache/fop/URIResolutionTestCase.java @@ -0,0 +1,209 @@ +/* + * Copyright 2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.OutputStream; + +import javax.xml.transform.Result; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.URIResolver; +import javax.xml.transform.dom.DOMResult; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.sax.SAXResult; +import javax.xml.transform.sax.SAXTransformerFactory; +import javax.xml.transform.sax.TransformerHandler; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.io.output.ByteArrayOutputStream; +import org.apache.fop.apps.FOPException; +import org.apache.fop.apps.FOUserAgent; +import org.apache.fop.apps.Fop; +import org.apache.fop.render.xml.XMLRenderer; +import org.apache.xpath.XPathAPI; +import org.apache.xpath.objects.XObject; +import org.w3c.dom.Document; + +/** + * Tests URI resolution facilities. + */ +public class URIResolutionTestCase extends AbstractFOPTestCase { + + private SAXTransformerFactory tfactory + = (SAXTransformerFactory)SAXTransformerFactory.newInstance(); + + private File backupDir = new File(getBaseDir(), "build/test-results"); + + /** @see junit.framework.TestCase#TestCase(String) */ + public URIResolutionTestCase(String name) { + super(name); + } + + /** + * Test custom URI resolution with a hand-written URIResolver. + * @throws Exception if anything fails + */ + public void testFO1() throws Exception { + File foFile = new File(getBaseDir(), "test/xml/uri-resolution1.fo"); + + FOUserAgent ua = new FOUserAgent(); + MyURIResolver resolver = new MyURIResolver(); + ua.setURIResolver(resolver); + ua.setBaseURL(foFile.getParentFile().toURL().toString()); + + Document doc = createAreaTree(foFile, ua); + + //Check how many times the resolver was consulted + assertEquals(1, resolver.successCount); + assertEquals(0, resolver.failureCount); + //Additional XPath checking on the area tree + assertEquals("viewport for external-graphic is missing", + "true", evalXPath(doc, "boolean(//flow/block[1]/lineArea/viewport)")); + assertEquals("46080", evalXPath(doc, "//flow/block[1]/lineArea/viewport/@ipd")); + assertEquals("46080", evalXPath(doc, "//flow/block[1]/lineArea/viewport/@bpd")); + } + + /** + * Test custom URI resolution with a hand-written URIResolver. + * @throws Exception if anything fails + */ + public void testFO2() throws Exception { + File foFile = new File(getBaseDir(), "test/xml/uri-resolution2.fo"); + + FOUserAgent ua = new FOUserAgent(); + MyURIResolver resolver = new MyURIResolver(); + ua.setURIResolver(resolver); + ua.setBaseURL(foFile.getParentFile().toURL().toString()); + + Fop fop = new Fop(Fop.RENDER_PDF, ua); + + ByteArrayOutputStream baout = new ByteArrayOutputStream(); + fop.setOutputStream(baout); + + Transformer transformer = tfactory.newTransformer(); //Identity transf. + Source src = new StreamSource(foFile); + Result res = new SAXResult(fop.getDefaultHandler()); + transformer.transform(src, res); + + OutputStream out = new java.io.FileOutputStream( + new File(backupDir, foFile.getName() + ".pdf")); + try { + baout.writeTo(out); + } finally { + IOUtils.closeQuietly(out); + } + + //Check how many times the resolver was consulted + assertEquals(1, resolver.successCount); + assertEquals(0, resolver.failureCount); + //Test using PDF as the area tree doesn't invoke Batik so we could check + //if the resolver is actually passed to Batik by FOP + assertTrue("Generated PDF has zero length", baout.size() > 0); + } + + private Document createAreaTree(File fo, FOUserAgent ua) + throws TransformerException, FOPException { + DOMResult domres = new DOMResult(); + //Setup Transformer to convert the area tree to a DOM + TransformerHandler athandler = tfactory.newTransformerHandler(); + athandler.setResult(domres); + + XMLRenderer atrenderer = new XMLRenderer(); + atrenderer.setUserAgent(ua); + atrenderer.setTransformerHandler(athandler); + ua.setRendererOverride(atrenderer); + + Fop fop = new Fop(Fop.RENDER_XML, ua); + + Transformer transformer = tfactory.newTransformer(); //Identity transf. + Source src = new StreamSource(fo); + Result res = new SAXResult(fop.getDefaultHandler()); + transformer.transform(src, res); + + Document doc = (Document)domres.getNode(); + saveAreaTreeXML(doc, new File(backupDir, fo.getName() + ".at.xml")); + return doc; + } + + private String evalXPath(Document doc, String xpath) { + XObject res; + try { + res = XPathAPI.eval(doc, xpath); + } catch (TransformerException e) { + throw new RuntimeException("XPath evaluation failed: " + e.getMessage()); + } + return res.str(); + } + + /** + * Save the area tree XML for later inspection. + * @param doc area tree as a DOM document + * @param target target file + * @throws TransformerException if a problem occurs during serialization + */ + protected void saveAreaTreeXML(Document doc, File target) throws TransformerException { + Transformer transformer = tfactory.newTransformer(); + Source src = new DOMSource(doc); + Result res = new StreamResult(target); + transformer.transform(src, res); + } + + private class MyURIResolver implements URIResolver { + + private static final String PREFIX = "funky:"; + + private int successCount = 0; + private int failureCount = 0; + + /** + * @see javax.xml.transform.URIResolver#resolve(java.lang.String, java.lang.String) + */ + public Source resolve(String href, String base) throws TransformerException { + if (href.startsWith(PREFIX)) { + String name = href.substring(PREFIX.length()); + if ("myimage123".equals(name)) { + File image = new File(getBaseDir(), "test/resources/images/bgimg300dpi.jpg"); + StreamSource src = new StreamSource(image); + try { + //TODO The next line should not be necessary!!! + src.setInputStream(new java.io.FileInputStream(image)); + } catch (FileNotFoundException e) { + throw new TransformerException(e.getMessage(), e); + } + successCount++; + return src; + } else { + failureCount++; + throw new TransformerException("funky image not found"); + } + } else { + failureCount++; + return null; + } + } + + } + +} diff --git a/test/xml/uri-resolution1.fo b/test/xml/uri-resolution1.fo new file mode 100644 index 000000000..821f28334 --- /dev/null +++ b/test/xml/uri-resolution1.fo @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2005 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name="A4" page-height="29.7cm" page-width="21cm" margin="1cm">
+ <fo:region-body/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+ <fo:page-sequence master-reference="A4">
+ <fo:flow flow-name="xsl-region-body">
+ <fo:block>
+ <fo:external-graphic src="funky:myimage123"/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+</fo:root>
diff --git a/test/xml/uri-resolution2.fo b/test/xml/uri-resolution2.fo new file mode 100644 index 000000000..72f718445 --- /dev/null +++ b/test/xml/uri-resolution2.fo @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2005 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name="A4" page-height="29.7cm" page-width="21cm" margin="1cm">
+ <fo:region-body/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+ <fo:page-sequence master-reference="A4">
+ <fo:flow flow-name="xsl-region-body">
+ <fo:block>
+ <fo:instream-foreign-object>
+ <svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <g style="fill:red; stroke:#000000">
+ <rect x="0" y="0" width="15" height="15"/>
+ <!--rect x="5" y="5" width="15" height="15"/-->
+ </g>
+ <image x="5" y="5" width="15" height="15" xlink:href="funky:myimage123"/>
+ </svg>
+ </fo:instream-foreign-object>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+</fo:root>
|