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.

AreaTreeParserTestCase.java 8.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. /*
  2. * Copyright 2006 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.intermediate;
  18. import java.io.BufferedOutputStream;
  19. import java.io.File;
  20. import java.io.FileOutputStream;
  21. import java.io.OutputStream;
  22. import java.net.MalformedURLException;
  23. import javax.xml.transform.Result;
  24. import javax.xml.transform.Source;
  25. import javax.xml.transform.Templates;
  26. import javax.xml.transform.Transformer;
  27. import javax.xml.transform.TransformerConfigurationException;
  28. import javax.xml.transform.dom.DOMResult;
  29. import javax.xml.transform.dom.DOMSource;
  30. import javax.xml.transform.sax.SAXResult;
  31. import javax.xml.transform.sax.SAXTransformerFactory;
  32. import javax.xml.transform.sax.TransformerHandler;
  33. import javax.xml.transform.stream.StreamResult;
  34. import javax.xml.transform.stream.StreamSource;
  35. import org.apache.commons.io.IOUtils;
  36. import org.apache.commons.io.output.ByteArrayOutputStream;
  37. import org.apache.fop.apps.FOUserAgent;
  38. import org.apache.fop.apps.Fop;
  39. import org.apache.fop.apps.MimeConstants;
  40. import org.apache.fop.area.AreaTreeModel;
  41. import org.apache.fop.area.AreaTreeParser;
  42. import org.apache.fop.area.RenderPagesModel;
  43. import org.apache.fop.fonts.FontInfo;
  44. import org.apache.fop.render.Renderer;
  45. import org.apache.fop.render.xml.XMLRenderer;
  46. //XML Unit 1.0: See http://xmlunit.sourceforge.net (BSD-style License)
  47. import org.custommonkey.xmlunit.XMLTestCase;
  48. import org.w3c.dom.Document;
  49. /**
  50. * Tests the area tree parser.
  51. */
  52. public class AreaTreeParserTestCase extends XMLTestCase {
  53. private static SAXTransformerFactory tFactory
  54. = (SAXTransformerFactory)SAXTransformerFactory.newInstance();
  55. private static Templates stylesheet = null;
  56. private File mainDir = new File("test/layoutengine");
  57. private File testDir = new File(mainDir, "standard-testcases");
  58. private String name;
  59. private File testFile;
  60. private File outputDir;
  61. private Document intermediate;
  62. /** @see junit.framework.TestCase#TestCase(String) */
  63. public AreaTreeParserTestCase(String name) {
  64. super(name);
  65. }
  66. /**
  67. * Constructor for the test suite that is used for each test file.
  68. * @param testFile the test file to run
  69. */
  70. public AreaTreeParserTestCase(File testFile) {
  71. super(testFile.getName());
  72. this.testFile = testFile;
  73. }
  74. private Templates getStylesheet() throws TransformerConfigurationException {
  75. if (stylesheet == null) {
  76. File xsltFile = new File(mainDir, "testcase2fo.xsl");
  77. stylesheet = tFactory.newTemplates(new StreamSource(xsltFile));
  78. }
  79. return stylesheet;
  80. }
  81. /** @see junit.framework.TestCase#setUp() */
  82. protected void setUp() throws Exception {
  83. super.setUp();
  84. String s = System.getProperty("fop.intermediate.outdir");
  85. if (s != null && s.length() > 0) {
  86. outputDir = new File(s);
  87. outputDir.mkdirs();
  88. }
  89. File srcFile;
  90. if (testFile != null) {
  91. srcFile = testFile;
  92. } else {
  93. srcFile = new File(testDir, "block_font-style.xml");
  94. }
  95. this.name = srcFile.getName();
  96. intermediate = buildAreaTreeXML(new StreamSource(srcFile), getStylesheet());
  97. if (outputDir != null) {
  98. saveDOM(intermediate, new File(outputDir, name + ".at1.xml"));
  99. }
  100. }
  101. /**
  102. * Tests the area tree parser by running the parsed area tree again through the area tree
  103. * renderer. The source and result documents are compared to each other.
  104. * @throws Exception if the test fails
  105. */
  106. public void testParserToAT() throws Exception {
  107. Source src = new DOMSource(intermediate);
  108. Document doc = parseAndRenderToAreaTree(src);
  109. if (outputDir != null) {
  110. File tgtFile = new File(outputDir, name + ".at2.xml");
  111. saveDOM(doc, tgtFile);
  112. }
  113. assertXMLEqual(intermediate, doc);
  114. }
  115. private void saveDOM(Document doc, File tgtFile) throws Exception {
  116. Transformer transformer = tFactory.newTransformer();
  117. Source src = new DOMSource(doc);
  118. Result res = new StreamResult(tgtFile);
  119. transformer.transform(src, res);
  120. }
  121. /**
  122. * Tests the area tree parser by sending the parsed area tree to the PDF Renderer. Some
  123. * errors might be caught by the PDFRenderer.
  124. * @throws Exception if the test fails
  125. */
  126. public void testParserToPDF() throws Exception {
  127. OutputStream out;
  128. if (outputDir != null) {
  129. File tgtFile = new File(outputDir, name + ".pdf");
  130. out = new FileOutputStream(tgtFile);
  131. out = new BufferedOutputStream(out);
  132. } else {
  133. out = new ByteArrayOutputStream();
  134. }
  135. try {
  136. Source src = new DOMSource(intermediate);
  137. parseAndRender(src, out, MimeConstants.MIME_PDF);
  138. } finally {
  139. IOUtils.closeQuietly(out);
  140. }
  141. }
  142. private FOUserAgent createUserAgent() {
  143. FOUserAgent userAgent = new FOUserAgent();
  144. try {
  145. userAgent.setBaseURL(testDir.toURL().toExternalForm());
  146. } catch (MalformedURLException e) {
  147. //ignore, won't happen
  148. }
  149. return userAgent;
  150. }
  151. private Document buildAreaTreeXML(Source src, Templates stylesheet) throws Exception {
  152. Transformer transformer;
  153. if (stylesheet != null) {
  154. transformer = stylesheet.newTransformer();
  155. } else {
  156. transformer = tFactory.newTransformer();
  157. }
  158. //Set up XMLRenderer to render to a DOM
  159. TransformerHandler handler = tFactory.newTransformerHandler();
  160. DOMResult domResult = new DOMResult();
  161. handler.setResult(domResult);
  162. FOUserAgent userAgent = createUserAgent();
  163. //Create an instance of the target renderer so the XMLRenderer can use its font setup
  164. Renderer targetRenderer = userAgent.getRendererFactory().createRenderer(
  165. userAgent, MimeConstants.MIME_PDF);
  166. XMLRenderer renderer = new XMLRenderer();
  167. renderer.mimicRenderer(targetRenderer);
  168. renderer.setTransformerHandler(handler);
  169. renderer.setUserAgent(userAgent);
  170. userAgent.setRendererOverride(renderer);
  171. Fop fop = new Fop(MimeConstants.MIME_FOP_AREA_TREE, userAgent);
  172. Result res = new SAXResult(fop.getDefaultHandler());
  173. transformer.transform(src, res);
  174. return (Document)domResult.getNode();
  175. }
  176. private void parseAndRender(Source src, OutputStream out, String mime) throws Exception {
  177. AreaTreeParser parser = new AreaTreeParser();
  178. FOUserAgent userAgent = createUserAgent();
  179. FontInfo fontInfo = new FontInfo();
  180. AreaTreeModel treeModel = new RenderPagesModel(userAgent,
  181. mime, fontInfo, out);
  182. parser.parse(src, treeModel, userAgent);
  183. treeModel.endDocument();
  184. }
  185. private Document parseAndRenderToAreaTree(Source src) throws Exception {
  186. AreaTreeParser parser = new AreaTreeParser();
  187. //Set up XMLRenderer to render to a DOM
  188. TransformerHandler handler = tFactory.newTransformerHandler();
  189. DOMResult domResult = new DOMResult();
  190. handler.setResult(domResult);
  191. XMLRenderer renderer = new XMLRenderer();
  192. renderer.setTransformerHandler(handler);
  193. FOUserAgent userAgent = createUserAgent();
  194. userAgent.setRendererOverride(renderer);
  195. renderer.setUserAgent(userAgent);
  196. FontInfo fontInfo = new FontInfo();
  197. AreaTreeModel treeModel = new RenderPagesModel(userAgent,
  198. MimeConstants.MIME_FOP_AREA_TREE, fontInfo, null);
  199. parser.parse(src, treeModel, userAgent);
  200. treeModel.endDocument();
  201. return (Document)domResult.getNode();
  202. }
  203. }