From 6a62c05a487ba34946b1924a039603e68b1d54e6 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 4 Feb 2018 15:07:06 +0100 Subject: [PATCH] Make CMS startup more asynchronous --- .../cms/internal/http/CmsSessionProvider.java | 2 +- .../cms/internal/http/DataHttpContext.java | 2 +- .../argeo/cms/internal/http/HttpUtils.java | 14 +++--- .../argeo/cms/internal/http/LinkServlet.java | 2 +- .../cms/internal/http/PrivateHttpContext.java | 2 +- .../argeo/cms/internal/http/RobotServlet.java | 2 +- .../http/client/SpnegoAuthScheme.java | 2 +- .../argeo/cms/internal/kernel/Activator.java | 1 + .../cms/internal/kernel/CmsDeployment.java | 27 +++++++--- .../cms/internal/kernel/KernelUtils.java | 16 +++++- .../internal/{http => kernel}/NodeHttp.java | 49 ++++++++++++------- .../argeo/cms/internal/kernel/NodeLogger.java | 4 ++ .../cms/internal/kernel/NodeUserAdmin.java | 1 - 13 files changed, 82 insertions(+), 42 deletions(-) rename org.argeo.cms/src/org/argeo/cms/internal/{http => kernel}/NodeHttp.java (85%) diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/CmsSessionProvider.java b/org.argeo.cms/src/org/argeo/cms/internal/http/CmsSessionProvider.java index 4f0c184db..943decaf8 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/http/CmsSessionProvider.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/http/CmsSessionProvider.java @@ -19,7 +19,7 @@ import org.argeo.jcr.JcrUtils; * Implements an open session in view patter: a new JCR session is created for * each request */ -class CmsSessionProvider implements SessionProvider, Serializable { +public class CmsSessionProvider implements SessionProvider, Serializable { private static final long serialVersionUID = -1358136599534938466L; private final static Log log = LogFactory.getLog(CmsSessionProvider.class); diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/DataHttpContext.java b/org.argeo.cms/src/org/argeo/cms/internal/http/DataHttpContext.java index b7a8d0f9e..93f63530e 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/http/DataHttpContext.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/http/DataHttpContext.java @@ -16,7 +16,7 @@ import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; import org.osgi.service.http.HttpContext; -class DataHttpContext implements HttpContext { +public class DataHttpContext implements HttpContext { private final static Log log = LogFactory.getLog(DataHttpContext.class); private final BundleContext bc = FrameworkUtil.getBundle(getClass()).getBundleContext(); diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/HttpUtils.java b/org.argeo.cms/src/org/argeo/cms/internal/http/HttpUtils.java index efa2d661a..58d9324ec 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/http/HttpUtils.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/http/HttpUtils.java @@ -6,12 +6,12 @@ import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; -class HttpUtils { - final static String HEADER_AUTHORIZATION = "Authorization"; - final static String HEADER_WWW_AUTHENTICATE = "WWW-Authenticate"; +public class HttpUtils { + public final static String HEADER_AUTHORIZATION = "Authorization"; + public final static String HEADER_WWW_AUTHENTICATE = "WWW-Authenticate"; - final static String DEFAULT_PROTECTED_HANDLERS = "/org/argeo/cms/internal/http/protectedHandlers.xml"; - final static String WEBDAV_CONFIG = "/org/argeo/cms/internal/http/webdav-config.xml"; + public final static String DEFAULT_PROTECTED_HANDLERS = "/org/argeo/cms/internal/http/protectedHandlers.xml"; + public final static String WEBDAV_CONFIG = "/org/argeo/cms/internal/http/webdav-config.xml"; static boolean isBrowser(String userAgent) { return userAgent.contains("webkit") || userAgent.contains("gecko") || userAgent.contains("firefox") @@ -19,7 +19,7 @@ class HttpUtils { || userAgent.contains("opera") || userAgent.contains("browser"); } - static void logRequestHeaders(Log log, HttpServletRequest request) { + public static void logRequestHeaders(Log log, HttpServletRequest request) { if (!log.isDebugEnabled()) return; for (Enumeration headerNames = request.getHeaderNames(); headerNames.hasMoreElements();) { @@ -30,7 +30,7 @@ class HttpUtils { log.debug(request.getRequestURI() + "\n"); } - static void logRequest(Log log,HttpServletRequest request) { + public static void logRequest(Log log,HttpServletRequest request) { log.debug("contextPath=" + request.getContextPath()); log.debug("servletPath=" + request.getServletPath()); log.debug("requestURI=" + request.getRequestURI()); diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/LinkServlet.java b/org.argeo.cms/src/org/argeo/cms/internal/http/LinkServlet.java index d77e39cb9..34bdcaa17 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/http/LinkServlet.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/http/LinkServlet.java @@ -34,7 +34,7 @@ import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; import org.osgi.framework.ServiceReference; -class LinkServlet extends HttpServlet { +public class LinkServlet extends HttpServlet { private final BundleContext bc = FrameworkUtil.getBundle(getClass()).getBundleContext(); private static final long serialVersionUID = 3749990143146845708L; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/PrivateHttpContext.java b/org.argeo.cms/src/org/argeo/cms/internal/http/PrivateHttpContext.java index 2babd188b..c3f2a1c80 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/http/PrivateHttpContext.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/http/PrivateHttpContext.java @@ -5,7 +5,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** Requests authorisation */ -class PrivateHttpContext extends DataHttpContext { +public class PrivateHttpContext extends DataHttpContext { public PrivateHttpContext(String httpAuthrealm, boolean forceBasic) { super(httpAuthrealm, forceBasic); diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/RobotServlet.java b/org.argeo.cms/src/org/argeo/cms/internal/http/RobotServlet.java index 92d9eb78c..6d3d302b7 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/http/RobotServlet.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/http/RobotServlet.java @@ -8,7 +8,7 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -class RobotServlet extends HttpServlet { +public class RobotServlet extends HttpServlet { private static final long serialVersionUID = 7935661175336419089L; @Override diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/client/SpnegoAuthScheme.java b/org.argeo.cms/src/org/argeo/cms/internal/http/client/SpnegoAuthScheme.java index 64dbaab74..7a8071f4a 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/http/client/SpnegoAuthScheme.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/http/client/SpnegoAuthScheme.java @@ -20,7 +20,7 @@ import org.apache.commons.httpclient.auth.MalformedChallengeException; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.params.DefaultHttpParams; import org.apache.commons.httpclient.params.HttpParams; -import org.argeo.cms.internal.http.NodeHttp; +import org.argeo.cms.internal.kernel.NodeHttp; import org.ietf.jgss.GSSContext; import org.ietf.jgss.GSSException; import org.ietf.jgss.GSSManager; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java index 25746a481..980dde975 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java @@ -59,6 +59,7 @@ public class Activator implements BundleActivator { initSecurity(); initArgeoLogger(); initNode(); + log.debug("Kernel bundle started"); } catch (Exception e) { log.error("## FATAL: CMS activator failed", e); } diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java index 7dedfe811..7f547fd11 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java @@ -21,7 +21,6 @@ import org.apache.commons.logging.LogFactory; import org.apache.jackrabbit.commons.cnd.CndImporter; import org.apache.jackrabbit.core.RepositoryContext; import org.argeo.cms.CmsException; -import org.argeo.cms.internal.http.NodeHttp; import org.argeo.jcr.JcrUtils; import org.argeo.node.DataModelNamespace; import org.argeo.node.NodeConstants; @@ -78,7 +77,7 @@ public class CmsDeployment implements NodeDeployment { } private void initTrackers() { - new ServiceTracker(bc, NodeHttp.class, null) { + ServiceTracker httpSt = new ServiceTracker(bc, NodeHttp.class, null) { @Override public NodeHttp addingService(ServiceReference reference) { @@ -86,17 +85,27 @@ public class CmsDeployment implements NodeDeployment { checkReadiness(); return super.addingService(reference); } - }.open(); - new RepositoryContextStc().open(); - new ServiceTracker(bc, UserAdmin.class, null) { + }; +// httpSt.open(); + KernelUtils.asyncOpen(httpSt); + + ServiceTracker repoContextSt = new RepositoryContextStc(); +// repoContextSt.open(); + KernelUtils.asyncOpen(repoContextSt); + + ServiceTracker userAdminSt = new ServiceTracker(bc, UserAdmin.class, null) { @Override public UserAdmin addingService(ServiceReference reference) { userAdminAvailable = true; checkReadiness(); return super.addingService(reference); } - }.open(); - new ServiceTracker(bc, ConfigurationAdmin.class, null) { + }; +// userAdminSt.open(); + KernelUtils.asyncOpen(userAdminSt); + + ServiceTracker confAdminSt = new ServiceTracker(bc, + ConfigurationAdmin.class, null) { @Override public ConfigurationAdmin addingService(ServiceReference reference) { ConfigurationAdmin configurationAdmin = bc.getService(reference); @@ -130,7 +139,9 @@ public class CmsDeployment implements NodeDeployment { } return super.addingService(reference); } - }.open(); + }; +// confAdminSt.open(); + KernelUtils.asyncOpen(confAdminSt); } private void loadIpaJaasConfiguration() { diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelUtils.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelUtils.java index b3fb33ac3..63cb356d3 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelUtils.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelUtils.java @@ -29,6 +29,7 @@ import org.argeo.node.NodeConstants; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; +import org.osgi.util.tracker.ServiceTracker; /** Package utilities */ class KernelUtils implements KernelConstants { @@ -188,9 +189,20 @@ class KernelUtils implements KernelConstants { }); } + static void asyncOpen(ServiceTracker st) { + Runnable run = new Runnable() { + + @Override + public void run() { + st.open(); + } + }; + new Thread(run, "Open service tracker " + st).start(); + } + /** - * @return the {@link BundleContext} of the {@link Bundle} which provided - * this class, never null. + * @return the {@link BundleContext} of the {@link Bundle} which provided this + * class, never null. * @throws CmsException * if the related bundle is not active */ diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/NodeHttp.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeHttp.java similarity index 85% rename from org.argeo.cms/src/org/argeo/cms/internal/http/NodeHttp.java rename to org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeHttp.java index 4cc0b5538..f17c98241 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/http/NodeHttp.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeHttp.java @@ -1,4 +1,4 @@ -package org.argeo.cms.internal.http; +package org.argeo.cms.internal.kernel; import java.io.IOException; import java.nio.file.Files; @@ -16,7 +16,12 @@ import org.apache.jackrabbit.server.SessionProvider; import org.apache.jackrabbit.server.remoting.davex.JcrRemotingServlet; import org.apache.jackrabbit.webdav.simple.SimpleWebdavServlet; import org.argeo.cms.CmsException; -import org.argeo.cms.internal.kernel.KernelConstants; +import org.argeo.cms.internal.http.CmsSessionProvider; +import org.argeo.cms.internal.http.DataHttpContext; +import org.argeo.cms.internal.http.HttpUtils; +import org.argeo.cms.internal.http.LinkServlet; +import org.argeo.cms.internal.http.PrivateHttpContext; +import org.argeo.cms.internal.http.RobotServlet; import org.argeo.node.NodeConstants; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; @@ -39,11 +44,12 @@ public class NodeHttp implements KernelConstants { private ServiceTracker repositories; private final ServiceTracker httpServiceTracker; - private String httpRealm = "Argeo"; + private static String httpRealm = "Argeo"; public NodeHttp() { httpServiceTracker = new PrepareHttpStc(); - httpServiceTracker.open(); + // httpServiceTracker.open(); + KernelUtils.asyncOpen(httpServiceTracker); } public void destroy() { @@ -51,7 +57,7 @@ public class NodeHttp implements KernelConstants { repositories.close(); } - void registerRepositoryServlets(HttpService httpService, String alias, Repository repository) { + public static void registerRepositoryServlets(HttpService httpService, String alias, Repository repository) { if (httpService == null) throw new CmsException("No HTTP service available"); try { @@ -66,7 +72,7 @@ public class NodeHttp implements KernelConstants { } } - void unregisterRepositoryServlets(HttpService httpService, String alias) { + public static void unregisterRepositoryServlets(HttpService httpService, String alias) { if (httpService == null) return; try { @@ -81,7 +87,7 @@ public class NodeHttp implements KernelConstants { } } - void registerWebdavServlet(HttpService httpService, String alias, Repository repository) + static void registerWebdavServlet(HttpService httpService, String alias, Repository repository) throws NamespaceException, ServletException { // WebdavServlet webdavServlet = new WebdavServlet(repository, new // OpenInViewSessionProvider(alias)); @@ -93,7 +99,7 @@ public class NodeHttp implements KernelConstants { httpService.registerServlet(path, webdavServlet, ip, new DataHttpContext(httpRealm)); } - void registerFilesServlet(HttpService httpService, String alias, Repository repository) + static void registerFilesServlet(HttpService httpService, String alias, Repository repository) throws NamespaceException, ServletException { WebdavServlet filesServlet = new WebdavServlet(repository, new CmsSessionProvider(alias)); String path = filesPath(alias); @@ -103,7 +109,7 @@ public class NodeHttp implements KernelConstants { httpService.registerServlet(path, filesServlet, ip, new PrivateHttpContext(httpRealm, true)); } - void registerRemotingServlet(HttpService httpService, String alias, Repository repository) + static void registerRemotingServlet(HttpService httpService, String alias, Repository repository) throws NamespaceException, ServletException { RemotingServlet remotingServlet = new RemotingServlet(repository, new CmsSessionProvider(alias)); String path = remotingPath(alias); @@ -125,15 +131,15 @@ public class NodeHttp implements KernelConstants { httpService.registerServlet(path, remotingServlet, ip, new PrivateHttpContext(httpRealm)); } - private String webdavPath(String alias) { + static String webdavPath(String alias) { return NodeConstants.PATH_DATA + "/" + alias; } - private String remotingPath(String alias) { + static String remotingPath(String alias) { return NodeConstants.PATH_JCR + "/" + alias; } - private String filesPath(String alias) { + static String filesPath(String alias) { return NodeConstants.PATH_FILES; } @@ -153,12 +159,15 @@ public class NodeHttp implements KernelConstants { // } // } - private class RepositoriesStc extends ServiceTracker { + static class RepositoriesStc extends ServiceTracker { private final HttpService httpService; - public RepositoriesStc(HttpService httpService) { + private final BundleContext bc; + + public RepositoriesStc(BundleContext bc, HttpService httpService) { super(bc, Repository.class, null); this.httpService = httpService; + this.bc = bc; } @Override @@ -196,7 +205,10 @@ public class NodeHttp implements KernelConstants { @Override public HttpService addingService(ServiceReference reference) { + long begin = System.currentTimeMillis(); + log.debug("HTTP prepare starts..."); HttpService httpService = addHttpService(reference); + log.debug("HTTP prepare duration: " + (System.currentTimeMillis() - begin) + "ms"); return httpService; } @@ -228,8 +240,9 @@ public class NodeHttp implements KernelConstants { // track repositories if (repositories != null) throw new CmsException("An http service is already configured"); - repositories = new RepositoriesStc(httpService); - repositories.open(); + repositories = new RepositoriesStc(bc, httpService); + // repositories.open(); + KernelUtils.asyncOpen(repositories); log.info(httpPortsMsg(httpPort, httpsPort)); // httpAvailable = true; // checkReadiness(); @@ -243,7 +256,7 @@ public class NodeHttp implements KernelConstants { } } - private class WebdavServlet extends SimpleWebdavServlet { + private static class WebdavServlet extends SimpleWebdavServlet { private static final long serialVersionUID = -4687354117811443881L; private final Repository repository; @@ -284,7 +297,7 @@ public class NodeHttp implements KernelConstants { } - private class RemotingServlet extends JcrRemotingServlet { + private static class RemotingServlet extends JcrRemotingServlet { private final Log log = LogFactory.getLog(RemotingServlet.class); private static final long serialVersionUID = 4605238259548058883L; private final Repository repository; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeLogger.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeLogger.java index 45ed8ec3e..134ab26ab 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeLogger.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeLogger.java @@ -129,6 +129,10 @@ class NodeLogger implements ArgeoLogger, LogListener { // this.layout = layout; // } + public String toString() { + return "Node Logger"; + } + // // OSGi LOGGER // diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeUserAdmin.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeUserAdmin.java index 077a1f8a7..f1132a642 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeUserAdmin.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeUserAdmin.java @@ -36,7 +36,6 @@ import org.apache.commons.httpclient.params.HttpParams; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.cms.CmsException; -import org.argeo.cms.internal.http.NodeHttp; import org.argeo.cms.internal.http.client.HttpCredentialProvider; import org.argeo.cms.internal.http.client.SpnegoAuthScheme; import org.argeo.naming.DnsBrowser; -- 2.30.2