From 00fec502abb8eeccb813fe33d5e9ba53436b44d6 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Fri, 12 Aug 2022 07:29:28 +0200 Subject: [PATCH] Make ACR content providers more configurable --- jcr/org.argeo.cms.jcr/bnd.bnd | 1 - .../argeo/cms/jcr/acr/JcrContentProvider.java | 4 +- .../src/org/argeo/api/cms/CmsConstants.java | 2 + .../org/argeo/cms/jetty/JettyHttpServer.java | 15 +++++-- .../src/org/argeo/cms/acr/fs/FsContent.java | 8 ++-- .../argeo/cms/acr/fs/FsContentProvider.java | 19 ++++----- .../cms/acr/fs/FsContentProviderService.java | 39 +++++++++++++++++++ 7 files changed, 65 insertions(+), 23 deletions(-) create mode 100644 org.argeo.cms/src/org/argeo/cms/acr/fs/FsContentProviderService.java diff --git a/jcr/org.argeo.cms.jcr/bnd.bnd b/jcr/org.argeo.cms.jcr/bnd.bnd index b53745a6a..01446c1d0 100644 --- a/jcr/org.argeo.cms.jcr/bnd.bnd +++ b/jcr/org.argeo.cms.jcr/bnd.bnd @@ -38,4 +38,3 @@ OSGI-INF/jcrServletContext.xml,\ OSGI-INF/dataServletContext.xml,\ OSGI-INF/filesServletContext.xml,\ OSGI-INF/filesServlet.xml,\ -OSGI-INF/jcrContentProvider.xml diff --git a/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java b/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java index 7f471c9b0..08f0ee12f 100644 --- a/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java +++ b/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java @@ -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 sessionAdapters = Collections.synchronizedMap(new HashMap<>()); public void start(Map 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); diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/CmsConstants.java b/org.argeo.api.cms/src/org/argeo/api/cms/CmsConstants.java index 34d85a252..5b005deca 100644 --- a/org.argeo.api.cms/src/org/argeo/api/cms/CmsConstants.java +++ b/org.argeo.api.cms/src/org/argeo/api/cms/CmsConstants.java @@ -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 diff --git a/org.argeo.cms.lib.jetty/src/org/argeo/cms/jetty/JettyHttpServer.java b/org.argeo.cms.lib.jetty/src/org/argeo/cms/jetty/JettyHttpServer.java index e414f5f98..80cff8b01 100644 --- a/org.argeo.cms.lib.jetty/src/org/argeo/cms/jetty/JettyHttpServer.java +++ b/org.argeo.cms.lib.jetty/src/org/argeo/cms/jetty/JettyHttpServer.java @@ -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); } } diff --git a/org.argeo.cms/src/org/argeo/cms/acr/fs/FsContent.java b/org.argeo.cms/src/org/argeo/cms/acr/fs/FsContent.java index 15917c503..76dc9da71 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/fs/FsContent.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/fs/FsContent.java @@ -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; diff --git a/org.argeo.cms/src/org/argeo/cms/acr/fs/FsContentProvider.java b/org.argeo.cms/src/org/argeo/cms/acr/fs/FsContentProvider.java index 9d696b07f..1b5741431 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/fs/FsContentProvider.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/fs/FsContentProvider.java @@ -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 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 index 000000000..4e986f6f2 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/acr/fs/FsContentProviderService.java @@ -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 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; + } + +} -- 2.30.2