]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms.jcr/src/org/argeo/jcr/proxy/ResourceProxyServlet.java
Move time UUID nodeid back to the factory
[lgpl/argeo-commons.git] / org.argeo.cms.jcr / src / org / argeo / jcr / proxy / ResourceProxyServlet.java
1 package org.argeo.jcr.proxy;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5
6 import javax.jcr.Node;
7 import javax.jcr.Property;
8 import javax.jcr.RepositoryException;
9 import javax.servlet.ServletException;
10 import javax.servlet.http.HttpServlet;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13
14 import org.apache.commons.io.FilenameUtils;
15 import org.apache.commons.io.IOUtils;
16 import org.argeo.jcr.JcrException;
17 import org.argeo.api.cms.CmsLog;
18 import org.argeo.jcr.Bin;
19 import org.argeo.jcr.JcrUtils;
20
21 /** Wraps a proxy via HTTP */
22 public class ResourceProxyServlet extends HttpServlet {
23 private static final long serialVersionUID = -8886549549223155801L;
24
25 private final static CmsLog log = CmsLog
26 .getLog(ResourceProxyServlet.class);
27
28 private ResourceProxy proxy;
29
30 private String contentTypeCharset = "UTF-8";
31
32 @Override
33 protected void doGet(HttpServletRequest request,
34 HttpServletResponse response) throws ServletException, IOException {
35 String path = request.getPathInfo();
36
37 if (log.isTraceEnabled()) {
38 log.trace("path=" + path);
39 log.trace("UserPrincipal = " + request.getUserPrincipal().getName());
40 log.trace("SessionID = " + request.getSession(false).getId());
41 log.trace("ContextPath = " + request.getContextPath());
42 log.trace("ServletPath = " + request.getServletPath());
43 log.trace("PathInfo = " + request.getPathInfo());
44 log.trace("Method = " + request.getMethod());
45 log.trace("User-Agent = " + request.getHeader("User-Agent"));
46 }
47
48 Node node = null;
49 try {
50 node = proxy.proxy(path);
51 if (node == null)
52 response.sendError(404);
53 else
54 processResponse(node, response);
55 } finally {
56 if (node != null)
57 try {
58 JcrUtils.logoutQuietly(node.getSession());
59 } catch (RepositoryException e) {
60 // silent
61 }
62 }
63
64 }
65
66 /** Retrieve the content of the node. */
67 protected void processResponse(Node node, HttpServletResponse response) {
68 // Binary binary = null;
69 // InputStream in = null;
70 try(Bin binary = new Bin( node.getNode(Property.JCR_CONTENT)
71 .getProperty(Property.JCR_DATA));InputStream in = binary.getStream()) {
72 String fileName = node.getName();
73 String ext = FilenameUtils.getExtension(fileName);
74
75 // TODO use a more generic / standard approach
76 // see http://svn.apache.org/viewvc/tomcat/trunk/conf/web.xml
77 String contentType;
78 if ("xml".equals(ext))
79 contentType = "text/xml;charset=" + contentTypeCharset;
80 else if ("jar".equals(ext))
81 contentType = "application/java-archive";
82 else if ("zip".equals(ext))
83 contentType = "application/zip";
84 else if ("gz".equals(ext))
85 contentType = "application/x-gzip";
86 else if ("bz2".equals(ext))
87 contentType = "application/x-bzip2";
88 else if ("tar".equals(ext))
89 contentType = "application/x-tar";
90 else if ("rpm".equals(ext))
91 contentType = "application/x-redhat-package-manager";
92 else
93 contentType = "application/octet-stream";
94 contentType = contentType + ";name=\"" + fileName + "\"";
95 response.setHeader("Content-Disposition", "attachment; filename=\""
96 + fileName + "\"");
97 response.setHeader("Expires", "0");
98 response.setHeader("Cache-Control", "no-cache, must-revalidate");
99 response.setHeader("Pragma", "no-cache");
100
101 response.setContentType(contentType);
102
103 IOUtils.copy(in, response.getOutputStream());
104 } catch (RepositoryException e) {
105 throw new JcrException("Cannot download " + node, e);
106 } catch (IOException e) {
107 throw new RuntimeException("Cannot download " + node, e);
108 }
109 }
110
111 public void setProxy(ResourceProxy resourceProxy) {
112 this.proxy = resourceProxy;
113 }
114
115 }