Make ACR content providers more configurable
authorMathieu Baudier <mbaudier@argeo.org>
Fri, 12 Aug 2022 05:29:28 +0000 (07:29 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Fri, 12 Aug 2022 05:29:28 +0000 (07:29 +0200)
jcr/org.argeo.cms.jcr/bnd.bnd
jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java
org.argeo.api.cms/src/org/argeo/api/cms/CmsConstants.java
org.argeo.cms.lib.jetty/src/org/argeo/cms/jetty/JettyHttpServer.java
org.argeo.cms/src/org/argeo/cms/acr/fs/FsContent.java
org.argeo.cms/src/org/argeo/cms/acr/fs/FsContentProvider.java
org.argeo.cms/src/org/argeo/cms/acr/fs/FsContentProviderService.java [new file with mode: 0644]

index b53745a6a4847564febc422b0d5ddff0127ab22e..01446c1d0137dbf2a8ad43aac6fd1c358c27bc04 100644 (file)
@@ -38,4 +38,3 @@ OSGI-INF/jcrServletContext.xml,\
 OSGI-INF/dataServletContext.xml,\
 OSGI-INF/filesServletContext.xml,\
 OSGI-INF/filesServlet.xml,\
-OSGI-INF/jcrContentProvider.xml
index 7f471c9b0d656a694482076df38872fb95de098d..08f0ee12fa48a36ed061bd33314d29cd565d8336 100644 (file)
@@ -16,6 +16,7 @@ import org.argeo.api.acr.Content;
 import org.argeo.api.acr.spi.ContentProvider;
 import org.argeo.api.acr.spi.ProvidedContent;
 import org.argeo.api.acr.spi.ProvidedSession;
+import org.argeo.api.cms.CmsConstants;
 import org.argeo.cms.acr.ContentUtils;
 import org.argeo.cms.jcr.CmsJcrUtils;
 import org.argeo.jcr.JcrException;
@@ -23,7 +24,6 @@ import org.argeo.jcr.JcrUtils;
 
 /** A JCR workspace accessed as an {@link ContentProvider}. */
 public class JcrContentProvider implements ContentProvider, NamespaceContext {
-       public final static String ACR_MOUNT_PATH_PROPERTY = "acr.mount.path";
 
        private Repository jcrRepository;
        private Session adminSession;
@@ -33,7 +33,7 @@ public class JcrContentProvider implements ContentProvider, NamespaceContext {
        private Map<ProvidedSession, JcrSessionAdapter> sessionAdapters = Collections.synchronizedMap(new HashMap<>());
 
        public void start(Map<String, String> properties) {
-               mountPath = properties.get(ACR_MOUNT_PATH_PROPERTY);
+               mountPath = properties.get(CmsConstants.ACR_MOUNT_PATH);
                if ("/".equals(mountPath))
                        throw new IllegalArgumentException("JCR content provider cannot be root /");
                Objects.requireNonNull(mountPath);
index 34d85a252cd8eb09c8e8875a34260257b15c0f6b..5b005deca0c1a2df317654b641e70a73475fac0c 100644 (file)
@@ -85,6 +85,8 @@ public interface CmsConstants {
        String CONTEXT_PATH = "context.path";
        String CONTEXT_PUBLIC = "context.public";
        String EVENT_TOPICS = "event.topics";
+       String ACR_MOUNT_PATH = "acr.mount.path";
+
 
        /*
         * FILE SYSTEM
index e414f5f984f3053dfc54ac3278069d0314cf83a0..80cff8b012bba5e5f55b56dd9a9fcd2e5924eac3 100644 (file)
@@ -112,6 +112,17 @@ public class JettyHttpServer extends HttpsServer {
                        server.start();
                        //
 
+                       // Addresses
+                       String httpHost = getDeployProperty(CmsDeployProperty.HOST);
+                       String fallBackHostname = cmsState != null ? cmsState.getHostname() : "::1";
+                       if (httpConnector != null)
+                               httpAddress = new InetSocketAddress(httpHost != null ? httpHost : fallBackHostname,
+                                               httpConnector.getLocalPort());
+                       if (httpsConnector != null)
+                               httpsAddress = new InetSocketAddress(httpHost != null ? httpHost : fallBackHostname,
+                                               httpsConnector.getLocalPort());
+
+                       // Clean up
                        Runtime.getRuntime().addShutdownHook(new Thread(() -> stop(), "Jetty shutdown"));
 
                        log.info(httpPortsMsg());
@@ -214,7 +225,6 @@ public class JettyHttpServer extends HttpsServer {
                if (httpPortStr != null || httpsPortStr != null) {
                        // TODO deal with hostname resolving taking too much time
 //                     String fallBackHostname = InetAddress.getLocalHost().getHostName();
-                       String fallBackHostname = cmsState != null ? cmsState.getHostname() : "::1";
 
                        boolean httpEnabled = httpPortStr != null;
                        // props.put(JettyHttpConstants.HTTP_ENABLED, httpEnabled);
@@ -233,7 +243,6 @@ public class JettyHttpServer extends HttpsServer {
                                httpConnector.setHost(httpHost);
                                httpConnector.setIdleTimeout(DEFAULT_IDLE_TIMEOUT);
 
-                               httpAddress = new InetSocketAddress(httpHost != null ? httpHost : fallBackHostname, httpPort);
                        }
 
                        if (httpsEnabled) {
@@ -269,8 +278,6 @@ public class JettyHttpServer extends HttpsServer {
                                int httpsPort = Integer.parseInt(httpsPortStr);
                                httpsConnector.setPort(httpsPort);
                                httpsConnector.setHost(httpHost);
-
-                               httpsAddress = new InetSocketAddress(httpHost != null ? httpHost : fallBackHostname, httpsPort);
                        }
 
                }
index 15917c50359a003affc0b2d853e444a483526019..76dc9da71d65bf95053679e2d99cf6e969623f69 100644 (file)
@@ -56,16 +56,16 @@ public class FsContent extends AbstractContent implements ProvidedContent {
 
        private final FsContentProvider provider;
        private final Path path;
-       private final boolean isRoot;
+       private final boolean isMountBase;
        private final QName name;
 
        protected FsContent(ProvidedSession session, FsContentProvider contentProvider, Path path) {
                super(session);
                this.provider = contentProvider;
                this.path = path;
-               this.isRoot = contentProvider.isMountRoot(path);
+               this.isMountBase = contentProvider.isMountBase(path);
                // TODO check file names with ':' ?
-               if (isRoot) {
+               if (isMountBase) {
                        String mountPath = provider.getMountPath();
                        if (mountPath != null && !mountPath.equals("/")) {
                                Content mountPoint = session.getMountPoint(mountPath);
@@ -265,7 +265,7 @@ public class FsContent extends AbstractContent implements ProvidedContent {
 
        @Override
        public Content getParent() {
-               if (isRoot) {
+               if (isMountBase) {
                        String mountPath = provider.getMountPath();
                        if (mountPath == null || mountPath.equals("/"))
                                return null;
index 9d696b07f1cbcf6609f50c29017576250af228f0..1b5741431145663d55e871141c0191287fa4a1ce 100644 (file)
@@ -24,9 +24,8 @@ import org.argeo.api.acr.spi.ProvidedSession;
 public class FsContentProvider implements ContentProvider {
        final static String XMLNS_ = "xmlns:";
 
-       private final String mountPath;
-       private final Path rootPath;
-//     private final boolean isRoot;
+       protected String mountPath;
+       protected Path rootPath;
 
        private NavigableMap<String, String> prefixes = new TreeMap<>();
 
@@ -40,15 +39,11 @@ public class FsContentProvider implements ContentProvider {
                initNamespaces();
        }
 
-//     @Deprecated
-//     public FsContentProvider(String mountPath, Path rootPath, boolean isRoot) {
-//             this.mountPath = mountPath;
-//             this.rootPath = rootPath;
-////           this.isRoot = isRoot;
-////           initNamespaces();
-//     }
+       protected FsContentProvider() {
 
-       private void initNamespaces() {
+       }
+
+       protected void initNamespaces() {
                try {
                        UserDefinedFileAttributeView udfav = Files.getFileAttributeView(rootPath,
                                        UserDefinedFileAttributeView.class);
@@ -103,7 +98,7 @@ public class FsContentProvider implements ContentProvider {
                return mountPath;
        }
 
-       boolean isMountRoot(Path path) {
+       boolean isMountBase(Path path) {
                try {
                        return Files.isSameFile(rootPath, path);
                } catch (IOException e) {
diff --git a/org.argeo.cms/src/org/argeo/cms/acr/fs/FsContentProviderService.java b/org.argeo.cms/src/org/argeo/cms/acr/fs/FsContentProviderService.java
new file mode 100644 (file)
index 0000000..4e986f6
--- /dev/null
@@ -0,0 +1,39 @@
+package org.argeo.cms.acr.fs;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.Map;
+import java.util.Objects;
+
+import org.argeo.api.cms.CmsConstants;
+import org.argeo.api.cms.CmsState;
+
+public class FsContentProviderService extends FsContentProvider {
+       private CmsState cmsState;
+
+       public void start(Map<String, String> properties) {
+               mountPath = properties.get(CmsConstants.ACR_MOUNT_PATH);
+               Objects.requireNonNull(mountPath);
+               if (!mountPath.startsWith("/"))
+                       throw new IllegalArgumentException("Mount path must start with /");
+
+               String relPath = mountPath.substring(1);
+               rootPath = cmsState.getDataPath(relPath);
+               try {
+                       Files.createDirectories(rootPath);
+               } catch (IOException e) {
+                       throw new IllegalStateException(
+                                       "Cannot initialize FS content provider " + mountPath + " with base" + rootPath, e);
+               }
+
+               initNamespaces();
+       }
+
+       public void stop() {
+       }
+
+       public void setCmsState(CmsState cmsState) {
+               this.cmsState = cmsState;
+       }
+
+}