summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--test/java/org/apache/fop/URIResolutionTestCase.java209
-rw-r--r--test/xml/uri-resolution1.fo31
-rw-r--r--test/xml/uri-resolution2.fo39
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>