1 package org
.argeo
.jcr
.proxy
;
3 import java
.io
.IOException
;
4 import java
.io
.InputStream
;
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
;
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
;
21 /** Wraps a proxy via HTTP */
22 public class ResourceProxyServlet
extends HttpServlet
{
23 private static final long serialVersionUID
= -8886549549223155801L;
25 private final static CmsLog log
= CmsLog
26 .getLog(ResourceProxyServlet
.class);
28 private ResourceProxy proxy
;
30 private String contentTypeCharset
= "UTF-8";
33 protected void doGet(HttpServletRequest request
,
34 HttpServletResponse response
) throws ServletException
, IOException
{
35 String path
= request
.getPathInfo();
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"));
50 node
= proxy
.proxy(path
);
52 response
.sendError(404);
54 processResponse(node
, response
);
58 JcrUtils
.logoutQuietly(node
.getSession());
59 } catch (RepositoryException e
) {
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
);
75 // TODO use a more generic / standard approach
76 // see http://svn.apache.org/viewvc/tomcat/trunk/conf/web.xml
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";
93 contentType
= "application/octet-stream";
94 contentType
= contentType
+ ";name=\"" + fileName
+ "\"";
95 response
.setHeader("Content-Disposition", "attachment; filename=\""
97 response
.setHeader("Expires", "0");
98 response
.setHeader("Cache-Control", "no-cache, must-revalidate");
99 response
.setHeader("Pragma", "no-cache");
101 response
.setContentType(contentType
);
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
);
111 public void setProxy(ResourceProxy resourceProxy
) {
112 this.proxy
= resourceProxy
;