You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

URIResolutionTestCase.java 7.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. /*
  2. * Copyright 2005 The Apache Software Foundation.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. /* $Id$ */
  17. package org.apache.fop;
  18. import java.io.File;
  19. import java.io.OutputStream;
  20. import javax.xml.transform.Result;
  21. import javax.xml.transform.Source;
  22. import javax.xml.transform.Transformer;
  23. import javax.xml.transform.TransformerException;
  24. import javax.xml.transform.URIResolver;
  25. import javax.xml.transform.dom.DOMResult;
  26. import javax.xml.transform.dom.DOMSource;
  27. import javax.xml.transform.sax.SAXResult;
  28. import javax.xml.transform.sax.SAXTransformerFactory;
  29. import javax.xml.transform.sax.TransformerHandler;
  30. import javax.xml.transform.stream.StreamResult;
  31. import javax.xml.transform.stream.StreamSource;
  32. import org.apache.commons.io.IOUtils;
  33. import org.apache.commons.io.output.ByteArrayOutputStream;
  34. import org.apache.fop.apps.FOPException;
  35. import org.apache.fop.apps.FOUserAgent;
  36. import org.apache.fop.apps.Fop;
  37. import org.apache.fop.render.xml.XMLRenderer;
  38. import org.apache.xpath.XPathAPI;
  39. import org.apache.xpath.objects.XObject;
  40. import org.w3c.dom.Document;
  41. /**
  42. * Tests URI resolution facilities.
  43. */
  44. public class URIResolutionTestCase extends AbstractFOPTestCase {
  45. private SAXTransformerFactory tfactory
  46. = (SAXTransformerFactory)SAXTransformerFactory.newInstance();
  47. private File backupDir = new File(getBaseDir(), "build/test-results");
  48. /** @see junit.framework.TestCase#TestCase(String) */
  49. public URIResolutionTestCase(String name) {
  50. super(name);
  51. }
  52. /**
  53. * Test custom URI resolution with a hand-written URIResolver.
  54. * @throws Exception if anything fails
  55. */
  56. public void testFO1() throws Exception {
  57. File foFile = new File(getBaseDir(), "test/xml/uri-resolution1.fo");
  58. FOUserAgent ua = new FOUserAgent();
  59. MyURIResolver resolver = new MyURIResolver();
  60. ua.setURIResolver(resolver);
  61. ua.setBaseURL(foFile.getParentFile().toURL().toString());
  62. Document doc = createAreaTree(foFile, ua);
  63. //Check how many times the resolver was consulted
  64. assertEquals("Expected resolver to do 1 successful URI resolution",
  65. 1, resolver.successCount);
  66. assertEquals("Expected resolver to do 0 failed URI resolution",
  67. 0, resolver.failureCount);
  68. //Additional XPath checking on the area tree
  69. assertEquals("viewport for external-graphic is missing",
  70. "true", evalXPath(doc, "boolean(//flow/block[1]/lineArea/viewport)"));
  71. assertEquals("46080", evalXPath(doc, "//flow/block[1]/lineArea/viewport/@ipd"));
  72. assertEquals("46080", evalXPath(doc, "//flow/block[1]/lineArea/viewport/@bpd"));
  73. }
  74. /**
  75. * Test custom URI resolution with a hand-written URIResolver.
  76. * @throws Exception if anything fails
  77. */
  78. public void testFO2() throws Exception {
  79. //TODO This will only work when we can do URI resolution inside Batik!
  80. File foFile = new File(getBaseDir(), "test/xml/uri-resolution2.fo");
  81. FOUserAgent ua = new FOUserAgent();
  82. MyURIResolver resolver = new MyURIResolver();
  83. ua.setURIResolver(resolver);
  84. ua.setBaseURL(foFile.getParentFile().toURL().toString());
  85. Fop fop = new Fop(Fop.RENDER_PDF, ua);
  86. ByteArrayOutputStream baout = new ByteArrayOutputStream();
  87. fop.setOutputStream(baout);
  88. Transformer transformer = tfactory.newTransformer(); //Identity transf.
  89. Source src = new StreamSource(foFile);
  90. Result res = new SAXResult(fop.getDefaultHandler());
  91. transformer.transform(src, res);
  92. OutputStream out = new java.io.FileOutputStream(
  93. new File(backupDir, foFile.getName() + ".pdf"));
  94. try {
  95. baout.writeTo(out);
  96. } finally {
  97. IOUtils.closeQuietly(out);
  98. }
  99. //Check how many times the resolver was consulted
  100. assertEquals("Expected resolver to do 1 successful URI resolution",
  101. 1, resolver.successCount);
  102. assertEquals("Expected resolver to do 0 failed URI resolutions",
  103. 0, resolver.failureCount);
  104. //Test using PDF as the area tree doesn't invoke Batik so we could check
  105. //if the resolver is actually passed to Batik by FOP
  106. assertTrue("Generated PDF has zero length", baout.size() > 0);
  107. }
  108. private Document createAreaTree(File fo, FOUserAgent ua)
  109. throws TransformerException, FOPException {
  110. DOMResult domres = new DOMResult();
  111. //Setup Transformer to convert the area tree to a DOM
  112. TransformerHandler athandler = tfactory.newTransformerHandler();
  113. athandler.setResult(domres);
  114. XMLRenderer atrenderer = new XMLRenderer();
  115. atrenderer.setUserAgent(ua);
  116. atrenderer.setTransformerHandler(athandler);
  117. ua.setRendererOverride(atrenderer);
  118. Fop fop = new Fop(Fop.RENDER_XML, ua);
  119. Transformer transformer = tfactory.newTransformer(); //Identity transf.
  120. Source src = new StreamSource(fo);
  121. Result res = new SAXResult(fop.getDefaultHandler());
  122. transformer.transform(src, res);
  123. Document doc = (Document)domres.getNode();
  124. saveAreaTreeXML(doc, new File(backupDir, fo.getName() + ".at.xml"));
  125. return doc;
  126. }
  127. private String evalXPath(Document doc, String xpath) {
  128. XObject res;
  129. try {
  130. res = XPathAPI.eval(doc, xpath);
  131. } catch (TransformerException e) {
  132. throw new RuntimeException("XPath evaluation failed: " + e.getMessage());
  133. }
  134. return res.str();
  135. }
  136. /**
  137. * Save the area tree XML for later inspection.
  138. * @param doc area tree as a DOM document
  139. * @param target target file
  140. * @throws TransformerException if a problem occurs during serialization
  141. */
  142. protected void saveAreaTreeXML(Document doc, File target) throws TransformerException {
  143. Transformer transformer = tfactory.newTransformer();
  144. Source src = new DOMSource(doc);
  145. Result res = new StreamResult(target);
  146. transformer.transform(src, res);
  147. }
  148. private class MyURIResolver implements URIResolver {
  149. private static final String PREFIX = "funky:";
  150. private int successCount = 0;
  151. private int failureCount = 0;
  152. /**
  153. * @see javax.xml.transform.URIResolver#resolve(java.lang.String, java.lang.String)
  154. */
  155. public Source resolve(String href, String base) throws TransformerException {
  156. if (href.startsWith(PREFIX)) {
  157. String name = href.substring(PREFIX.length());
  158. if ("myimage123".equals(name)) {
  159. File image = new File(getBaseDir(), "test/resources/images/bgimg300dpi.jpg");
  160. StreamSource src = new StreamSource(image);
  161. successCount++;
  162. return src;
  163. } else {
  164. failureCount++;
  165. throw new TransformerException("funky image not found");
  166. }
  167. } else {
  168. failureCount++;
  169. return null;
  170. }
  171. }
  172. }
  173. }