From 0ffddd13968b41b26caddfcf17b3dc86a58eb776 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 11 Jan 2022 06:09:35 +0100 Subject: [PATCH] Components-based JCR configuration. --- org.argeo.cms.jcr/OSGI-INF/jcrFsProvider.xml | 10 ++++++ .../OSGI-INF/jcrRepositoryFactory.xml | 8 +++++ .../OSGI-INF/repositoryContextsFactory.xml | 9 +++++ org.argeo.cms.jcr/bnd.bnd | 3 ++ org.argeo.cms.jcr/build.properties | 5 ++- ...sFsProvider.java => CmsJcrFsProvider.java} | 31 +++++++++++------ ...Factory.java => JcrRepositoryFactory.java} | 2 +- ...ry.java => RepositoryContextsFactory.java} | 34 +++++++++++-------- .../jcr/internal/osgi/CmsJcrActivator.java | 34 +++++++------------ org.argeo.cms/OSGI-INF/deployConfig.xml | 1 + org.argeo.cms/OSGI-INF/nodeUserAdmin.xml | 1 + .../cms/internal/runtime/CmsStateImpl.java | 29 ++++++++-------- .../cms/internal/runtime/KernelConstants.java | 4 +-- .../init/logging/ThinJavaUtilLogging.java | 3 +- .../org/argeo/init/logging/ThinLogging.java | 8 +++-- 15 files changed, 112 insertions(+), 70 deletions(-) create mode 100644 org.argeo.cms.jcr/OSGI-INF/jcrFsProvider.xml create mode 100644 org.argeo.cms.jcr/OSGI-INF/jcrRepositoryFactory.xml create mode 100644 org.argeo.cms.jcr/OSGI-INF/repositoryContextsFactory.xml rename org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/{CmsFsProvider.java => CmsJcrFsProvider.java} (81%) rename org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/{NodeRepositoryFactory.java => JcrRepositoryFactory.java} (99%) rename org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/{RepositoryServiceFactory.java => RepositoryContextsFactory.java} (95%) diff --git a/org.argeo.cms.jcr/OSGI-INF/jcrFsProvider.xml b/org.argeo.cms.jcr/OSGI-INF/jcrFsProvider.xml new file mode 100644 index 000000000..e26453b06 --- /dev/null +++ b/org.argeo.cms.jcr/OSGI-INF/jcrFsProvider.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/org.argeo.cms.jcr/OSGI-INF/jcrRepositoryFactory.xml b/org.argeo.cms.jcr/OSGI-INF/jcrRepositoryFactory.xml new file mode 100644 index 000000000..b43b51920 --- /dev/null +++ b/org.argeo.cms.jcr/OSGI-INF/jcrRepositoryFactory.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/org.argeo.cms.jcr/OSGI-INF/repositoryContextsFactory.xml b/org.argeo.cms.jcr/OSGI-INF/repositoryContextsFactory.xml new file mode 100644 index 000000000..db2bfaa26 --- /dev/null +++ b/org.argeo.cms.jcr/OSGI-INF/repositoryContextsFactory.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/org.argeo.cms.jcr/bnd.bnd b/org.argeo.cms.jcr/bnd.bnd index 761c950e5..71071f697 100644 --- a/org.argeo.cms.jcr/bnd.bnd +++ b/org.argeo.cms.jcr/bnd.bnd @@ -27,6 +27,9 @@ junit.*;resolution:=optional,\ * Service-Component:\ +OSGI-INF/repositoryContextsFactory.xml,\ +OSGI-INF/jcrRepositoryFactory.xml,\ +OSGI-INF/jcrFsProvider.xml,\ OSGI-INF/jcrDeployment.xml,\ OSGI-INF/jcrServletContext.xml,\ OSGI-INF/dataServletContext.xml,\ diff --git a/org.argeo.cms.jcr/build.properties b/org.argeo.cms.jcr/build.properties index 9ef2d5d06..3ddcf97c6 100644 --- a/org.argeo.cms.jcr/build.properties +++ b/org.argeo.cms.jcr/build.properties @@ -1,7 +1,10 @@ output.. = bin/ bin.includes = META-INF/,\ .,\ - OSGI-INF/jcrDeployment.xml + OSGI-INF/jcrDeployment.xml,\ + OSGI-INF/repositoryContextsFactory.xml,\ + OSGI-INF/jcrRepositoryFactory.xml,\ + OSGI-INF/jcrFsProvider.xml source.. = src/ additional.bundles = org.apache.jackrabbit.core,\ javax.jcr,\ diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsFsProvider.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsJcrFsProvider.java similarity index 81% rename from org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsFsProvider.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsJcrFsProvider.java index 50ef25e9a..0099b3bed 100644 --- a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsFsProvider.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsJcrFsProvider.java @@ -25,14 +25,14 @@ import org.argeo.jackrabbit.fs.AbstractJackrabbitFsProvider; import org.argeo.jcr.fs.JcrFileSystem; import org.argeo.jcr.fs.JcrFileSystemProvider; import org.argeo.jcr.fs.JcrFsException; -import org.osgi.framework.BundleContext; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.InvalidSyntaxException; /** Implementation of an {@link FileSystemProvider} based on Jackrabbit. */ -public class CmsFsProvider extends AbstractJackrabbitFsProvider { +public class CmsJcrFsProvider extends AbstractJackrabbitFsProvider { private Map fileSystems = new HashMap<>(); + private RepositoryFactory repositoryFactory; + private Repository repository; + @Override public String getScheme() { return CmsConstants.SCHEME_NODE; @@ -40,7 +40,7 @@ public class CmsFsProvider extends AbstractJackrabbitFsProvider { @Override public FileSystem newFileSystem(URI uri, Map env) throws IOException { - BundleContext bc = FrameworkUtil.getBundle(CmsFsProvider.class).getBundleContext(); +// BundleContext bc = FrameworkUtil.getBundle(CmsJcrFsProvider.class).getBundleContext(); String username = CurrentUser.getUsername(); if (username == null) { // TODO deal with anonymous @@ -53,21 +53,22 @@ public class CmsFsProvider extends AbstractJackrabbitFsProvider { String host = uri.getHost(); if (host != null && !host.trim().equals("")) { URI repoUri = new URI("http", uri.getUserInfo(), uri.getHost(), uri.getPort(), "/jcr/node", null, null); - RepositoryFactory repositoryFactory = bc.getService(bc.getServiceReference(RepositoryFactory.class)); +// RepositoryFactory repositoryFactory = bc.getService(bc.getServiceReference(RepositoryFactory.class)); Repository repository = CmsJcrUtils.getRepositoryByUri(repositoryFactory, repoUri.toString()); CmsFileSystem fileSystem = new CmsFileSystem(this, repository); fileSystems.put(username, fileSystem); return fileSystem; } else { - Repository repository = bc.getService( - bc.getServiceReferences(Repository.class, "(cn=" + CmsConstants.EGO_REPOSITORY + ")") - .iterator().next()); -// Session session = repository.login(); +// Repository repository = bc.getService( +// bc.getServiceReferences(Repository.class, "(cn=" + CmsConstants.EGO_REPOSITORY + ")") +// .iterator().next()); + + // Session session = repository.login(); CmsFileSystem fileSystem = new CmsFileSystem(this, repository); fileSystems.put(username, fileSystem); return fileSystem; } - } catch (InvalidSyntaxException | URISyntaxException e) { + } catch (URISyntaxException e) { throw new IllegalArgumentException("Cannot open file system " + uri + " for user " + username, e); } } @@ -104,6 +105,14 @@ public class CmsFsProvider extends AbstractJackrabbitFsProvider { } } + public void setRepositoryFactory(RepositoryFactory repositoryFactory) { + this.repositoryFactory = repositoryFactory; + } + + public void setRepository(Repository repository) { + this.repository = repository; + } + static class CmsFileSystem extends JcrFileSystem { public CmsFileSystem(JcrFileSystemProvider provider, Repository repository) throws IOException { super(provider, repository); diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/NodeRepositoryFactory.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/JcrRepositoryFactory.java similarity index 99% rename from org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/NodeRepositoryFactory.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/JcrRepositoryFactory.java index a4ab7cb23..342c1add7 100644 --- a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/NodeRepositoryFactory.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/JcrRepositoryFactory.java @@ -23,7 +23,7 @@ import org.osgi.framework.ServiceReference; * OSGi-aware Jackrabbit repository factory which can retrieve/publish * {@link Repository} as OSGi services. */ -public class NodeRepositoryFactory implements RepositoryFactory { +public class JcrRepositoryFactory implements RepositoryFactory { private final CmsLog log = CmsLog.getLog(getClass()); // private final BundleContext bundleContext = FrameworkUtil.getBundle(getClass()).getBundleContext(); diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/RepositoryServiceFactory.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/RepositoryContextsFactory.java similarity index 95% rename from org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/RepositoryServiceFactory.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/RepositoryContextsFactory.java index 042ddb5d5..1a1fda1f0 100644 --- a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/RepositoryServiceFactory.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/RepositoryContextsFactory.java @@ -20,12 +20,30 @@ import org.osgi.service.cm.ConfigurationException; import org.osgi.service.cm.ManagedServiceFactory; /** A {@link ManagedServiceFactory} creating or referencing JCR repositories. */ -public class RepositoryServiceFactory implements ManagedServiceFactory { - private final static CmsLog log = CmsLog.getLog(RepositoryServiceFactory.class); +public class RepositoryContextsFactory implements ManagedServiceFactory { + private final static CmsLog log = CmsLog.getLog(RepositoryContextsFactory.class); // private final BundleContext bc = FrameworkUtil.getBundle(RepositoryServiceFactory.class).getBundleContext(); private Map repositories = new HashMap(); private Map pidToCn = new HashMap(); + + public void init() { + + } + + public void destroy() { + for (String pid : repositories.keySet()) { + try { + repositories.get(pid).getRepository().shutdown(); + if (log.isDebugEnabled()) + log.debug("Shut down repository " + pid + + (pidToCn.containsKey(pid) ? " (" + pidToCn.get(pid) + ")" : "")); + } catch (Exception e) { + log.error("Error when shutting down Jackrabbit repository " + pid, e); + } + } + } + @Override public String getName() { @@ -114,17 +132,5 @@ public class RepositoryServiceFactory implements ManagedServiceFactory { log.debug("Deleted repository " + pid); } - public void shutdown() { - for (String pid : repositories.keySet()) { - try { - repositories.get(pid).getRepository().shutdown(); - if (log.isDebugEnabled()) - log.debug("Shut down repository " + pid - + (pidToCn.containsKey(pid) ? " (" + pidToCn.get(pid) + ")" : "")); - } catch (Exception e) { - log.error("Error when shutting down Jackrabbit repository " + pid, e); - } - } - } } diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/osgi/CmsJcrActivator.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/osgi/CmsJcrActivator.java index 7332fde29..57860d84f 100644 --- a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/osgi/CmsJcrActivator.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/osgi/CmsJcrActivator.java @@ -1,20 +1,10 @@ package org.argeo.cms.jcr.internal.osgi; -import java.nio.file.spi.FileSystemProvider; import java.util.Dictionary; -import javax.jcr.RepositoryFactory; - -import org.argeo.api.cms.CmsConstants; -import org.argeo.cms.jcr.internal.CmsFsProvider; -import org.argeo.cms.jcr.internal.NodeRepositoryFactory; -import org.argeo.cms.jcr.internal.RepositoryServiceFactory; import org.argeo.cms.jcr.internal.StatisticsThread; -import org.argeo.util.LangUtils; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; -import org.osgi.framework.Constants; -import org.osgi.service.cm.ManagedServiceFactory; public class CmsJcrActivator implements BundleActivator { private static BundleContext bundleContext; @@ -22,7 +12,7 @@ public class CmsJcrActivator implements BundleActivator { // private List stopHooks = new ArrayList<>(); private StatisticsThread kernelThread; - private RepositoryServiceFactory repositoryServiceFactory; +// private JackrabbitRepositoryContextsFactory repositoryServiceFactory; // private CmsJcrDeployment jcrDeployment; @Override @@ -35,16 +25,16 @@ public class CmsJcrActivator implements BundleActivator { kernelThread.start(); // JCR - repositoryServiceFactory = new RepositoryServiceFactory(); -// stopHooks.add(() -> repositoryServiceFactory.shutdown()); - registerService(ManagedServiceFactory.class, repositoryServiceFactory, - LangUtils.dict(Constants.SERVICE_PID, CmsConstants.NODE_REPOS_FACTORY_PID)); +// repositoryServiceFactory = new JackrabbitRepositoryContextsFactory(); +//// stopHooks.add(() -> repositoryServiceFactory.shutdown()); +// registerService(ManagedServiceFactory.class, repositoryServiceFactory, +// LangUtils.dict(Constants.SERVICE_PID, CmsConstants.NODE_REPOS_FACTORY_PID)); - NodeRepositoryFactory repositoryFactory = new NodeRepositoryFactory(); - registerService(RepositoryFactory.class, repositoryFactory, null); +// JcrRepositoryFactory repositoryFactory = new JcrRepositoryFactory(); +// registerService(RepositoryFactory.class, repositoryFactory, null); // File System - CmsFsProvider cmsFsProvider = new CmsFsProvider(); +// CmsJcrFsProvider cmsFsProvider = new CmsJcrFsProvider(); // ServiceLoader fspSl = ServiceLoader.load(FileSystemProvider.class); // for (FileSystemProvider fsp : fspSl) { // log.debug("FileSystemProvider " + fsp); @@ -55,8 +45,8 @@ public class CmsJcrActivator implements BundleActivator { // for (FileSystemProvider fsp : FileSystemProvider.installedProviders()) { // log.debug("Installed FileSystemProvider " + fsp); // } - registerService(FileSystemProvider.class, cmsFsProvider, - LangUtils.dict(Constants.SERVICE_PID, CmsConstants.NODE_FS_PROVIDER_PID)); +// registerService(FileSystemProvider.class, cmsFsProvider, +// LangUtils.dict(Constants.SERVICE_PID, CmsConstants.NODE_FS_PROVIDER_PID)); // jcrDeployment = new CmsJcrDeployment(); // jcrDeployment.init(); @@ -67,8 +57,8 @@ public class CmsJcrActivator implements BundleActivator { // if (jcrDeployment != null) // jcrDeployment.destroy(); - if (repositoryServiceFactory != null) - repositoryServiceFactory.shutdown(); +// if (repositoryServiceFactory != null) +// repositoryServiceFactory.shutdown(); if (kernelThread != null) kernelThread.destroyAndJoin(); diff --git a/org.argeo.cms/OSGI-INF/deployConfig.xml b/org.argeo.cms/OSGI-INF/deployConfig.xml index 10fcb547f..85b309021 100644 --- a/org.argeo.cms/OSGI-INF/deployConfig.xml +++ b/org.argeo.cms/OSGI-INF/deployConfig.xml @@ -5,4 +5,5 @@ + diff --git a/org.argeo.cms/OSGI-INF/nodeUserAdmin.xml b/org.argeo.cms/OSGI-INF/nodeUserAdmin.xml index 7becce748..f86eba632 100644 --- a/org.argeo.cms/OSGI-INF/nodeUserAdmin.xml +++ b/org.argeo.cms/OSGI-INF/nodeUserAdmin.xml @@ -7,4 +7,5 @@ + diff --git a/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsStateImpl.java b/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsStateImpl.java index 7b47b520d..cf203e5e6 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsStateImpl.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsStateImpl.java @@ -28,7 +28,6 @@ public class CmsStateImpl implements CmsState { // REFERENCES private Long availableSince; - // private ThreadGroup threadGroup = new ThreadGroup("CMS"); private List stopHooks = new ArrayList<>(); @@ -49,27 +48,27 @@ public class CmsStateImpl implements CmsState { if (log.isTraceEnabled()) log.trace("CMS State started"); - } catch (Throwable e) { - log.error("## FATAL: CMS activator failed", e); - } - this.stateUuid = KernelUtils.getFrameworkProp(Constants.FRAMEWORK_UUID); + this.stateUuid = KernelUtils.getFrameworkProp(Constants.FRAMEWORK_UUID); // this.cleanState = stateUuid.equals(frameworkUuid); - try { - this.hostname = InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException e) { - log.error("Cannot set hostname: " + e); - } + try { + this.hostname = InetAddress.getLocalHost().getHostName(); + } catch (UnknownHostException e) { + log.error("Cannot set hostname: " + e); + } - availableSince = System.currentTimeMillis(); - if (log.isDebugEnabled()) - // log.debug("## CMS starting... stateUuid=" + this.stateUuid + (cleanState ? " - // (clean state) " : " ")); - log.debug("## CMS starting... (" + stateUuid + ")"); + availableSince = System.currentTimeMillis(); + if (log.isDebugEnabled()) + // log.debug("## CMS starting... stateUuid=" + this.stateUuid + (cleanState ? " + // (clean state) " : " ")); + log.debug("## CMS starting... (" + stateUuid + ")"); // initI18n(); // initServices(); + } catch (RuntimeException e) { + log.error("## FATAL: CMS activator failed", e); + } } private void initSecurity() { diff --git a/org.argeo.cms/src/org/argeo/cms/internal/runtime/KernelConstants.java b/org.argeo.cms/src/org/argeo/cms/internal/runtime/KernelConstants.java index 7c397de6c..d491a6623 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/runtime/KernelConstants.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/runtime/KernelConstants.java @@ -18,8 +18,8 @@ public interface KernelConstants { String NODE_KEY_TAB_PATH = DIR_NODE + "/krb5.keytab"; // Security - String JAAS_CONFIG = "/org/argeo/cms/internal/kernel/jaas.cfg"; - String JAAS_CONFIG_IPA = "/org/argeo/cms/internal/kernel/jaas-ipa.cfg"; + String JAAS_CONFIG = "/org/argeo/cms/internal/runtime/jaas.cfg"; + String JAAS_CONFIG_IPA = "/org/argeo/cms/internal/runtime/jaas-ipa.cfg"; // Java String JAAS_CONFIG_PROP = "java.security.auth.login.config"; diff --git a/org.argeo.init/src/org/argeo/init/logging/ThinJavaUtilLogging.java b/org.argeo.init/src/org/argeo/init/logging/ThinJavaUtilLogging.java index f1143d670..1bfab8e92 100644 --- a/org.argeo.init/src/org/argeo/init/logging/ThinJavaUtilLogging.java +++ b/org.argeo.init/src/org/argeo/init/logging/ThinJavaUtilLogging.java @@ -91,7 +91,8 @@ class ThinJavaUtilLogging { @Override public void publish(LogRecord record) { java.lang.System.Logger systemLogger = ThinLoggerFinder.getLogger(record.getLoggerName()); - systemLogger.log(ThinJavaUtilLogging.fromJulLevel(record.getLevel()), record.getMessage()); + systemLogger.log(ThinJavaUtilLogging.fromJulLevel(record.getLevel()), record.getMessage(), + record.getThrown()); } @Override diff --git a/org.argeo.init/src/org/argeo/init/logging/ThinLogging.java b/org.argeo.init/src/org/argeo/init/logging/ThinLogging.java index 9866a1f23..871dc8d7f 100644 --- a/org.argeo.init/src/org/argeo/init/logging/ThinLogging.java +++ b/org.argeo.init/src/org/argeo/init/logging/ThinLogging.java @@ -216,7 +216,7 @@ class ThinLogging implements Consumer> { /* * INTERNAL CLASSES */ - + private class ThinLogger implements System.Logger { private final String name; @@ -297,9 +297,10 @@ class ThinLogging implements Consumer> { case "java.util.logging.Logger": case "org.apache.commons.logging.Log": case "org.osgi.service.log.Logger": - case "org.argeo.cms.Log": + case "org.argeo.api.cms.CmsLog": case "org.slf4j.impl.ArgeoLogger": case "org.eclipse.jetty.util.log.Slf4jLog": + case "sun.util.logging.internal.LoggingProviderImpl$JULWrapper": lowestLoggerInterface = i; continue stack; default: @@ -519,12 +520,13 @@ class ThinLogging implements Consumer> { sb.append('\n'); for (StackTraceElement ste : throwable.getStackTrace()) { sb.append(prefix); + sb.append('\t'); sb.append(ste.toString()); sb.append('\n'); } if (throwable.getCause() != null) { sb.append(prefix); - sb.append("caused by "); + sb.append("Caused by: "); addThrowable(sb, prefix, throwable.getCause()); } } -- 2.30.2