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.cms.filters;
35
36 import info.magnolia.cms.filters.RangeSupportFilter.RangeInfo;
37
38 import java.io.IOException;
39
40 import javax.servlet.ServletOutputStream;
41 import javax.servlet.WriteListener;
42
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45
46
47
48
49 public class RangedOutputStream extends ServletOutputStream {
50
51 private static final Logger log = LoggerFactory.getLogger(RangedOutputStream.class);
52
53 private final ServletOutputStream out;
54
55 private long writtenCount = 0;
56
57 private final RangeInfo range;
58
59 public RangedOutputStream(ServletOutputStream stream, RangeInfo range) {
60 log.debug("Using ranged stream");
61 out = stream;
62 this.range = range;
63 }
64
65 @Override
66 public void write(int b) throws IOException {
67 if (writtenCount >= range.start && writtenCount <= range.end) {
68 out.write(b);
69 }
70 writtenCount++;
71 }
72
73 @Override
74 public void close() throws IOException {
75 int rangeLen = range.end - range.start;
76 int written = (int) Math.min(rangeLen, writtenCount);
77 log.debug("Closing ranged stream after writing {} bytes into range {} bytes of total {} received bytes", written, rangeLen, writtenCount);
78 super.close();
79 }
80
81 @Override
82 public boolean isReady() {
83 return false;
84 }
85
86 @Override
87 public void setWriteListener(WriteListener writeListener) {
88 throw new UnsupportedOperationException("We don't expect any non blocking call here");
89 }
90 }