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