]>
git.argeo.org Git - gpl/argeo-suite.git/blob - app/servlet/odk/OdkFormServlet.java
1 package org
.argeo
.app
.servlet
.odk
;
3 import java
.io
.IOException
;
4 import java
.io
.InputStream
;
5 import java
.io
.OutputStream
;
6 import java
.net
.URLDecoder
;
7 import java
.nio
.charset
.StandardCharsets
;
8 import java
.util
.Collections
;
9 import java
.util
.HashMap
;
12 import javax
.jcr
.Repository
;
13 import javax
.jcr
.RepositoryException
;
14 import javax
.jcr
.Session
;
15 import javax
.servlet
.ServletException
;
16 import javax
.servlet
.http
.HttpServlet
;
17 import javax
.servlet
.http
.HttpServletRequest
;
18 import javax
.servlet
.http
.HttpServletResponse
;
20 import org
.apache
.commons
.io
.FilenameUtils
;
21 import org
.argeo
.app
.odk
.OdkForm
;
22 import org
.argeo
.app
.odk
.OdkNames
;
23 import org
.argeo
.cms
.auth
.RemoteAuthUtils
;
24 import org
.argeo
.cms
.servlet
.ServletHttpRequest
;
25 import org
.argeo
.jcr
.Jcr
;
27 /** Retrieves a single form. */
28 public class OdkFormServlet
extends HttpServlet
{
29 private static final long serialVersionUID
= 7838305967987687370L;
31 private Repository repository
;
32 private Map
<String
, OdkForm
> odkForms
= Collections
.synchronizedMap(new HashMap
<>());
35 protected void doGet(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{
36 resp
.setContentType("text/xml; charset=utf-8");
38 Session session
= RemoteAuthUtils
.doAs(() -> Jcr
.login(repository
, null), new ServletHttpRequest(req
));
40 String pathInfo
= req
.getPathInfo();
41 if (pathInfo
.startsWith("//"))
42 pathInfo
= pathInfo
.substring(1);
44 boolean oldApproach
= false;
47 String path
= URLDecoder
.decode(pathInfo
, StandardCharsets
.UTF_8
);
48 session
.exportDocumentView(path
+ "/" + OdkNames
.H_HTML
, resp
.getOutputStream(), true, false);
51 String fileName
= FilenameUtils
.getName(pathInfo
);
52 OdkForm form
= odkForms
.get(fileName
);
54 throw new IllegalArgumentException("No form named " + fileName
+ " was found");
56 byte[] buffer
= new byte[1024];
57 try (InputStream in
= form
.openStream(); OutputStream out
= resp
.getOutputStream();) {
59 while ((bytesRead
= in
.read(buffer
)) != -1)
60 out
.write(buffer
, 0, bytesRead
);
63 } catch (RepositoryException e
) {
72 public void addForm(OdkForm odkForm
) {
73 odkForms
.put(odkForm
.getFileName(), odkForm
);
76 public void removeForm(OdkForm odkForm
) {
77 odkForms
.remove(odkForm
.getFileName());
80 public void setRepository(Repository repository
) {
81 this.repository
= repository
;