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.

AreaTreeBuilder.java 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. /*
  2. * $Id$
  3. * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
  4. * For details on use and redistribution please refer to the
  5. * LICENSE file included with these sources.
  6. */
  7. package org.apache.fop.tools;
  8. import org.apache.fop.apps.*;
  9. import org.apache.fop.configuration.*;
  10. import org.apache.fop.area.*;
  11. import org.apache.fop.area.inline.*;
  12. import org.apache.fop.area.inline.Character;
  13. import org.apache.fop.render.*;
  14. import org.apache.fop.render.pdf.*;
  15. import org.apache.fop.render.svg.*;
  16. import org.apache.fop.render.xml.*;
  17. import org.apache.log.*;
  18. import org.apache.log.format.*;
  19. import org.apache.log.output.io.*;
  20. import org.apache.log.output.*;
  21. import java.io.*;
  22. import java.util.*;
  23. import org.w3c.dom.*;
  24. /**
  25. * Area tree tester.
  26. * The purpose of this class is to create and render an area tree
  27. * for the purpose of testing the area tree and rendering.
  28. * This covers the set of possible properties that can be set
  29. * on the area tree for rendering.
  30. * Tests: different renderers, saving and loading pages with serialization
  31. * out of order rendering
  32. */
  33. public class AreaTreeBuilder {
  34. private Logger log;
  35. String baseName = "temp";
  36. /**
  37. */
  38. public static void main(String[] args) {
  39. AreaTreeBuilder atb = new AreaTreeBuilder();
  40. atb.runTests();
  41. }
  42. public AreaTreeBuilder() {
  43. setupLogging();
  44. }
  45. private void setupLogging() {
  46. Hierarchy hierarchy = Hierarchy.getDefaultHierarchy();
  47. PatternFormatter formatter = new PatternFormatter("[%{priority}]: %{message}\n%{throwable}");
  48. LogTarget target = null;
  49. target = new StreamTarget(System.out, formatter);
  50. hierarchy.setDefaultLogTarget(target);
  51. log = hierarchy.getLoggerFor("test");
  52. log.setPriority(Priority.DEBUG);
  53. }
  54. /**
  55. *
  56. */
  57. protected void runTests() {
  58. log.debug("Starting tests");
  59. runTest();
  60. log.debug("Finished");
  61. }
  62. /**
  63. */
  64. protected void runTest() {
  65. AreaTree.StorePagesModel sm = AreaTree.createStorePagesModel();
  66. TreeLoader tl = new TreeLoader();
  67. tl.setTreeModel(sm);
  68. try {
  69. InputStream is =
  70. new BufferedInputStream(new FileInputStream("doc.xml"));
  71. tl.buildAreaTree(is);
  72. renderAreaTree(sm);
  73. } catch (IOException e) {
  74. log.error("error reading file" + e.getMessage(), e);
  75. }
  76. }
  77. protected void renderAreaTree(AreaTree.StorePagesModel sm) {
  78. try {
  79. OutputStream os = new BufferedOutputStream(
  80. new FileOutputStream(baseName + ".xml"));
  81. Renderer rend = new XMLRenderer();
  82. //Renderer rend = new PDFRenderer();
  83. rend.setLogger(log);
  84. rend.startRenderer(os);
  85. int count = 0;
  86. int seqc = sm.getPageSequenceCount();
  87. while (count < seqc) {
  88. Title title = sm.getTitle(count);
  89. rend.startPageSequence(title);
  90. int pagec = sm.getPageCount(count);
  91. int c = 0;
  92. while (c < pagec) {
  93. PageViewport page = sm.getPage(count, c);
  94. c++;
  95. rend.renderPage(page);
  96. }
  97. count++;
  98. }
  99. rend.stopRenderer();
  100. os.close();
  101. } catch (Exception e) {
  102. log.error("error rendering output", e);
  103. }
  104. }
  105. }
  106. // this loads an area tree from an xml file
  107. // the xml format is the same as the xml renderer output
  108. class TreeLoader {
  109. AreaTree areaTree;
  110. AreaTree.AreaTreeModel model;
  111. TreeLoader() {
  112. }
  113. public void setTreeModel(AreaTree.AreaTreeModel mo) {
  114. model = mo;
  115. }
  116. public void buildAreaTree(InputStream is) {
  117. Document doc = null;
  118. try {
  119. doc = javax.xml.parsers.DocumentBuilderFactory.newInstance().
  120. newDocumentBuilder().parse(is);
  121. } catch (Exception e) {
  122. e.printStackTrace();
  123. }
  124. Element root = null;
  125. root = doc.getDocumentElement();
  126. areaTree = new AreaTree();
  127. areaTree.setTreeModel(model);
  128. readAreaTree(root);
  129. }
  130. public void readAreaTree(Element root) {
  131. NodeList childs = root.getChildNodes();
  132. for (int i = 0; i < childs.getLength(); i++) {
  133. Node obj = childs.item(i);
  134. if (obj.getNodeName().equals("pageSequence")) {
  135. readPageSequence((Element) obj);
  136. }
  137. }
  138. }
  139. public void readPageSequence(Element root) {
  140. Title title = null;
  141. boolean started = false;
  142. NodeList childs = root.getChildNodes();
  143. for (int i = 0; i < childs.getLength(); i++) {
  144. Node obj = childs.item(i);
  145. if (obj.getNodeName().equals("title")) {
  146. if (started) {
  147. // problem
  148. } else {
  149. title = readTitle((Element) obj);
  150. model.startPageSequence(title);
  151. started = true;
  152. }
  153. } else if (obj.getNodeName().equals("pageViewport")) {
  154. if (!started) {
  155. model.startPageSequence(null);
  156. started = true;
  157. }
  158. PageViewport viewport = readPageViewport((Element) obj);
  159. areaTree.addPage(viewport);
  160. }
  161. }
  162. }
  163. public Title readTitle(Element root) {
  164. Title title = new Title();
  165. List childs = getInlineAreas(root);
  166. for (int i = 0; i < childs.size(); i++) {
  167. InlineArea obj = (InlineArea) childs.get(i);
  168. title.addInlineArea(obj);
  169. }
  170. return title;
  171. }
  172. public PageViewport readPageViewport(Element root) {
  173. String bounds = root.getAttribute("bounds");
  174. PageViewport viewport = null;
  175. NodeList childs = root.getChildNodes();
  176. for (int i = 0; i < childs.getLength(); i++) {
  177. Node obj = childs.item(i);
  178. if (obj.getNodeName().equals("page")) {
  179. Page page = readPage((Element) obj);
  180. viewport = new PageViewport(page);
  181. }
  182. }
  183. return viewport;
  184. }
  185. public Page readPage(Element root) {
  186. String bounds = root.getAttribute("bounds");
  187. Page page = new Page();
  188. NodeList childs = root.getChildNodes();
  189. for (int i = 0; i < childs.getLength(); i++) {
  190. Node obj = childs.item(i);
  191. if (obj.getNodeName().equals("regionViewport")) {
  192. readRegionViewport(page, (Element) obj);
  193. }
  194. }
  195. return page;
  196. }
  197. public RegionViewport readRegionViewport(Page page, Element root) {
  198. RegionViewport reg = new RegionViewport();
  199. NodeList childs = root.getChildNodes();
  200. for (int i = 0; i < childs.getLength(); i++) {
  201. Node obj = childs.item(i);
  202. if (obj.getNodeName().equals("regionBefore")) {
  203. reg.setRegion(readRegion((Element) obj, Region.BEFORE));
  204. page.setRegion(Region.BEFORE, reg);
  205. } else if (obj.getNodeName().equals("regionStart")) {
  206. reg.setRegion(readRegion((Element) obj, Region.START));
  207. page.setRegion(Region.START, reg);
  208. } else if (obj.getNodeName().equals("regionBody")) {
  209. reg.setRegion(readRegion((Element) obj, Region.BODY));
  210. page.setRegion(Region.BODY, reg);
  211. } else if (obj.getNodeName().equals("regionEnd")) {
  212. reg.setRegion(readRegion((Element) obj, Region.END));
  213. page.setRegion(Region.END, reg);
  214. } else if (obj.getNodeName().equals("regionAfter")) {
  215. reg.setRegion(readRegion((Element) obj, Region.AFTER));
  216. page.setRegion(Region.AFTER, reg);
  217. }
  218. }
  219. return reg;
  220. }
  221. public Region readRegion(Element root, int type) {
  222. Region reg;
  223. if (type == Region.BODY) {
  224. reg = new BodyRegion();
  225. } else {
  226. reg = new Region(type);
  227. }
  228. List blocks = getBlocks(root);
  229. for (int i = 0; i < blocks.size(); i++) {
  230. Block obj = (Block) blocks.get(i);
  231. reg.addBlock(obj);
  232. }
  233. return reg;
  234. }
  235. List getBlocks(Element root) {
  236. ArrayList list = new ArrayList();
  237. NodeList childs = root.getChildNodes();
  238. for (int i = 0; i < childs.getLength(); i++) {
  239. Node obj = childs.item(i);
  240. if (obj.getNodeName().equals("block")) {
  241. Block block = new Block();
  242. addBlockChildren(block, (Element) obj);
  243. list.add(block);
  244. }
  245. }
  246. return list;
  247. }
  248. protected void addBlockChildren(Block block, Element root) {
  249. NodeList childs = root.getChildNodes();
  250. int type = -1;
  251. for (int i = 0; i < childs.getLength(); i++) {
  252. Node obj = childs.item(i);
  253. if (obj.getNodeName().equals("block")) {
  254. if (type == 2) {
  255. // error
  256. }
  257. Block b = new Block();
  258. addBlockChildren(b, (Element) obj);
  259. block.addBlock(b);
  260. type = 1;
  261. } else if (obj.getNodeName().equals("lineArea")) {
  262. if (type == 1) {
  263. // error
  264. }
  265. LineArea line = new LineArea();
  266. List inlines = getInlineAreas((Element)obj);
  267. for (int j = 0; j < inlines.size(); j++) {
  268. InlineArea inline = (InlineArea) inlines.get(j);
  269. line.addInlineArea(inline);
  270. }
  271. block.addLineArea(line);
  272. type = 2;
  273. }
  274. }
  275. }
  276. // children of element are inline areas
  277. List getInlineAreas(Element root) {
  278. ArrayList list = new ArrayList();
  279. NodeList childs = root.getChildNodes();
  280. for (int i = 0; i < childs.getLength(); i++) {
  281. Node obj = childs.item(i);
  282. if (obj.getNodeName().equals("char")) {
  283. Character ch =
  284. new Character(getString((Element) obj).charAt(0));
  285. list.add(ch);
  286. } else if (obj.getNodeName().equals("space")) {
  287. Space space = new Space();
  288. String width = ((Element) obj).getAttribute("width");
  289. int w = Integer.parseInt(width);
  290. space.setWidth(w);
  291. list.add(space);
  292. } else if (obj.getNodeName().equals("container")) {
  293. } else if (obj.getNodeName().equals("viewport")) {
  294. } else if (obj.getNodeName().equals("leader")) {
  295. } else {
  296. }
  297. }
  298. return list;
  299. }
  300. public String getString(Element ele) {
  301. String str = "";
  302. NodeList childs = ele.getChildNodes();
  303. if (childs.getLength() == 0) {
  304. return null;
  305. }
  306. for (int i = 0; i < childs.getLength(); i++) {
  307. Node obj = childs.item(i);
  308. str = str + obj.getNodeValue();
  309. }
  310. return str;
  311. }
  312. }