From 6862cee138ca8ed2bbf6427b20b389a56b5df32f Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Fri, 14 Jan 2022 08:07:23 +0100 Subject: [PATCH] Adapt after Argeo Suite refactoring. --- .../OSGI-INF/dataServletContext.xml | 2 +- .../OSGI-INF/filesServletContext.xml | 2 +- org.argeo.cms.jcr/OSGI-INF/jcrDeployment.xml | 2 +- .../OSGI-INF/jcrServletContext.xml | 2 +- .../cms/jcr/internal/CmsJcrDeployment.java | 10 ++-- .../argeo/cms/jcr/internal/DataModels.java | 3 +- .../internal/RepositoryContextsFactory.java | 12 +++-- .../internal/servlet/DataServletContext.java | 8 ++++ .../internal/servlet/JcrServletContext.java | 8 ++++ org.argeo.cms.servlet/OSGI-INF/pkgServlet.xml | 2 +- .../argeo/cms/servlet/CmsServletContext.java | 2 + .../src/org/argeo/cms/ArgeoLogListener.java | 1 + .../src/org/argeo/cms/ArgeoLogger.java | 1 + .../argeo/cms/internal/osgi/CmsActivator.java | 5 +- .../{NodeLogger.java => CmsOsgiLogger.java} | 48 +++++++++---------- .../cms/internal/osgi/GogoShellKiller.java | 2 - .../org/argeo/init/logging/ThinLogging.java | 4 ++ 17 files changed, 70 insertions(+), 44 deletions(-) create mode 100644 org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/DataServletContext.java create mode 100644 org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/JcrServletContext.java rename org.argeo.cms/src/org/argeo/cms/internal/osgi/{NodeLogger.java => CmsOsgiLogger.java} (92%) diff --git a/org.argeo.cms.jcr/OSGI-INF/dataServletContext.xml b/org.argeo.cms.jcr/OSGI-INF/dataServletContext.xml index ffd8804b5..f5fc8deaa 100644 --- a/org.argeo.cms.jcr/OSGI-INF/dataServletContext.xml +++ b/org.argeo.cms.jcr/OSGI-INF/dataServletContext.xml @@ -1,6 +1,6 @@ - + diff --git a/org.argeo.cms.jcr/OSGI-INF/filesServletContext.xml b/org.argeo.cms.jcr/OSGI-INF/filesServletContext.xml index 049270c6a..5fb56e3ed 100644 --- a/org.argeo.cms.jcr/OSGI-INF/filesServletContext.xml +++ b/org.argeo.cms.jcr/OSGI-INF/filesServletContext.xml @@ -1,6 +1,6 @@ - + diff --git a/org.argeo.cms.jcr/OSGI-INF/jcrDeployment.xml b/org.argeo.cms.jcr/OSGI-INF/jcrDeployment.xml index fcba11cc5..a94b15168 100644 --- a/org.argeo.cms.jcr/OSGI-INF/jcrDeployment.xml +++ b/org.argeo.cms.jcr/OSGI-INF/jcrDeployment.xml @@ -1,5 +1,5 @@ - + diff --git a/org.argeo.cms.jcr/OSGI-INF/jcrServletContext.xml b/org.argeo.cms.jcr/OSGI-INF/jcrServletContext.xml index dd83c1d1c..a0885bbc5 100644 --- a/org.argeo.cms.jcr/OSGI-INF/jcrServletContext.xml +++ b/org.argeo.cms.jcr/OSGI-INF/jcrServletContext.xml @@ -1,6 +1,6 @@ - + diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsJcrDeployment.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsJcrDeployment.java index 62899cdf6..340d13782 100644 --- a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsJcrDeployment.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsJcrDeployment.java @@ -75,15 +75,15 @@ public class CmsJcrDeployment { CmsDeployment cmsDeployment; public CmsJcrDeployment() { - dataModels = new DataModels(bc); // initTrackers(); } - public void init() { + public void start() { + dataModels = new DataModels(bc); ServiceTracker repoContextSt = new RepositoryContextStc(); - // repoContextSt.open(); - KernelUtils.asyncOpen(repoContextSt); + repoContextSt.open(); + //KernelUtils.asyncOpen(repoContextSt); // nodeDeployment = CmsJcrActivator.getService(NodeDeployment.class); @@ -91,7 +91,7 @@ public class CmsJcrDeployment { } - public void destroy() { + public void stop() { // if (nodeHttp != null) // nodeHttp.destroy(); diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/DataModels.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/DataModels.java index 5a790f2ea..f2196bd41 100644 --- a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/DataModels.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/DataModels.java @@ -9,7 +9,6 @@ import java.util.Map; import java.util.TreeMap; import org.argeo.api.cms.CmsLog; -import org.argeo.cms.CmsException; import org.argeo.cms.osgi.DataModelNamespace; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; @@ -129,7 +128,7 @@ class DataModels implements BundleListener { assert requiredDataModelName != null; DataModel requiredDataModel = dataModels.get(requiredDataModelName); if (requiredDataModel == null) - throw new CmsException("No required data model " + requiredDataModelName); + throw new IllegalStateException("No required data model " + requiredDataModelName); req.add(requiredDataModel); } required = Collections.unmodifiableList(req); diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/RepositoryContextsFactory.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/RepositoryContextsFactory.java index 2b9ad0043..2ffac9c4c 100644 --- a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/RepositoryContextsFactory.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/RepositoryContextsFactory.java @@ -38,10 +38,14 @@ public class RepositoryContextsFactory implements ManagedServiceFactory { for (String pid : repositories.keySet()) { try { RepositoryContext repositoryContext = repositories.get(pid); - repositoryContext.getRepository().shutdown(); - if (log.isDebugEnabled()) - log.debug("Shut down repository " + pid - + (pidToCn.containsKey(pid) ? " (" + pidToCn.get(pid) + ")" : "")); + // Must start in another thread otherwise shutdown is interrupted + // TODO use an executor? + new Thread(() -> { + repositoryContext.getRepository().shutdown(); + if (log.isDebugEnabled()) + log.debug("Shut down repository " + pid + + (pidToCn.containsKey(pid) ? " (" + pidToCn.get(pid) + ")" : "")); + }, "Shutdown JCR repository " + pid).start(); } 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/servlet/DataServletContext.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/DataServletContext.java new file mode 100644 index 000000000..2f60e97d9 --- /dev/null +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/DataServletContext.java @@ -0,0 +1,8 @@ +package org.argeo.cms.jcr.internal.servlet; + +import org.argeo.cms.servlet.CmsServletContext; + +/** Internal subclass, so that config resources can be loaded from our bundle. */ +public class DataServletContext extends CmsServletContext { + +} diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/JcrServletContext.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/JcrServletContext.java new file mode 100644 index 000000000..21046f34e --- /dev/null +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/JcrServletContext.java @@ -0,0 +1,8 @@ +package org.argeo.cms.jcr.internal.servlet; + +import org.argeo.cms.servlet.PrivateWwwAuthServletContext; + +/** Internal subclass, so that config resources can be loaded from our bundle. */ +public class JcrServletContext extends PrivateWwwAuthServletContext { + +} diff --git a/org.argeo.cms.servlet/OSGI-INF/pkgServlet.xml b/org.argeo.cms.servlet/OSGI-INF/pkgServlet.xml index 30e52311c..00fcaff99 100644 --- a/org.argeo.cms.servlet/OSGI-INF/pkgServlet.xml +++ b/org.argeo.cms.servlet/OSGI-INF/pkgServlet.xml @@ -1,6 +1,6 @@ - + diff --git a/org.argeo.cms.servlet/src/org/argeo/cms/servlet/CmsServletContext.java b/org.argeo.cms.servlet/src/org/argeo/cms/servlet/CmsServletContext.java index 40404c5d4..1ae6286ac 100644 --- a/org.argeo.cms.servlet/src/org/argeo/cms/servlet/CmsServletContext.java +++ b/org.argeo.cms.servlet/src/org/argeo/cms/servlet/CmsServletContext.java @@ -90,6 +90,8 @@ public class CmsServletContext extends ServletContextHelper { @Override public URL getResource(String name) { + // TODO make it more robust and versatile + // if used directly it can only load from within this bundle return bundle.getResource(name); } diff --git a/org.argeo.cms/src/org/argeo/cms/ArgeoLogListener.java b/org.argeo.cms/src/org/argeo/cms/ArgeoLogListener.java index e4a9941c7..a01858aa9 100644 --- a/org.argeo.cms/src/org/argeo/cms/ArgeoLogListener.java +++ b/org.argeo.cms/src/org/argeo/cms/ArgeoLogListener.java @@ -1,6 +1,7 @@ package org.argeo.cms; /** Framework agnostic interface for log notifications */ +@Deprecated public interface ArgeoLogListener { /** * Appends a log diff --git a/org.argeo.cms/src/org/argeo/cms/ArgeoLogger.java b/org.argeo.cms/src/org/argeo/cms/ArgeoLogger.java index 81a40f50c..71c503900 100644 --- a/org.argeo.cms/src/org/argeo/cms/ArgeoLogger.java +++ b/org.argeo.cms/src/org/argeo/cms/ArgeoLogger.java @@ -4,6 +4,7 @@ package org.argeo.cms; * Logging framework agnostic identifying a logging service, to which one can * register */ +@Deprecated public interface ArgeoLogger { /** * Register for events by threads with the same authentication (or all diff --git a/org.argeo.cms/src/org/argeo/cms/internal/osgi/CmsActivator.java b/org.argeo.cms/src/org/argeo/cms/internal/osgi/CmsActivator.java index 264f0c1b9..038d7029c 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/osgi/CmsActivator.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/osgi/CmsActivator.java @@ -35,7 +35,7 @@ public class CmsActivator implements BundleActivator { private LogReaderService logReaderService; - private NodeLogger logger; + private CmsOsgiLogger logger; // private CmsStateImpl nodeState; // private CmsDeploymentImpl nodeDeployment; // private CmsContextImpl nodeInstance; @@ -55,6 +55,7 @@ public class CmsActivator implements BundleActivator { // this.bc = bundleContext; if (bundleContext != null) this.logReaderService = getService(LogReaderService.class); + initArgeoLogger(); // this.internalExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); // // try { @@ -130,7 +131,7 @@ public class CmsActivator implements BundleActivator { } private void initArgeoLogger() { - logger = new NodeLogger(logReaderService); + logger = new CmsOsgiLogger(logReaderService); if (bundleContext != null) bundleContext.registerService(ArgeoLogger.class, logger, null); } diff --git a/org.argeo.cms/src/org/argeo/cms/internal/osgi/NodeLogger.java b/org.argeo.cms/src/org/argeo/cms/internal/osgi/CmsOsgiLogger.java similarity index 92% rename from org.argeo.cms/src/org/argeo/cms/internal/osgi/NodeLogger.java rename to org.argeo.cms/src/org/argeo/cms/internal/osgi/CmsOsgiLogger.java index 69dbec9f7..91628d344 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/osgi/NodeLogger.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/osgi/CmsOsgiLogger.java @@ -42,7 +42,7 @@ import org.osgi.service.log.LogListener; import org.osgi.service.log.LogReaderService; /** Not meant to be used directly in standard log4j config */ -public class NodeLogger implements ArgeoLogger, LogListener { +public class CmsOsgiLogger implements ArgeoLogger, LogListener { /** Internal debug for development purposes. */ private static Boolean debug = false; @@ -77,7 +77,7 @@ public class NodeLogger implements ArgeoLogger, LogListener { } }; - public NodeLogger(LogReaderService lrs) { + public CmsOsgiLogger(LogReaderService lrs) { if (lrs != null) { Enumeration logEntries = lrs.getLog(); while (logEntries.hasMoreElements()) @@ -85,26 +85,26 @@ public class NodeLogger implements ArgeoLogger, LogListener { lrs.addLogListener(this); // configure log4j watcher - String log4jConfiguration = KernelUtils.getFrameworkProp("log4j.configuration"); - if (log4jConfiguration != null && log4jConfiguration.startsWith("file:")) { - if (log4jConfiguration.contains("..")) { - if (log4jConfiguration.startsWith("file://")) - log4jConfiguration = log4jConfiguration.substring("file://".length()); - else if (log4jConfiguration.startsWith("file:")) - log4jConfiguration = log4jConfiguration.substring("file:".length()); - } - try { - Path log4jconfigPath; - if (log4jConfiguration.startsWith("file:")) - log4jconfigPath = Paths.get(new URI(log4jConfiguration)); - else - log4jconfigPath = Paths.get(log4jConfiguration); - Thread log4jConfWatcher = new Log4jConfWatcherThread(log4jconfigPath); - log4jConfWatcher.start(); - } catch (Exception e) { - stdErr("Badly formatted log4j configuration URI " + log4jConfiguration + ": " + e.getMessage()); - } - } +// String log4jConfiguration = KernelUtils.getFrameworkProp("log4j.configuration"); +// if (log4jConfiguration != null && log4jConfiguration.startsWith("file:")) { +// if (log4jConfiguration.contains("..")) { +// if (log4jConfiguration.startsWith("file://")) +// log4jConfiguration = log4jConfiguration.substring("file://".length()); +// else if (log4jConfiguration.startsWith("file:")) +// log4jConfiguration = log4jConfiguration.substring("file:".length()); +// } +// try { +// Path log4jconfigPath; +// if (log4jConfiguration.startsWith("file:")) +// log4jconfigPath = Paths.get(new URI(log4jConfiguration)); +// else +// log4jconfigPath = Paths.get(log4jConfiguration); +// Thread log4jConfWatcher = new Log4jConfWatcherThread(log4jconfigPath); +// log4jConfWatcher.start(); +// } catch (Exception e) { +// stdErr("Badly formatted log4j configuration URI " + log4jConfiguration + ": " + e.getMessage()); +// } +// } } } @@ -283,9 +283,9 @@ public class NodeLogger implements ArgeoLogger, LogListener { if (username == null)// FIXME return; if (!userListeners.containsKey(username)) - throw new CmsException("No user listeners " + listener + " registered for user " + username); + throw new IllegalStateException("No user listeners " + listener + " registered for user " + username); if (!userListeners.get(username).contains(listener)) - throw new CmsException("No user listeners " + listener + " registered for user " + username); + throw new IllegalStateException("No user listeners " + listener + " registered for user " + username); userListeners.get(username).remove(listener); if (userListeners.get(username).isEmpty()) userListeners.remove(username); diff --git a/org.argeo.cms/src/org/argeo/cms/internal/osgi/GogoShellKiller.java b/org.argeo.cms/src/org/argeo/cms/internal/osgi/GogoShellKiller.java index 85c686a0a..a8c901644 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/osgi/GogoShellKiller.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/osgi/GogoShellKiller.java @@ -1,7 +1,5 @@ package org.argeo.cms.internal.osgi; -import java.io.IOException; - /** * Workaround for killing Gogo shell by system shutdown. * 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 871dc8d7f..cdcabcb03 100644 --- a/org.argeo.init/src/org/argeo/init/logging/ThinLogging.java +++ b/org.argeo.init/src/org/argeo/init/logging/ThinLogging.java @@ -285,6 +285,7 @@ class ThinLogging implements Consumer> { private StackTraceElement findCallLocation(Level level, Thread thread) { assert level != null; assert thread != null; + // TODO rather use a StackWalker and make it smarter StackTraceElement callLocation = null; if (level.getSeverity() >= callLocationLevel.getSeverity()) { StackTraceElement[] stack = thread.getStackTrace(); @@ -293,12 +294,15 @@ class ThinLogging implements Consumer> { String className = stack[i].getClassName(); switch (className) { // TODO make it more configurable + // FIXME deal with privileges stacks (in Equinox) case "java.lang.System$Logger": case "java.util.logging.Logger": case "org.apache.commons.logging.Log": case "org.osgi.service.log.Logger": + case "org.eclipse.osgi.internal.log.LoggerImpl": case "org.argeo.api.cms.CmsLog": case "org.slf4j.impl.ArgeoLogger": + case "org.argeo.cms.internal.osgi.CmsOsgiLogger": case "org.eclipse.jetty.util.log.Slf4jLog": case "sun.util.logging.internal.LoggingProviderImpl$JULWrapper": lowestLoggerInterface = i; -- 2.30.2