]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java
Make CMS startup more asynchronous
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / CmsDeployment.java
index 10ebb603a10ea4c57a42c92418546940f4cdfe94..7f547fd11eed767a5bb609751ed3ee7bdb788a05 100644 (file)
@@ -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<NodeHttp, NodeHttp>(bc, NodeHttp.class, null) {
+               ServiceTracker<?, ?> httpSt = new ServiceTracker<NodeHttp, NodeHttp>(bc, NodeHttp.class, null) {
 
                        @Override
                        public NodeHttp addingService(ServiceReference<NodeHttp> reference) {
@@ -86,17 +85,27 @@ public class CmsDeployment implements NodeDeployment {
                                checkReadiness();
                                return super.addingService(reference);
                        }
-               }.open();
-               new RepositoryContextStc().open();
-               new ServiceTracker<UserAdmin, UserAdmin>(bc, UserAdmin.class, null) {
+               };
+//             httpSt.open();
+               KernelUtils.asyncOpen(httpSt);
+
+               ServiceTracker<?, ?> repoContextSt = new RepositoryContextStc();
+//             repoContextSt.open();
+               KernelUtils.asyncOpen(repoContextSt);
+
+               ServiceTracker<?, ?> userAdminSt = new ServiceTracker<UserAdmin, UserAdmin>(bc, UserAdmin.class, null) {
                        @Override
                        public UserAdmin addingService(ServiceReference<UserAdmin> reference) {
                                userAdminAvailable = true;
                                checkReadiness();
                                return super.addingService(reference);
                        }
-               }.open();
-               new ServiceTracker<ConfigurationAdmin, ConfigurationAdmin>(bc, ConfigurationAdmin.class, null) {
+               };
+//             userAdminSt.open();
+               KernelUtils.asyncOpen(userAdminSt);
+
+               ServiceTracker<?, ?> confAdminSt = new ServiceTracker<ConfigurationAdmin, ConfigurationAdmin>(bc,
+                               ConfigurationAdmin.class, null) {
                        @Override
                        public ConfigurationAdmin addingService(ServiceReference<ConfigurationAdmin> 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() {
@@ -151,9 +162,17 @@ public class CmsDeployment implements NodeDeployment {
 
        private void checkReadiness() {
                if (nodeAvailable && userAdminAvailable && (httpExpected ? httpAvailable : true)) {
+                       String data = KernelUtils.getFrameworkProp(KernelUtils.OSGI_INSTANCE_AREA);
+                       String state = KernelUtils.getFrameworkProp(KernelUtils.OSGI_CONFIGURATION_AREA);
                        availableSince = System.currentTimeMillis();
                        long jvmUptime = ManagementFactory.getRuntimeMXBean().getUptime();
-                       log.info("## ARGEO CMS AVAILABLE in " + (jvmUptime / 1000) + "." + (jvmUptime % 1000) + "s ##");
+                       String jvmUptimeStr = " in " + (jvmUptime / 1000) + "." + (jvmUptime % 1000) + "s";
+                       log.info("## ARGEO NODE AVAILABLE" + (log.isDebugEnabled() ? jvmUptimeStr : "") + " ##");
+                       if (log.isDebugEnabled()) {
+                               log.debug("## state: " + state);
+                               if (data != null)
+                                       log.debug("## data: " + data);
+                       }
                        long begin = bc.getService(bc.getServiceReference(NodeState.class)).getAvailableSince();
                        long initDuration = System.currentTimeMillis() - begin;
                        if (log.isTraceEnabled())
@@ -235,11 +254,11 @@ public class CmsDeployment implements NodeDeployment {
                }
                List<BundleCapability> capabilities = wiring.getCapabilities(CMS_DATA_MODEL_NAMESPACE);
                for (BundleCapability capability : capabilities) {
-                       registerCnd(adminSession, capability, processed);
+                       registerDataModelCapability(adminSession, capability, processed);
                }
        }
 
-       private void registerCnd(Session adminSession, BundleCapability capability, Set<String> processed) {
+       private void registerDataModelCapability(Session adminSession, BundleCapability capability, Set<String> processed) {
                Map<String, Object> attrs = capability.getAttributes();
                String name = (String) attrs.get(DataModelNamespace.CAPABILITY_NAME_ATTRIBUTE);
                if (processed.contains(name)) {
@@ -247,15 +266,21 @@ public class CmsDeployment implements NodeDeployment {
                                log.trace("Data model " + name + " has already been processed");
                        return;
                }
+
+               // CND
                String path = (String) attrs.get(DataModelNamespace.CAPABILITY_CND_ATTRIBUTE);
-               URL url = capability.getRevision().getBundle().getResource(path);
-               try (Reader reader = new InputStreamReader(url.openStream())) {
-                       CndImporter.registerNodeTypes(reader, adminSession, true);
-                       processed.add(name);
-                       if (log.isDebugEnabled())
-                               log.debug("Registered CND " + url);
-               } catch (Exception e) {
-                       throw new CmsException("Cannot import CND " + url, e);
+               if (path != null) {
+                       URL url = capability.getRevision().getBundle().getResource(path);
+                       if (url == null)
+                               throw new CmsException("No data model '" + name + "' found under path " + path);
+                       try (Reader reader = new InputStreamReader(url.openStream())) {
+                               CndImporter.registerNodeTypes(reader, adminSession, true);
+                               processed.add(name);
+                               if (log.isDebugEnabled())
+                                       log.debug("Registered CND " + url);
+                       } catch (Exception e) {
+                               throw new CmsException("Cannot import CND " + url, e);
+                       }
                }
 
                if (!asBoolean((String) attrs.get(DataModelNamespace.CAPABILITY_ABSTRACT_ATTRIBUTE))) {