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 4.1KB

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