Introduce content adapters for JCR
authorMathieu Baudier <mbaudier@argeo.org>
Tue, 17 May 2022 11:54:58 +0000 (13:54 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Tue, 17 May 2022 11:54:58 +0000 (13:54 +0200)
jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContent.java
org.argeo.api.acr/src/org/argeo/api/acr/Content.java
org.argeo.cms/src/org/argeo/cms/acr/CmsContentRepository.java
sdk/cms-e4-rap.properties

index 6d274c60c039a0a00b8939035cef5d257b02fae2..9f78577b50b0095767c36cb44bd0557d570bc875 100644 (file)
@@ -1,5 +1,8 @@
 package org.argeo.cms.jcr.acr;
 
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
 import java.io.PipedInputStream;
 import java.io.PipedOutputStream;
 import java.util.ArrayList;
@@ -9,6 +12,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.ForkJoinPool;
 
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
@@ -20,6 +24,7 @@ import javax.jcr.Value;
 import javax.jcr.nodetype.NodeType;
 import javax.xml.namespace.QName;
 import javax.xml.transform.Source;
+import javax.xml.transform.stream.StreamSource;
 
 import org.argeo.api.acr.Content;
 import org.argeo.api.acr.NamespaceUtils;
@@ -27,6 +32,7 @@ import org.argeo.api.acr.spi.AbstractContent;
 import org.argeo.api.acr.spi.ProvidedSession;
 import org.argeo.jcr.Jcr;
 import org.argeo.jcr.JcrException;
+import org.argeo.jcr.JcrUtils;
 
 /** A JCR {@link Node} accessed as {@link Content}. */
 public class JcrContent extends AbstractContent {
@@ -214,12 +220,40 @@ public class JcrContent extends AbstractContent {
         */
        public <A> A adapt(Class<A> clss) {
                if (Source.class.isAssignableFrom(clss)) {
+//                     try {
                        PipedInputStream in = new PipedInputStream();
-                       PipedOutputStream out = new PipedOutputStream();
-               }
-//             provider.getJcrSession(session, jcrWorkspace).exportDocumentView(jcrPath, out, true, false);
 
-               return super.adapt(clss);
+                       ForkJoinPool.commonPool().execute(() -> {
+                               try (PipedOutputStream out = new PipedOutputStream(in)) {
+                                       provider.getJcrSession(session, jcrWorkspace).exportDocumentView(jcrPath, out, true, false);
+                                       out.flush();
+                               } catch (IOException | RepositoryException e) {
+                                       throw new RuntimeException("Cannot export " + jcrPath + " in workspace " + jcrWorkspace, e);
+                               }
+
+                       });
+                       return (A) new StreamSource(in);
+//                     } catch (IOException e) {
+//                             throw new RuntimeException("Cannot adapt " + JcrContent.this + " to " + clss, e);
+//                     }
+               } else
+
+                       return super.adapt(clss);
+       }
+
+       @Override
+       public <C extends Closeable> C open(Class<C> clss) throws IOException, IllegalArgumentException {
+               if (InputStream.class.isAssignableFrom(clss)) {
+                       Node node = getJcrNode();
+                       if (Jcr.isNodeType(node, NodeType.NT_FILE)) {
+                               try {
+                                       return (C) JcrUtils.getFileAsStream(node);
+                               } catch (RepositoryException e) {
+                                       throw new JcrException("Cannot open " + jcrPath + " in workspace " + jcrWorkspace, e);
+                               }
+                       }
+               }
+               return super.open(clss);
        }
 
 //     class JcrKeyIterator implements Iterator<QName> {
index edcfaea10de9199dd9b6ffb128216766578c60c2..aeea27ef23ff272b2bb0fb0bf4a95c8c65336e1b 100644 (file)
@@ -1,5 +1,7 @@
 package org.argeo.api.acr;
 
+import java.io.Closeable;
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -85,7 +87,7 @@ public interface Content extends Iterable<Content>, Map<QName, Object> {
                throw new IllegalArgumentException("Cannot adapt content " + this + " to " + clss.getName());
        }
 
-       default <C extends AutoCloseable> C open(Class<C> clss) throws Exception, IllegalArgumentException {
+       default <C extends Closeable> C open(Class<C> clss) throws IOException, IllegalArgumentException {
                throw new IllegalArgumentException("Cannot open content " + this + " as " + clss.getName());
        }
 
index 6d17ea87dd4d6fc463e01cfcee3f75ca0c061549..923142c82333ec02d7d566cb3a9503065c2d5c93 100644 (file)
@@ -243,6 +243,8 @@ public class CmsContentRepository implements ProvidedRepository {
                        String mountPath = entry.getKey();
                        ContentProvider provider = entry.getValue();
                        String relativePath = path.substring(mountPath.length());
+                       if (relativePath.length() > 0 && relativePath.charAt(0) == '/')
+                               relativePath = relativePath.substring(1);
                        return provider.get(CmsContentSession.this, mountPath, relativePath);
                }
 
index a11ba7e1c82510383fac2274cfffda099d41ff97..8181b8e7ae31c28d3bb2e74aa838120033303633 100644 (file)
@@ -66,4 +66,5 @@ com.sun.jndi.ldap.sasl,\
 com.sun.security.jgss,\
 com.sun.jndi.dns,\
 com.sun.nio.file,\
-com.sun.nio.sctp
+com.sun.nio.sctp,\
+sun.nio.cs
\ No newline at end of file