View Javadoc

1   package uk.ac.cam.spectra.spectrasub.services;
2   
3   import java.io.FileInputStream;
4   import java.io.IOException;
5   import java.io.InputStream;
6   import java.io.OutputStream;
7   import java.util.HashMap;
8   import java.util.Map;
9   
10  import org.apache.commons.io.IOUtils;
11  import org.apache.log4j.Logger;
12  import org.apache.tapestry.IRequestCycle;
13  import org.apache.tapestry.engine.IEngineService;
14  import org.apache.tapestry.engine.ILink;
15  import org.apache.tapestry.error.RequestExceptionReporter;
16  import org.apache.tapestry.services.LinkFactory;
17  import org.apache.tapestry.util.ContentType;
18  import org.apache.tapestry.web.WebResponse;
19  
20  import uk.ac.cam.spectra.spectrasub.FileAndType;
21  import uk.ac.cam.spectra.spectrasub.NotFoundException;
22  import uk.ac.cam.spectra.spectrasub.Packager;
23  
24  /**
25   * Handles file downloads in the "Confirm" stage of the upload process (a
26   * service is the equivalent of a straight servlet). This component is wired to
27   * the spring world via hivemodule.xml, which provides the Packager dependency.
28   * 
29   * @author ojd20
30   */
31  public class FileService implements IEngineService {
32  
33      private static final Logger LOG = Logger.getLogger(FileService.class);
34  
35      private static final String SVC_NAME = "file";
36  
37      private static final String PACKAGE = "package";
38  
39      private static final String FILENAME = "file";
40  
41      private LinkFactory linkFactory;
42  
43      private WebResponse response;
44  
45      private Packager packager;
46  
47      private RequestExceptionReporter exceptionReporter;
48  
49      public RequestExceptionReporter getExceptionReporter() {
50          return exceptionReporter;
51      }
52  
53      public void setExceptionReporter(RequestExceptionReporter exceptionReporter) {
54          this.exceptionReporter = exceptionReporter;
55      }
56  
57      public Packager getPackager() {
58          return packager;
59      }
60  
61      public void setPackager(Packager packager) {
62          this.packager = packager;
63      }
64  
65      public WebResponse getResponse() {
66          return response;
67      }
68  
69      public void setResponse(WebResponse response) {
70          this.response = response;
71      }
72  
73      public ILink getLink(boolean post, Object param) {
74          Object[] ps = (Object[]) param;
75          Map<String, Object> params = new HashMap<String, Object>();
76          params.put(PACKAGE, ps[0].toString());
77          params.put(FILENAME, ps[1].toString());
78          return getLinkFactory().constructLink(this, post, params, false);
79      }
80  
81      public String getName() {
82          return SVC_NAME;
83      }
84  
85      public void service(IRequestCycle cycle) throws IOException {
86          String packageId = cycle.getParameter(PACKAGE);
87          String filename = cycle.getParameter(FILENAME);
88          WebResponse res = getResponse();
89  
90          // The following sets no caching (It is useful when serving images.)
91          res.setHeader("Pragma", "no-cache");
92          res.setHeader("cache-control", "no-cache");
93          res.setDateHeader("Expires", 0);
94  
95          OutputStream out = null;
96          InputStream in = null;
97  
98          try {
99              FileAndType fd = packager.getFileAndType(packageId, filename);
100             out = res.getOutputStream(new ContentType(fd.getMimeType()));
101             res.setContentLength((int) fd.getFile().length());
102             in = new FileInputStream(fd.getFile());
103             IOUtils.copy(in, out);
104         } catch (NotFoundException e) {
105             exceptionReporter.reportRequestException("Package not found", e);
106             LOG.error(e);
107         } finally {
108             IOUtils.closeQuietly(out);
109             IOUtils.closeQuietly(in);
110         }
111     }
112 
113     public LinkFactory getLinkFactory() {
114         return linkFactory;
115     }
116 
117     public void setLinkFactory(LinkFactory linkFactory) {
118         this.linkFactory = linkFactory;
119     }
120 
121 }