From 03cc3d1627b3ff2b39aeb83384d1b6f304d270bc Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 25 Jun 2023 11:47:07 +0200 Subject: [PATCH] Make ODK submission compatible with ACR --- .../src/org/argeo/app/api/AppUserState.java | 4 +- org.argeo.app.jcr/.project | 5 ++ org.argeo.app.jcr/OSGI-INF/appUserState.xml | 1 + .../internal/app/jcr/AppUserStateImpl.java | 12 +++- .../OSGI-INF/odkSubmissionServlet.xml | 2 +- .../app/servlet/odk/OdkSubmissionServlet.java | 61 +++++++++++-------- .../src/org/argeo/app/swt/ux/SwtArgeoApp.java | 2 +- 7 files changed, 56 insertions(+), 31 deletions(-) diff --git a/org.argeo.app.api/src/org/argeo/app/api/AppUserState.java b/org.argeo.app.api/src/org/argeo/app/api/AppUserState.java index 763fd31..bcb0593 100644 --- a/org.argeo.app.api/src/org/argeo/app/api/AppUserState.java +++ b/org.argeo.app.api/src/org/argeo/app/api/AppUserState.java @@ -1,9 +1,9 @@ package org.argeo.app.api; import org.argeo.api.acr.Content; -import org.argeo.api.acr.ContentSession; import org.argeo.api.cms.CmsSession; +/** Access to content which is specific to a user and their state. */ public interface AppUserState { - Content getOrCreateSessionDir(ContentSession contentSession, CmsSession session); + Content getOrCreateSessionDir(CmsSession session); } diff --git a/org.argeo.app.jcr/.project b/org.argeo.app.jcr/.project index f688a62..f66d439 100644 --- a/org.argeo.app.jcr/.project +++ b/org.argeo.app.jcr/.project @@ -20,6 +20,11 @@ + + org.eclipse.pde.ds.core.builder + + + org.eclipse.pde.PluginNature diff --git a/org.argeo.app.jcr/OSGI-INF/appUserState.xml b/org.argeo.app.jcr/OSGI-INF/appUserState.xml index 5dc205e..481884e 100644 --- a/org.argeo.app.jcr/OSGI-INF/appUserState.xml +++ b/org.argeo.app.jcr/OSGI-INF/appUserState.xml @@ -5,4 +5,5 @@ + diff --git a/org.argeo.app.jcr/src/org/argeo/internal/app/jcr/AppUserStateImpl.java b/org.argeo.app.jcr/src/org/argeo/internal/app/jcr/AppUserStateImpl.java index bb2bc15..5b481f7 100644 --- a/org.argeo.app.jcr/src/org/argeo/internal/app/jcr/AppUserStateImpl.java +++ b/org.argeo.app.jcr/src/org/argeo/internal/app/jcr/AppUserStateImpl.java @@ -3,24 +3,28 @@ package org.argeo.internal.app.jcr; import javax.jcr.Node; import org.argeo.api.acr.Content; +import org.argeo.api.acr.ContentRepository; import org.argeo.api.acr.ContentSession; import org.argeo.api.cms.CmsConstants; import org.argeo.api.cms.CmsSession; import org.argeo.app.api.AppUserState; import org.argeo.app.jcr.SuiteJcrUtils; +import org.argeo.cms.acr.ContentUtils; import org.argeo.cms.jcr.acr.JcrContentProvider; import org.argeo.jcr.Jcr; public class AppUserStateImpl implements AppUserState { + private ContentRepository contentRepository; private JcrContentProvider jcrContentProvider; @SuppressWarnings("deprecation") @Override - public Content getOrCreateSessionDir(ContentSession contentSession, CmsSession session) { + public Content getOrCreateSessionDir(CmsSession session) { Node userDirNode = jcrContentProvider.doInAdminSession((adminSession) -> { Node node = SuiteJcrUtils.getOrCreateCmsSessionNode(adminSession, session); return node; - }); + }); + ContentSession contentSession = ContentUtils.openSession(contentRepository, session); Content userDir = contentSession.get(Content.ROOT_PATH + CmsConstants.SYS_WORKSPACE + Jcr.getPath(userDirNode)); return userDir; } @@ -29,4 +33,8 @@ public class AppUserStateImpl implements AppUserState { this.jcrContentProvider = jcrContentProvider; } + public void setContentRepository(ContentRepository contentRepository) { + this.contentRepository = contentRepository; + } + } diff --git a/org.argeo.app.servlet.odk/OSGI-INF/odkSubmissionServlet.xml b/org.argeo.app.servlet.odk/OSGI-INF/odkSubmissionServlet.xml index 40ed568..f2d312e 100644 --- a/org.argeo.app.servlet.odk/OSGI-INF/odkSubmissionServlet.xml +++ b/org.argeo.app.servlet.odk/OSGI-INF/odkSubmissionServlet.xml @@ -7,6 +7,6 @@ - + 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 3740805..3ef414b 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,8 +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.Session; import javax.jcr.nodetype.NodeType; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -22,18 +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.api.AppUserState; import org.argeo.app.image.ImageProcessor; -import org.argeo.app.jcr.SuiteJcrUtils; 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,10 +43,13 @@ 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"); @@ -60,21 +60,23 @@ public class OdkSubmissionServlet extends HttpServlet { // 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); - } +// Session adminSession = null; +// try { +// // TODO centralise at a deeper level +// adminSession = CmsJcrUtils.openDataAdminSession(repository, null); +// SuiteJcrUtils.getOrCreateCmsSessionNode(adminSession, cmsSession); +// } finally { +// Jcr.logout(adminSession); +// } try { - Node cmsSessionNode = SuiteJcrUtils.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()) { @@ -83,7 +85,7 @@ public class OdkSubmissionServlet extends HttpServlet { 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 { @@ -115,7 +117,7 @@ public class OdkSubmissionServlet extends HttpServlet { } } - session.save(); + cmsSessionNode.getSession().save(); try { for (FormSubmissionListener submissionListener : submissionListeners) { submissionListener.formSubmissionReceived(JcrContent.nodeToContent(submission)); @@ -123,7 +125,7 @@ public class OdkSubmissionServlet extends HttpServlet { } catch (Exception e) { log.error("Cannot save submision, cancelling...", e); submission.remove(); - session.save(); + cmsSessionNode.getSession().save(); resp.setStatus(503); return; } @@ -132,8 +134,8 @@ public class OdkSubmissionServlet extends HttpServlet { log.error("Cannot save submision", e); resp.setStatus(503); return; - } finally { - Jcr.logout(session); +// } finally { +// Jcr.logout(session); } resp.setStatus(201); @@ -142,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); @@ -153,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; + } + } diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtArgeoApp.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtArgeoApp.java index 816be08..42148df 100644 --- a/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtArgeoApp.java +++ b/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtArgeoApp.java @@ -251,7 +251,7 @@ public class SwtArgeoApp extends AbstractArgeoApp implements CmsEventSubscriber .get(Content.ROOT_PATH + CmsConstants.SYS_WORKSPACE + publicBasePath); ui.setUserDir(userDir); } else { - Content userDir = appUserState.getOrCreateSessionDir(contentSession, cmsSession); + Content userDir = appUserState.getOrCreateSessionDir(cmsSession); ui.setUserDir(userDir); // Node userDirNode = jcrContentProvider.doInAdminSession((adminSession) -> { // Node node = SuiteUtils.getOrCreateCmsSessionNode(adminSession, cmsSession); -- 2.30.2