Rev 1272 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
936 | dev | 1 | package ak.photoalbum.webapp; |
2 | |||
3 | import javax.servlet.http.HttpServletRequest; |
||
4 | import javax.servlet.http.HttpServletResponse; |
||
5 | import org.apache.struts.action.ActionMapping; |
||
6 | import org.apache.struts.action.ActionForm; |
||
7 | import org.apache.struts.action.ActionForward; |
||
8 | import org.apache.log4j.Logger; |
||
1249 | dev | 9 | import ak.photoalbum.logic.Logic; |
1272 | dev | 10 | import ak.photoalbum.util.TimestampRecipient; |
936 | dev | 11 | |
12 | public final class ImageAction |
||
13 | extends BaseAction |
||
14 | { |
||
15 | private static final Logger logger = Logger.getLogger(ImageAction.class); |
||
16 | |||
17 | public ActionForward executeAction(ActionMapping mapping, ActionForm form, |
||
18 | HttpServletRequest request, HttpServletResponse response) |
||
19 | throws Exception |
||
20 | { |
||
1272 | dev | 21 | PathForm theForm = (PathForm)form; |
22 | String branch = theForm.getBranch(); |
||
23 | String path = theForm.getPath(); |
||
24 | Logic logic = Logic.getLogic(); |
||
25 | HttpTimestampRecipient timestampRecipient = new HttpTimestampRecipient(response); |
||
26 | long ifModifiedSince; |
||
27 | boolean fileModified = true; |
||
936 | dev | 28 | |
1272 | dev | 29 | try { |
30 | ifModifiedSince = request.getDateHeader("If-Modified-Since"); |
||
31 | } |
||
32 | catch(Exception ex) { |
||
33 | ifModifiedSince = -1; |
||
34 | } |
||
35 | |||
936 | dev | 36 | logger.info("get image " + mapping.getParameter() + " for " + path); |
37 | |||
38 | if("dir".equals(mapping.getParameter())) { |
||
1249 | dev | 39 | response.setContentType(logic.getThumbnailMime(branch)); |
1272 | dev | 40 | fileModified = logic.writeDir(branch, path, ifModifiedSince, |
41 | response.getOutputStream(), timestampRecipient); |
||
936 | dev | 42 | } |
43 | else if("small".equals(mapping.getParameter())) { |
||
1249 | dev | 44 | response.setContentType(logic.getThumbnailMime(branch)); |
1272 | dev | 45 | fileModified = logic.writeSmall(branch, path, ifModifiedSince, |
46 | response.getOutputStream(), timestampRecipient); |
||
936 | dev | 47 | } |
48 | else if("medium".equals(mapping.getParameter())) { |
||
1249 | dev | 49 | response.setContentType(logic.getThumbnailMime(branch)); |
1272 | dev | 50 | fileModified = logic.writeMedium(branch, path, ifModifiedSince, |
51 | response.getOutputStream(), timestampRecipient); |
||
936 | dev | 52 | } |
53 | else if("origin".equals(mapping.getParameter())) { |
||
1249 | dev | 54 | response.setContentType(logic.getOriginMime(branch, path)); |
1272 | dev | 55 | fileModified = logic.writeOrigin(branch, path, ifModifiedSince, |
56 | response.getOutputStream(), timestampRecipient); |
||
936 | dev | 57 | } |
58 | |||
1272 | dev | 59 | // if file was modified comapring to "If-Modified-Since" header, then it's already written |
60 | // into to response; otherwise send 304 code |
||
61 | if(!fileModified) { |
||
62 | response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); |
||
63 | } |
||
64 | |||
936 | dev | 65 | return null; |
66 | } |
||
1272 | dev | 67 | |
68 | private class HttpTimestampRecipient |
||
69 | implements TimestampRecipient |
||
70 | { |
||
1274 | dev | 71 | private final HttpServletResponse response; |
1272 | dev | 72 | |
73 | public HttpTimestampRecipient(HttpServletResponse response) |
||
74 | { |
||
75 | this.response = response; |
||
76 | } |
||
77 | |||
78 | public void setTimestamp(long timestamp) |
||
79 | { |
||
80 | response.setDateHeader("Last-Modified", timestamp); |
||
81 | } |
||
82 | } |
||
936 | dev | 83 | } |