Make deploy config initialisation more robust.
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 14 Sep 2016 18:34:40 +0000 (18:34 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 14 Sep 2016 18:34:40 +0000 (18:34 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@9147 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/DeployConfig.java

index 7a4ca1bf4eeed4fec009f4c11a2203bcb9c3516f..7a180cfc5287adf5612ea3deaaf9d65162d8a112 100644 (file)
@@ -34,6 +34,7 @@ import org.osgi.framework.ServiceReference;
 import org.osgi.framework.wiring.BundleCapability;
 import org.osgi.framework.wiring.BundleWire;
 import org.osgi.framework.wiring.BundleWiring;
+import org.osgi.service.cm.ConfigurationAdmin;
 import org.osgi.service.http.HttpService;
 import org.osgi.service.useradmin.UserAdmin;
 import org.osgi.util.tracker.ServiceTracker;
@@ -42,11 +43,12 @@ public class CmsDeployment implements NodeDeployment {
        private final Log log = LogFactory.getLog(getClass());
        private final BundleContext bc = FrameworkUtil.getBundle(getClass()).getBundleContext();
 
-       private final DeployConfig deployConfig;
+       private DeployConfig deployConfig;
        private HomeRepository homeRepository;
 
        private Long availableSince;
 
+       private final boolean cleanState;
        // Readiness
        private boolean nodeAvailable = false;
        private boolean userAdminAvailable = false;
@@ -59,8 +61,7 @@ public class CmsDeployment implements NodeDeployment {
                        throw new CmsException("No node state available");
 
                NodeState nodeState = bc.getService(nodeStateSr);
-               deployConfig = new DeployConfig(nodeState.isClean());
-               httpExpected = deployConfig.getProps(KernelConstants.JETTY_FACTORY_PID, "default") != null;
+               cleanState = nodeState.isClean();
 
                initTrackers();
        }
@@ -76,10 +77,20 @@ public class CmsDeployment implements NodeDeployment {
                                return super.addingService(reference);
                        }
                }.open();
+               new ServiceTracker<ConfigurationAdmin, ConfigurationAdmin>(bc, ConfigurationAdmin.class, null) {
+                       @Override
+                       public ConfigurationAdmin addingService(ServiceReference<ConfigurationAdmin> reference) {
+                               ConfigurationAdmin configurationAdmin = bc.getService(reference);
+                               deployConfig = new DeployConfig(configurationAdmin, cleanState);
+                               httpExpected = deployConfig.getProps(KernelConstants.JETTY_FACTORY_PID, "default") != null;
+                               return super.addingService(reference);
+                       }
+               }.open();
        }
 
        public void shutdown() {
-               deployConfig.save();
+               if (deployConfig != null)
+                       deployConfig.save();
        }
 
        private void checkReadiness() {
index fbe206644d169aa57003e93dfd0608e9fbad1b16..80bd912477be27d052041c9c48e81d1d7712a7d7 100644 (file)
@@ -39,8 +39,9 @@ class DeployConfig implements ConfigurationListener {
        private Path deployConfigPath = KernelUtils.getOsgiInstancePath(KernelConstants.DEPLOY_CONFIG_PATH);
        private SortedMap<LdapName, Attributes> deployConfigs = new TreeMap<>();
 
-       public DeployConfig(boolean isClean) {
-               ConfigurationAdmin configurationAdmin = bc.getService(bc.getServiceReference(ConfigurationAdmin.class));
+       public DeployConfig(ConfigurationAdmin configurationAdmin,boolean isClean) {
+               // ConfigurationAdmin configurationAdmin =
+               // bc.getService(bc.getServiceReference(ConfigurationAdmin.class));
                try {
                        if (!Files.exists(deployConfigPath)) { // first init
                                firstInit();