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.

CachedRenderPagesModel.java 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * $Id$
  3. * Copyright (C) 2002 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.area;
  8. import org.apache.fop.render.Renderer;
  9. import java.util.Map;
  10. import java.util.HashMap;
  11. import java.util.Iterator;
  12. import java.io.File;
  13. import java.io.FileOutputStream;
  14. import java.io.FileInputStream;
  15. import java.io.ObjectOutputStream;
  16. import java.io.ObjectInputStream;
  17. import java.io.BufferedOutputStream;
  18. import java.io.BufferedInputStream;
  19. /**
  20. * A simple cached render pages model.
  21. * If the page is prepared for later rendering then this saves
  22. * the page contents to a file and once the page is resolved
  23. * the contents a reloaded.
  24. */
  25. public class CachedRenderPagesModel extends AreaTree.RenderPagesModel {
  26. private Map pageMap = new HashMap();
  27. /**
  28. * Create a new render pages model with the given renderer.
  29. * @param rend the renderer to render pages to
  30. */
  31. public CachedRenderPagesModel(Renderer rend) {
  32. super(rend);
  33. }
  34. /**
  35. * Check prepared pages
  36. * If a page is resolved it loads the page contents from
  37. * the file.
  38. * @return true if the current page should be rendered
  39. * false if the renderer doesn't support out of order
  40. * rendering and there are pending pages
  41. */
  42. protected boolean checkPreparedPages(PageViewport newpage) {
  43. for (Iterator iter = prepared.iterator(); iter.hasNext();) {
  44. PageViewport p = (PageViewport)iter.next();
  45. if (p.isResolved()) {
  46. if(p != newpage) {
  47. try {
  48. // load page from cache
  49. String name = (String)pageMap.get(p);
  50. File temp = new File(name);
  51. System.out.println("page serialized to: " + temp.length());
  52. ObjectInputStream in = new ObjectInputStream(
  53. new BufferedInputStream(
  54. new FileInputStream(temp)));
  55. p.loadPage(in);
  56. in.close();
  57. temp.delete();
  58. pageMap.remove(p);
  59. } catch (Exception e) {
  60. e.printStackTrace();
  61. }
  62. }
  63. try {
  64. renderer.renderPage(p);
  65. } catch (Exception e) {
  66. // use error handler to handle this FOP or IO Exception
  67. e.printStackTrace();
  68. }
  69. p.clear();
  70. iter.remove();
  71. } else {
  72. if (!renderer.supportsOutOfOrder()) {
  73. break;
  74. }
  75. }
  76. }
  77. if(newpage != null && newpage.getPage() != null) {
  78. savePage(newpage);
  79. }
  80. return renderer.supportsOutOfOrder() || prepared.isEmpty();
  81. }
  82. /**
  83. * Save a page.
  84. * It saves the contents of the page to a file.
  85. *
  86. * @param page the page to prepare
  87. */
  88. protected void savePage(PageViewport page) {
  89. try {
  90. // save page to cache
  91. ObjectOutputStream tempstream;
  92. String fname = "page" + page.toString() + ".ser";
  93. tempstream = new ObjectOutputStream(new BufferedOutputStream(
  94. new FileOutputStream(fname)));
  95. page.savePage(tempstream);
  96. tempstream.close();
  97. pageMap.put(page, fname);
  98. } catch (Exception e) {
  99. e.printStackTrace();
  100. }
  101. }
  102. }