From 750a3e154c078d6e9fd72d8da950cb325b8ab012 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 17 May 2022 13:54:58 +0200 Subject: [PATCH] Introduce content adapters for JCR --- .../src/org/argeo/cms/jcr/acr/JcrContent.java | 42 +++++++++++++++++-- .../src/org/argeo/api/acr/Content.java | 4 +- .../argeo/cms/acr/CmsContentRepository.java | 2 + sdk/cms-e4-rap.properties | 3 +- 4 files changed, 45 insertions(+), 6 deletions(-) diff --git a/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContent.java b/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContent.java index 6d274c60c..9f78577b5 100644 --- a/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContent.java +++ b/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContent.java @@ -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 adapt(Class 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 open(Class 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 { diff --git a/org.argeo.api.acr/src/org/argeo/api/acr/Content.java b/org.argeo.api.acr/src/org/argeo/api/acr/Content.java index edcfaea10..aeea27ef2 100644 --- a/org.argeo.api.acr/src/org/argeo/api/acr/Content.java +++ b/org.argeo.api.acr/src/org/argeo/api/acr/Content.java @@ -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, Map { throw new IllegalArgumentException("Cannot adapt content " + this + " to " + clss.getName()); } - default C open(Class clss) throws Exception, IllegalArgumentException { + default C open(Class clss) throws IOException, IllegalArgumentException { throw new IllegalArgumentException("Cannot open content " + this + " as " + clss.getName()); } diff --git a/org.argeo.cms/src/org/argeo/cms/acr/CmsContentRepository.java b/org.argeo.cms/src/org/argeo/cms/acr/CmsContentRepository.java index 6d17ea87d..923142c82 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/CmsContentRepository.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/CmsContentRepository.java @@ -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); } diff --git a/sdk/cms-e4-rap.properties b/sdk/cms-e4-rap.properties index a11ba7e1c..8181b8e7a 100644 --- a/sdk/cms-e4-rap.properties +++ b/sdk/cms-e4-rap.properties @@ -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 -- 2.30.2