Make ODK submission compatible with ACR
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 25 Jun 2023 09:47:07 +0000 (11:47 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 25 Jun 2023 09:47:07 +0000 (11:47 +0200)
org.argeo.app.api/src/org/argeo/app/api/AppUserState.java
org.argeo.app.jcr/.project
org.argeo.app.jcr/OSGI-INF/appUserState.xml
org.argeo.app.jcr/src/org/argeo/internal/app/jcr/AppUserStateImpl.java
org.argeo.app.servlet.odk/OSGI-INF/odkSubmissionServlet.xml
org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkSubmissionServlet.java
swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtArgeoApp.java

index 763fd31e9a7ee5befec1d1e4ad25db34b969198c..bcb0593896dc61f8fa3070940cf244c4cf1ca497 100644 (file)
@@ -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);
 }
index f688a62def4dc36debf4b3daec6feb47380cd8c1..f66d43970d76ad6d3cfb4d1a55c136c433ad351b 100644 (file)
                        <arguments>
                        </arguments>
                </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ds.core.builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
        </buildSpec>
        <natures>
                <nature>org.eclipse.pde.PluginNature</nature>
index 5dc205e93f23a03f04c3fce408fbd09ed8440d55..481884ef92ed2f869c3baa666cef6cea67b85e86 100644 (file)
@@ -5,4 +5,5 @@
       <provide interface="org.argeo.app.api.AppUserState"/>
    </service>
    <reference bind="setJcrContentProvider" cardinality="1..1" interface="org.argeo.cms.jcr.acr.JcrContentProvider" name="JcrContentProvider" policy="static"/>
+   <reference bind="setContentRepository" cardinality="1..1" interface="org.argeo.api.acr.ContentRepository" name="ContentRepository" policy="static"/>
 </scr:component>
index bb2bc15be622c3a0a0f091816564dc3c6ede38e4..5b481f73e0bab92cee791f12d6aab6941fb6c4cd 100644 (file)
@@ -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;
+       }
+
 }
index 40ed568e81c8a4818fd2a4ed1abdedf69dacc643..f2d312e80959e94a04df98e829b506b27e662544 100644 (file)
@@ -7,6 +7,6 @@
    <property name="osgi.http.whiteboard.servlet.pattern" type="String" value="/submission"/>
    <property name="osgi.http.whiteboard.context.select" type="String" value="(osgi.http.whiteboard.context.name=odkServletContext)"/>
    <property name="osgi.http.whiteboard.servlet.multipart.enabled" type="String" value="true"/>
-   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=ego)"/>
    <reference bind="addSubmissionListener" cardinality="0..n" interface="org.argeo.app.xforms.FormSubmissionListener" name="FormSubmissionListener" policy="dynamic" unbind="removeSubmissionListener"/>
+   <reference bind="setAppUserState" cardinality="1..1" interface="org.argeo.app.api.AppUserState" name="AppUserState" policy="static"/>
 </scr:component>
index 3740805f1216a7aff661f559f10a7cdd15e8b1d1..3ef414bdd658e3aee2a7775570a361293c6872ae 100644 (file)
@@ -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<FormSubmissionListener> 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;
+       }
+
 }
index 816be08b269b6c1f513171d2e41edd8c00ab939e..42148df57dd9507322eb8b074ff8d52ebfeaaaad 100644 (file)
@@ -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);