Deactivate IPA when unnecessary.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / CmsDeployment.java
index 20a899eca2a8a2fb7f6e3e82ca4bf529008f7c12..126c591e64befe548823d048b6ad33236b56efee 100644 (file)
@@ -21,12 +21,14 @@ 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;
 import org.argeo.node.NodeDeployment;
 import org.argeo.node.NodeState;
 import org.argeo.node.security.CryptoKeyring;
+import org.argeo.osgi.useradmin.UserAdminConf;
 import org.argeo.util.LangUtils;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
@@ -36,13 +38,15 @@ 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.Configuration;
 import org.osgi.service.cm.ConfigurationAdmin;
 import org.osgi.service.cm.ManagedService;
-import org.osgi.service.http.HttpService;
 import org.osgi.service.useradmin.UserAdmin;
 import org.osgi.util.tracker.ServiceTracker;
 
 public class CmsDeployment implements NodeDeployment {
+       private final static String LEGACY_JCR_REPOSITORY_ALIAS = "argeo.jcr.repository.alias";
+
        private final Log log = LogFactory.getLog(getClass());
        private final BundleContext bc = FrameworkUtil.getBundle(getClass()).getBundleContext();
 
@@ -52,6 +56,9 @@ public class CmsDeployment implements NodeDeployment {
        private Long availableSince;
 
        private final boolean cleanState;
+
+       private NodeHttp nodeHttp;
+
        // Readiness
        private boolean nodeAvailable = false;
        private boolean userAdminAvailable = false;
@@ -66,11 +73,20 @@ public class CmsDeployment implements NodeDeployment {
                NodeState nodeState = bc.getService(nodeStateSr);
                cleanState = nodeState.isClean();
 
+               nodeHttp = new NodeHttp();
                initTrackers();
        }
 
        private void initTrackers() {
-               new PrepareHttpStc().open();
+               new ServiceTracker<NodeHttp, NodeHttp>(bc, NodeHttp.class, null) {
+
+                       @Override
+                       public NodeHttp addingService(ServiceReference<NodeHttp> reference) {
+                               httpAvailable = true;
+                               checkReadiness();
+                               return super.addingService(reference);
+                       }
+               }.open();
                new RepositoryContextStc().open();
                new ServiceTracker<UserAdmin, UserAdmin>(bc, UserAdmin.class, null) {
                        @Override
@@ -86,12 +102,48 @@ public class CmsDeployment implements NodeDeployment {
                                ConfigurationAdmin configurationAdmin = bc.getService(reference);
                                deployConfig = new DeployConfig(configurationAdmin, cleanState);
                                httpExpected = deployConfig.getProps(KernelConstants.JETTY_FACTORY_PID, "default") != null;
+                               try {
+                                       Configuration[] configs = configurationAdmin
+                                                       .listConfigurations("(service.factoryPid=" + NodeConstants.NODE_REPOS_FACTORY_PID + ")");
+                                       for (Configuration config : configs) {
+                                               Object cn = config.getProperties().get(NodeConstants.CN);
+                                               log.debug("Standalone repo cn: " + cn);
+                                       }
+                                       configs = configurationAdmin
+                                                       .listConfigurations("(service.factoryPid=" + NodeConstants.NODE_USER_ADMIN_PID + ")");
+
+                                       boolean hasDomain = false;
+                                       for (Configuration config : configs) {
+                                               Object realm = config.getProperties().get(UserAdminConf.realm.name());
+                                               if (realm != null) {
+                                                       log.debug("Realm: " + realm);
+                                                       hasDomain = true;
+                                               }
+                                       }
+                                       if (!hasDomain) {
+                                               loadNoIpaJaasConfiguration();
+                                       }
+                               } catch (Exception e) {
+                                       throw new CmsException("Cannot initialize config", e);
+                               }
                                return super.addingService(reference);
                        }
                }.open();
        }
 
+       private void loadNoIpaJaasConfiguration() {
+               if (System.getProperty(KernelConstants.JAAS_CONFIG_PROP) == null) {
+                       String jaasConfig = KernelConstants.JAAS_CONFIG_NOIPA;
+                       URL url = getClass().getClassLoader().getResource(jaasConfig);
+                       KernelUtils.setJaasConfiguration(url);
+                       if (log.isDebugEnabled())
+                               log.debug("Set no-IPA JAAS configuration.");
+               }
+       }
+
        public void shutdown() {
+               if (nodeHttp != null)
+                       nodeHttp.destroy();
                if (deployConfig != null)
                        deployConfig.save();
        }
@@ -133,10 +185,13 @@ public class CmsDeployment implements NodeDeployment {
 
                // home
                prepareDataModel(KernelUtils.openAdminSession(deployedNodeRepository));
+       }
+
+       private void prepareHomeRepository(Repository deployedRepository) {
                Hashtable<String, String> regProps = new Hashtable<String, String>();
-               regProps.put(NodeConstants.CN, NodeConstants.ALIAS_HOME);
-               regProps.put(NodeConstants.JCR_REPOSITORY_ALIAS, NodeConstants.ALIAS_HOME);
-               homeRepository = new HomeRepository(deployedNodeRepository);
+               regProps.put(NodeConstants.CN, NodeConstants.HOME);
+               regProps.put(LEGACY_JCR_REPOSITORY_ALIAS, NodeConstants.HOME);
+               homeRepository = new HomeRepository(deployedRepository);
                // register
                bc.registerService(Repository.class, homeRepository, regProps);
 
@@ -148,7 +203,7 @@ public class CmsDeployment implements NodeDeployment {
                                CallbackHandler callbackHandler = bc.getService(reference);
                                nodeKeyring.setDefaultCallbackHandler(callbackHandler);
                                bc.registerService(LangUtils.names(CryptoKeyring.class, ManagedService.class), nodeKeyring,
-                                               LangUtils.init(Constants.SERVICE_PID, NodeConstants.NODE_KEYRING_PID));
+                                               LangUtils.dico(Constants.SERVICE_PID, NodeConstants.NODE_KEYRING_PID));
                                return callbackHandler;
                        }
 
@@ -204,9 +259,9 @@ public class CmsDeployment implements NodeDeployment {
 
                if (!asBoolean((String) attrs.get(DataModelNamespace.CAPABILITY_ABSTRACT_ATTRIBUTE))) {
                        Hashtable<String, Object> properties = new Hashtable<>();
-                       properties.put(NodeConstants.JCR_REPOSITORY_ALIAS, name);
+                       properties.put(LEGACY_JCR_REPOSITORY_ALIAS, name);
                        properties.put(NodeConstants.CN, name);
-                       if (name.equals(NodeConstants.ALIAS_NODE))
+                       if (name.equals(NodeConstants.NODE))
                                properties.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
                        LocalRepository localRepository = new LocalRepository(adminSession.getRepository(), capability);
                        bc.registerService(Repository.class, localRepository, properties);
@@ -244,10 +299,15 @@ 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(NodeConstants.ALIAS_NODE)) {
-                               prepareNodeRepository(nodeRepo.getRepository());
-                               nodeAvailable = true;
-                               checkReadiness();
+                       if (cn != null) {
+                               if (cn.equals(NodeConstants.NODE)) {
+                                       prepareNodeRepository(nodeRepo.getRepository());
+                                       prepareHomeRepository(nodeRepo.getRepository());
+                                       nodeAvailable = true;
+                                       checkReadiness();
+                               } else {
+                                       // TODO standalone
+                               }
                        }
                        return nodeRepo;
                }
@@ -262,46 +322,4 @@ public class CmsDeployment implements NodeDeployment {
 
        }
 
-       private class PrepareHttpStc extends ServiceTracker<HttpService, HttpService> {
-               private DataHttp dataHttp;
-               private NodeHttp nodeHttp;
-
-               public PrepareHttpStc() {
-                       super(bc, HttpService.class, null);
-               }
-
-               @Override
-               public HttpService addingService(ServiceReference<HttpService> reference) {
-                       HttpService httpService = addHttpService(reference);
-                       return httpService;
-               }
-
-               @Override
-               public void removedService(ServiceReference<HttpService> reference, HttpService service) {
-                       if (dataHttp != null)
-                               dataHttp.destroy();
-                       dataHttp = null;
-                       if (nodeHttp != null)
-                               nodeHttp.destroy();
-                       nodeHttp = null;
-               }
-
-               private HttpService addHttpService(ServiceReference<HttpService> sr) {
-                       HttpService httpService = bc.getService(sr);
-                       // TODO find constants
-                       Object httpPort = sr.getProperty("http.port");
-                       Object httpsPort = sr.getProperty("https.port");
-                       dataHttp = new DataHttp(httpService);
-                       nodeHttp = new NodeHttp(httpService, bc);
-                       log.info(httpPortsMsg(httpPort, httpsPort));
-                       httpAvailable = true;
-                       checkReadiness();
-                       return httpService;
-               }
-
-               private String httpPortsMsg(Object httpPort, Object httpsPort) {
-                       return "HTTP " + httpPort + (httpsPort != null ? " - HTTPS " + httpsPort : "");
-               }
-       }
-
 }