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 org.apache.commons.collections.MultiMap;
37 import org.apache.commons.io.FileUtils;
38 import org.apache.commons.io.IOUtils;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41
42 import javax.servlet.FilterChain;
43 import javax.servlet.ServletException;
44 import javax.servlet.http.HttpServletRequest;
45 import javax.servlet.http.HttpServletResponse;
46 import java.io.File;
47 import java.io.FileInputStream;
48 import java.io.IOException;
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 public class DelegatingBlobCachedEntry extends ContentCachedEntry {
64
65 private static Logger log = LoggerFactory.getLogger(DelegatingBlobCachedEntry.class);
66
67
68 public static final String CONTENT_FILE_ATTRIBUTE = DelegatingBlobCachedEntry.class.getName() + ".contentFile";
69
70 private long contentLength;
71
72 public DelegatingBlobCachedEntry(long contentLength, String contentType, String characterEncoding, int statusCode, MultiMap headers, long modificationDate, String originalUrl, int timeToLiveInSeconds) throws IOException {
73 super(contentType, characterEncoding, statusCode, headers, modificationDate, originalUrl, timeToLiveInSeconds);
74 this.contentLength = contentLength;
75 }
76
77 @Override
78 protected boolean canServeGzipContent() {
79 return false;
80 }
81
82 @Override
83 public void replay(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
84 File contentFile = getContentFileBoundToTheRequest(request);
85 if(contentFile != null){
86 super.replay(request, response, chain);
87 }
88 else{
89 chain.doFilter(request, response);
90 }
91 }
92
93 @Override
94 protected void writeContent(HttpServletRequest request, HttpServletResponse response, FilterChain chain, boolean acceptsGzipEncoding) throws IOException, ServletException {
95 response.setContentLength((int) contentLength);
96 File contentFile = getContentFileBoundToTheRequest(request);
97 if(contentFile != null){
98 FileInputStream contentStream = FileUtils.openInputStream(contentFile);
99 try{
100 IOUtils.copy(contentStream,response.getOutputStream());
101 }finally{
102 IOUtils.closeQuietly(contentStream);
103 if(!contentFile.delete()){
104 log.error("Can't delete file: " + contentFile);
105 }
106 }
107 }
108 else{
109
110 throw new IllegalStateException("No content file attached to the request!");
111 }
112 }
113
114 private File getContentFileBoundToTheRequest(HttpServletRequest request) {
115 return (File) request.getAttribute(CONTENT_FILE_ATTRIBUTE);
116 }
117
118 public void bindContentFileToCurrentRequest(HttpServletRequest request, File contentFile){
119 request.setAttribute(DelegatingBlobCachedEntry.CONTENT_FILE_ATTRIBUTE, contentFile);
120 }
121
122 }