X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FCmsDeployment.java;h=28e2ef9387bb121759b7eca6fc3ec5410d565210;hb=6ecc30c54a64fb658aa7949349b05d655ff386a8;hp=e30249f3c63fcbbe751b4ea2ed4923558952c946;hpb=0243aa5633af84d8608ba912483dbaaaefac42f1;p=lgpl%2Fargeo-commons.git 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 e30249f3c..28e2ef938 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,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,15 +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(); @@ -54,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; @@ -68,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(bc, NodeHttp.class, null) { + + @Override + public NodeHttp addingService(ServiceReference reference) { + httpAvailable = true; + checkReadiness(); + return super.addingService(reference); + } + }.open(); new RepositoryContextStc().open(); new ServiceTracker(bc, UserAdmin.class, null) { @Override @@ -88,12 +102,49 @@ 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); + // if (log.isDebugEnabled()) + // log.debug("Standalone repo cn: " + cn); + // } + Configuration[] 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("Found realm: " + realm); + hasDomain = true; + } + } + if (hasDomain) { + loadIpaJaasConfiguration(); + } + } catch (Exception e) { + throw new CmsException("Cannot initialize config", e); + } return super.addingService(reference); } }.open(); } + private void loadIpaJaasConfiguration() { + if (System.getProperty(KernelConstants.JAAS_CONFIG_PROP) == null) { + String jaasConfig = KernelConstants.JAAS_CONFIG_IPA; + URL url = getClass().getClassLoader().getResource(jaasConfig); + KernelUtils.setJaasConfiguration(url); + log.debug("Set IPA JAAS configuration."); + } + } + public void shutdown() { + if (nodeHttp != null) + nodeHttp.destroy(); if (deployConfig != null) deployConfig.save(); } @@ -107,25 +158,25 @@ public class CmsDeployment implements NodeDeployment { long initDuration = System.currentTimeMillis() - begin; if (log.isTraceEnabled()) log.trace("Kernel initialization took " + initDuration + "ms"); - directorsCut(initDuration); + tributeToFreeSoftware(initDuration); } } - final private void directorsCut(long initDuration) { - // final long ms = 128l + (long) (Math.random() * 128d); - long ms = initDuration / 100; - log.info("Spend " + ms + "ms" + " reflecting on the progress brought to mankind" + " by Free Software..."); - long beginNano = System.nanoTime(); - try { - Thread.sleep(ms, 0); - } catch (InterruptedException e) { - // silent + final private void tributeToFreeSoftware(long initDuration) { + if (log.isTraceEnabled()) { + long ms = initDuration / 100; + log.trace("Spend " + ms + "ms" + " reflecting on the progress brought to mankind" + " by Free Software..."); + long beginNano = System.nanoTime(); + try { + Thread.sleep(ms, 0); + } catch (InterruptedException e) { + // silent + } + long durationNano = System.nanoTime() - beginNano; + final double M = 1000d * 1000d; + double sleepAccuracy = ((double) durationNano) / (ms * M); + log.trace("Sleep accuracy: " + String.format("%.2f", 100 - (sleepAccuracy * 100 - 100)) + " %"); } - long durationNano = System.nanoTime() - beginNano; - final double M = 1000d * 1000d; - double sleepAccuracy = ((double) durationNano) / (ms * M); - if (log.isDebugEnabled()) - log.debug("Sleep accuracy: " + String.format("%.2f", 100 - (sleepAccuracy * 100 - 100)) + " %"); } private void prepareNodeRepository(Repository deployedNodeRepository) { @@ -184,11 +235,11 @@ public class CmsDeployment implements NodeDeployment { } List 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 processed) { + private void registerDataModelCapability(Session adminSession, BundleCapability capability, Set processed) { Map attrs = capability.getAttributes(); String name = (String) attrs.get(DataModelNamespace.CAPABILITY_NAME_ATTRIBUTE); if (processed.contains(name)) { @@ -196,15 +247,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))) { @@ -255,7 +312,7 @@ public class CmsDeployment implements NodeDeployment { prepareHomeRepository(nodeRepo.getRepository()); nodeAvailable = true; checkReadiness(); - }else{ + } else { // TODO standalone } } @@ -272,46 +329,4 @@ public class CmsDeployment implements NodeDeployment { } - private class PrepareHttpStc extends ServiceTracker { - private DataHttp dataHttp; - private NodeHttp nodeHttp; - - public PrepareHttpStc() { - super(bc, HttpService.class, null); - } - - @Override - public HttpService addingService(ServiceReference reference) { - HttpService httpService = addHttpService(reference); - return httpService; - } - - @Override - public void removedService(ServiceReference reference, HttpService service) { - if (dataHttp != null) - dataHttp.destroy(); - dataHttp = null; - if (nodeHttp != null) - nodeHttp.destroy(); - nodeHttp = null; - } - - private HttpService addHttpService(ServiceReference 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 : ""); - } - } - }