X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.app.servlet.odk%2Fsrc%2Forg%2Fargeo%2Fapp%2Fservlet%2Fodk%2FOdkSubmissionServlet.java;h=90f339a1e10b43180e58e1e66d6f6257f3b858a2;hb=b9a1a2a7ab6a1185802f49d2b8c36ca31f5d968d;hp=a5864d83336206d6e81c7229c05aea3febb3ef97;hpb=9d9479621848024ba6f09f0cafd7a0ae173f8144;p=gpl%2Fargeo-suite.git diff --git a/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkSubmissionServlet.java b/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkSubmissionServlet.java index a5864d8..90f339a 100644 --- a/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkSubmissionServlet.java +++ b/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkSubmissionServlet.java @@ -13,9 +13,6 @@ import java.util.Set; import javax.jcr.ImportUUIDBehavior; import javax.jcr.Node; import javax.jcr.Property; -import javax.jcr.Repository; -import javax.jcr.RepositoryException; -import javax.jcr.Session; import javax.jcr.nodetype.NodeType; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -23,17 +20,17 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; +import org.argeo.api.acr.Content; import org.argeo.api.cms.CmsLog; import org.argeo.api.cms.CmsSession; -import org.argeo.app.core.SuiteUtils; +import org.argeo.app.api.AppUserState; import org.argeo.app.image.ImageProcessor; import org.argeo.app.odk.OrxType; import org.argeo.app.xforms.FormSubmissionListener; import org.argeo.cms.auth.RemoteAuthRequest; import org.argeo.cms.auth.RemoteAuthUtils; -import org.argeo.cms.jcr.CmsJcrUtils; +import org.argeo.cms.jcr.acr.JcrContent; import org.argeo.cms.servlet.ServletHttpRequest; -import org.argeo.jcr.Jcr; import org.argeo.jcr.JcrUtils; /** Receives a form submission. */ @@ -46,42 +43,49 @@ public class OdkSubmissionServlet extends HttpServlet { private DateTimeFormatter submissionNameFormatter = DateTimeFormatter.ofPattern("YYYY-MM-dd-HHmmssSSS") .withZone(ZoneId.from(ZoneOffset.UTC)); - private Repository repository; +// private Repository repository; +// private ContentRepository contentRepository; private Set submissionListeners = new HashSet<>(); + private AppUserState appUserState; + @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/xml; charset=utf-8"); resp.setHeader("X-OpenRosa-Version", "1.0"); resp.setDateHeader("Date", System.currentTimeMillis()); - resp.setIntHeader("X-OpenRosa-Accept-Content-Length", 1024 * 1024); + + // should be set in HEAD? Let's rather use defaults. + // resp.setIntHeader("X-OpenRosa-Accept-Content-Length", 1024 * 1024); RemoteAuthRequest request = new ServletHttpRequest(req); - Session session = RemoteAuthUtils.doAs(() -> Jcr.login(repository, null), request); +// Session session = RemoteAuthUtils.doAs(() -> Jcr.login(repository, null), request); +// + CmsSession cmsSession = RemoteAuthUtils.getCmsSession(request); + +// Session adminSession = null; +// try { +// // TODO centralise at a deeper level +// adminSession = CmsJcrUtils.openDataAdminSession(repository, null); +// SuiteJcrUtils.getOrCreateCmsSessionNode(adminSession, cmsSession); +// } finally { +// Jcr.logout(adminSession); +// } try { - CmsSession cmsSession = RemoteAuthUtils.getCmsSession(request); - - Session adminSession = null; - try { - // TODO centralise at a deeper level - adminSession = CmsJcrUtils.openDataAdminSession(repository, null); - SuiteUtils.getOrCreateCmsSessionNode(adminSession, cmsSession); - } finally { - Jcr.logout(adminSession); - } - - Node cmsSessionNode = SuiteUtils.getCmsSessionNode(session, cmsSession); + Content sessionDir = appUserState.getOrCreateSessionDir(cmsSession); + Node cmsSessionNode = sessionDir.adapt(Node.class); + // Node cmsSessionNode = SuiteJcrUtils.getCmsSessionNode(session, cmsSession); Node submission = cmsSessionNode.addNode(submissionNameFormatter.format(Instant.now()), OrxType.submission.get()); for (Part part : req.getParts()) { - if (log.isDebugEnabled()) - log.debug("Part: " + part.getName() + ", " + part.getContentType()); + if (log.isTraceEnabled()) + log.trace("Part: " + part.getName() + ", " + part.getContentType()); if (part.getName().equals(XML_SUBMISSION_FILE)) { Node xml = submission.addNode(XML_SUBMISSION_FILE, NodeType.NT_UNSTRUCTURED); - session.importXML(xml.getPath(), part.getInputStream(), + cmsSessionNode.getSession().importXML(xml.getPath(), part.getInputStream(), ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING); } else { @@ -112,16 +116,26 @@ public class OdkSubmissionServlet extends HttpServlet { } } } - session.save(); - for (FormSubmissionListener submissionListener : submissionListeners) { - submissionListener.formSubmissionReceived(submission); + + cmsSessionNode.getSession().save(); + try { + for (FormSubmissionListener submissionListener : submissionListeners) { + submissionListener.formSubmissionReceived(JcrContent.nodeToContent(submission)); + } + } catch (Exception e) { + log.error("Cannot save submission, cancelling...", e); + submission.remove(); + cmsSessionNode.getSession().save(); + resp.setStatus(503); + return; } - } catch (RepositoryException e) { - e.printStackTrace(); + + } catch (Exception e) { + log.error("Cannot save submission", e); resp.setStatus(503); return; - } finally { - Jcr.logout(session); +// } finally { +// Jcr.logout(session); } resp.setStatus(201); @@ -130,9 +144,9 @@ public class OdkSubmissionServlet extends HttpServlet { } - public void setRepository(Repository repository) { - this.repository = repository; - } +// public void setRepository(Repository repository) { +// this.repository = repository; +// } public synchronized void addSubmissionListener(FormSubmissionListener listener) { submissionListeners.add(listener); @@ -141,4 +155,13 @@ public class OdkSubmissionServlet extends HttpServlet { public synchronized void removeSubmissionListener(FormSubmissionListener listener) { submissionListeners.remove(listener); } + +// public void setContentRepository(ContentRepository contentRepository) { +// this.contentRepository = contentRepository; +// } + + public void setAppUserState(AppUserState appUserState) { + this.appUserState = appUserState; + } + }