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
26
27
28
29
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
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 }