Work on ODK servlets based on JCR.
[gpl/argeo-suite.git] / knowledge / org.argeo.support.odk / src / org / argeo / support / odk / servlet / OdkFormServlet.java
index 3746da852aaefbb0826cc32673a40fec0b53266d..93f41479ded820342874e326a9ced9631af4db66 100644 (file)
@@ -7,35 +7,57 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.commons.io.FilenameUtils;
+import org.argeo.cms.auth.ServletAuthUtils;
+import org.argeo.jcr.Jcr;
 import org.argeo.support.odk.OdkForm;
 
 /** Retrieves a single form. */
 public class OdkFormServlet extends HttpServlet {
        private static final long serialVersionUID = 7838305967987687370L;
 
+       private Repository repository;
        private Map<String, OdkForm> odkForms = Collections.synchronizedMap(new HashMap<>());
 
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                resp.setContentType("text/xml; charset=utf-8");
 
-               String path = req.getServletPath();
-               String fileName = FilenameUtils.getName(path);
-               OdkForm form = odkForms.get(fileName);
-               if (form == null)
-                       throw new IllegalArgumentException("No form named " + fileName + " was found");
-
-               byte[] buffer = new byte[1024];
-               try (InputStream in = form.openStream(); OutputStream out = resp.getOutputStream();) {
-                       int bytesRead;
-                       while ((bytesRead = in.read(buffer)) != -1)
-                               out.write(buffer, 0, bytesRead);
+               Session session = ServletAuthUtils.doAs(() -> Jcr.login(repository, null), req);
+
+               String pathInfo = req.getPathInfo();
+
+               try {
+                       if (session.nodeExists(pathInfo)) {
+                               session.exportDocumentView(pathInfo + "/h:html", resp.getOutputStream(), true, false);
+                       } else {
+
+                               String fileName = FilenameUtils.getName(pathInfo);
+                               OdkForm form = odkForms.get(fileName);
+                               if (form == null)
+                                       throw new IllegalArgumentException("No form named " + fileName + " was found");
+
+                               byte[] buffer = new byte[1024];
+                               try (InputStream in = form.openStream(); OutputStream out = resp.getOutputStream();) {
+                                       int bytesRead;
+                                       while ((bytesRead = in.read(buffer)) != -1)
+                                               out.write(buffer, 0, bytesRead);
+                               }
+                       }
+               } catch (RepositoryException e) {
+                       e.printStackTrace();
+                       // TODO error message
+                       resp.sendError(500);
+               } finally {
+                       Jcr.logout(session);
                }
        }
 
@@ -47,4 +69,8 @@ public class OdkFormServlet extends HttpServlet {
                odkForms.remove(odkForm.getFileName());
        }
 
+       public void setRepository(Repository repository) {
+               this.repository = repository;
+       }
+
 }