X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;ds=inline;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FCmsDeployment.java;h=d2d89522fec99aff5a642a7b5191f00a4df98494;hb=fd8f2c91e47d38445ba9702b40559939162f666d;hp=7a180cfc5287adf5612ea3deaaf9d65162d8a112;hpb=277bb126a4b8523b93c2cd9abd345833a8387eba;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 7a180cfc5..d2d89522f 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 @@ -14,18 +14,20 @@ import java.util.Set; import javax.jcr.Repository; import javax.jcr.Session; +import javax.security.auth.callback.CallbackHandler; import org.apache.commons.logging.Log; 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; import org.argeo.node.NodeDeployment; import org.argeo.node.NodeState; +import org.argeo.node.security.CryptoKeyring; +import org.argeo.util.LangUtils; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; @@ -35,6 +37,7 @@ 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.cm.ManagedService; import org.osgi.service.http.HttpService; import org.osgi.service.useradmin.UserAdmin; import org.osgi.util.tracker.ServiceTracker; @@ -128,13 +131,28 @@ public class CmsDeployment implements NodeDeployment { throw new CmsException("Deployment is already available"); } + // home prepareDataModel(KernelUtils.openAdminSession(deployedNodeRepository)); Hashtable regProps = new Hashtable(); - 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); + + new ServiceTracker(bc, CallbackHandler.class, null) { + + @Override + public CallbackHandler addingService(ServiceReference reference) { + NodeKeyRing nodeKeyring = new NodeKeyRing(homeRepository); + CallbackHandler callbackHandler = bc.getService(reference); + nodeKeyring.setDefaultCallbackHandler(callbackHandler); + bc.registerService(LangUtils.names(CryptoKeyring.class, ManagedService.class), nodeKeyring, + LangUtils.dico(Constants.SERVICE_PID, NodeConstants.NODE_KEYRING_PID)); + return callbackHandler; + } + + }.open(); } /** Session is logged out. */ @@ -143,11 +161,8 @@ public class CmsDeployment implements NodeDeployment { Set processed = new HashSet(); 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 { @@ -170,13 +185,13 @@ public class CmsDeployment implements NodeDeployment { private void registerCnd(Session adminSession, BundleCapability capability, Set processed) { Map 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); @@ -187,14 +202,31 @@ public class CmsDeployment implements NodeDeployment { throw new CmsException("Cannot import CND " + url, e); } - Hashtable 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 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 @@ -212,7 +244,7 @@ public class CmsDeployment implements NodeDeployment { public RepositoryContext addingService(ServiceReference 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();