]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java
Move APIs, clean base bundles
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / CmsDeployment.java
index 7a4ca1bf4eeed4fec009f4c11a2203bcb9c3516f..0373e3690c6da4ee5607b34700000da1acbd7cd8 100644 (file)
@@ -20,7 +20,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.jcr.ArgeoJcrConstants;
 import org.argeo.jcr.JcrUtils;
 import org.argeo.node.DataModelNamespace;
 import org.argeo.node.NodeConstants;
@@ -34,6 +33,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 +42,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 +60,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 +76,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() {
@@ -119,8 +129,8 @@ public class CmsDeployment implements NodeDeployment {
 
                prepareDataModel(KernelUtils.openAdminSession(deployedNodeRepository));
                Hashtable<String, String> regProps = new Hashtable<String, String>();
-               regProps.put(NodeConstants.CN, ArgeoJcrConstants.ALIAS_HOME);
-               regProps.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS, ArgeoJcrConstants.ALIAS_HOME);
+               regProps.put(NodeConstants.CN, NodeConstants.ALIAS_HOME);
+               regProps.put(NodeConstants.JCR_REPOSITORY_ALIAS, NodeConstants.ALIAS_HOME);
                homeRepository = new HomeRepository(deployedNodeRepository);
                // register
                bc.registerService(Repository.class, homeRepository, regProps);
@@ -132,11 +142,8 @@ public class CmsDeployment implements NodeDeployment {
                        Set<String> processed = new HashSet<String>();
                        bundles: for (Bundle bundle : bc.getBundles()) {
                                BundleWiring wiring = bundle.adapt(BundleWiring.class);
-                               if (wiring == null) {
-                                       if (log.isTraceEnabled())
-                                               log.error("No wiring for " + bundle.getSymbolicName());
+                               if (wiring == null)
                                        continue bundles;
-                               }
                                processWiring(adminSession, wiring, processed);
                        }
                } finally {
@@ -159,13 +166,13 @@ public class CmsDeployment implements NodeDeployment {
 
        private void registerCnd(Session adminSession, BundleCapability capability, Set<String> processed) {
                Map<String, Object> attrs = capability.getAttributes();
-               String name = attrs.get(DataModelNamespace.CAPABILITY_NAME_ATTRIBUTE).toString();
+               String name = (String) attrs.get(DataModelNamespace.CAPABILITY_NAME_ATTRIBUTE);
                if (processed.contains(name)) {
                        if (log.isTraceEnabled())
                                log.trace("Data model " + name + " has already been processed");
                        return;
                }
-               String path = attrs.get(DataModelNamespace.CAPABILITY_CND_ATTRIBUTE).toString();
+               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);
@@ -176,14 +183,31 @@ public class CmsDeployment implements NodeDeployment {
                        throw new CmsException("Cannot import CND " + url, e);
                }
 
-               Hashtable<String, Object> properties = new Hashtable<>();
-               properties.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS, name);
-               properties.put(NodeConstants.CN, name);
-               if (name.equals(ArgeoJcrConstants.ALIAS_NODE))
-                       properties.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
-               bc.registerService(Repository.class, adminSession.getRepository(), properties);
-               if (log.isDebugEnabled())
-                       log.debug("Published data model " + name);
+               if (!asBoolean((String) attrs.get(DataModelNamespace.CAPABILITY_ABSTRACT_ATTRIBUTE))) {
+                       Hashtable<String, Object> properties = new Hashtable<>();
+                       properties.put(NodeConstants.JCR_REPOSITORY_ALIAS, name);
+                       properties.put(NodeConstants.CN, name);
+                       if (name.equals(NodeConstants.ALIAS_NODE))
+                               properties.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
+                       LocalRepository localRepository = new LocalRepository(adminSession.getRepository(), capability);
+                       bc.registerService(Repository.class, localRepository, properties);
+                       if (log.isDebugEnabled())
+                               log.debug("Published data model " + name);
+               }
+       }
+
+       private boolean asBoolean(String value) {
+               if (value == null)
+                       return false;
+               switch (value) {
+               case "true":
+                       return true;
+               case "false":
+                       return false;
+               default:
+                       throw new CmsException("Unsupported value for attribute " + DataModelNamespace.CAPABILITY_ABSTRACT_ATTRIBUTE
+                                       + ": " + value);
+               }
        }
 
        @Override
@@ -201,7 +225,7 @@ public class CmsDeployment implements NodeDeployment {
                public RepositoryContext addingService(ServiceReference<RepositoryContext> reference) {
                        RepositoryContext nodeRepo = bc.getService(reference);
                        Object cn = reference.getProperty(NodeConstants.CN);
-                       if (cn != null && cn.equals(ArgeoJcrConstants.ALIAS_NODE)) {
+                       if (cn != null && cn.equals(NodeConstants.ALIAS_NODE)) {
                                prepareNodeRepository(nodeRepo.getRepository());
                                nodeAvailable = true;
                                checkReadiness();