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