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 package info.magnolia.module.cache.filter;
35
36 import info.magnolia.context.MgnlContext;
37
38 import java.io.ByteArrayOutputStream;
39 import java.io.IOException;
40 import java.io.OutputStream;
41
42 import javax.servlet.http.HttpServletRequest;
43
44 import org.apache.commons.io.output.ThresholdingOutputStream;
45
46
47
48
49 abstract class AbstractThresholdingCacheOutputStream extends ThresholdingOutputStream {
50
51 private final HttpServletRequest request;
52 protected OutputStream out;
53
54 private boolean thresholdExceeded;
55 private int written;
56
57 public AbstractThresholdingCacheOutputStream(int threshold) {
58 super(threshold);
59 this.out = new ByteArrayOutputStream();
60 if (MgnlContext.isWebContext()) {
61 request = MgnlContext.getWebContext().getRequest();
62 } else {
63 request = null;
64 }
65 }
66
67 @Override
68 protected OutputStream getStream() throws IOException {
69 return getInMemoryBuffer();
70 }
71
72 @Override
73 protected abstract void thresholdReached() throws IOException;
74
75 public OutputStream getInMemoryBuffer() {
76 return out;
77 }
78
79 @Override
80 public void write(int b) throws IOException {
81 checkThreshold(1);
82 getStream().write(b);
83 written++;
84 }
85
86 @Override
87 public void write(byte b[]) throws IOException {
88 checkThreshold(b.length);
89 getStream().write(b);
90 written += b.length;
91 }
92
93 @Override
94 public void write(byte b[], int off, int len) throws IOException {
95 checkThreshold(len);
96 getStream().write(b, off, len);
97 written += len;
98 }
99
100 @Override
101 public long getByteCount() {
102 return written;
103 }
104
105 @Override
106 public boolean isThresholdExceeded() {
107 return written > this.getThreshold();
108 }
109
110 @Override
111 protected void checkThreshold(int count) throws IOException {
112 if (!thresholdExceeded && written + count > this.getThreshold()) {
113 thresholdExceeded = true;
114 thresholdReached();
115 }
116 }
117
118 @Override
119 public int getThreshold() {
120 if (request != null) {
121 Integer threshold = (Integer) request.getAttribute(CacheResponseWrapper.ATTRIBUTE_IN_MEMORY_THRESHOLD);
122 if (threshold != null) {
123 return threshold;
124 }
125 }
126 return super.getThreshold();
127 }
128
129 @Override
130 protected void resetByteCount() {
131 this.thresholdExceeded = false;
132 this.written = 0;
133 }
134
135 }