X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FCmsDeployment.java;h=917b15a9a94c9baef9290d8d7b11c153eb08b003;hb=edc4ee1ac076ecae5ed1df60b5e2b0633e547608;hp=7f547fd11eed767a5bb609751ed3ee7bdb788a05;hpb=6a62c05a487ba34946b1924a039603e68b1d54e6;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 7f547fd11..917b15a9a 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 @@ -2,6 +2,7 @@ package org.argeo.cms.internal.kernel; import static org.argeo.node.DataModelNamespace.CMS_DATA_MODEL_NAMESPACE; +import java.io.File; import java.io.InputStreamReader; import java.io.Reader; import java.lang.management.ManagementFactory; @@ -44,11 +45,13 @@ 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 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(); + private DataModels dataModels; private DeployConfig deployConfig; private HomeRepository homeRepository; @@ -72,7 +75,8 @@ public class CmsDeployment implements NodeDeployment { NodeState nodeState = bc.getService(nodeStateSr); cleanState = nodeState.isClean(); - nodeHttp = new NodeHttp(); + nodeHttp = new NodeHttp(cleanState); + dataModels = new DataModels(bc); initTrackers(); } @@ -86,11 +90,11 @@ public class CmsDeployment implements NodeDeployment { return super.addingService(reference); } }; -// httpSt.open(); + // httpSt.open(); KernelUtils.asyncOpen(httpSt); ServiceTracker repoContextSt = new RepositoryContextStc(); -// repoContextSt.open(); + // repoContextSt.open(); KernelUtils.asyncOpen(repoContextSt); ServiceTracker userAdminSt = new ServiceTracker(bc, UserAdmin.class, null) { @@ -101,7 +105,7 @@ public class CmsDeployment implements NodeDeployment { return super.addingService(reference); } }; -// userAdminSt.open(); + // userAdminSt.open(); KernelUtils.asyncOpen(userAdminSt); ServiceTracker confAdminSt = new ServiceTracker(bc, @@ -109,7 +113,7 @@ public class CmsDeployment implements NodeDeployment { @Override public ConfigurationAdmin addingService(ServiceReference reference) { ConfigurationAdmin configurationAdmin = bc.getService(reference); - deployConfig = new DeployConfig(configurationAdmin, cleanState); + deployConfig = new DeployConfig(configurationAdmin, dataModels, cleanState); httpExpected = deployConfig.getProps(KernelConstants.JETTY_FACTORY_PID, "default") != null; try { // Configuration[] configs = configurationAdmin @@ -140,7 +144,7 @@ public class CmsDeployment implements NodeDeployment { return super.addingService(reference); } }; -// confAdminSt.open(); + // confAdminSt.open(); KernelUtils.asyncOpen(confAdminSt); } @@ -204,13 +208,13 @@ public class CmsDeployment implements NodeDeployment { } // home - prepareDataModel(KernelUtils.openAdminSession(deployedNodeRepository)); + prepareDataModel(NodeConstants.NODE, KernelUtils.openAdminSession(deployedNodeRepository)); } private void prepareHomeRepository(Repository deployedRepository) { Hashtable regProps = new Hashtable(); regProps.put(NodeConstants.CN, NodeConstants.HOME); - regProps.put(LEGACY_JCR_REPOSITORY_ALIAS, NodeConstants.HOME); + // regProps.put(LEGACY_JCR_REPOSITORY_ALIAS, NodeConstants.HOME); homeRepository = new HomeRepository(deployedRepository); // register bc.registerService(Repository.class, homeRepository, regProps); @@ -231,36 +235,45 @@ public class CmsDeployment implements NodeDeployment { } /** Session is logged out. */ - private void prepareDataModel(Session adminSession) { + private void prepareDataModel(String cn, Session adminSession) { try { Set processed = new HashSet(); bundles: for (Bundle bundle : bc.getBundles()) { BundleWiring wiring = bundle.adapt(BundleWiring.class); if (wiring == null) continue bundles; - processWiring(adminSession, wiring, processed); + if (NodeConstants.NODE.equals(cn))// process all data models + processWiring(cn, adminSession, wiring, processed); + else { + List capabilities = wiring.getCapabilities(CMS_DATA_MODEL_NAMESPACE); + for (BundleCapability capability : capabilities) { + String dataModelName = (String) capability.getAttributes().get(DataModelNamespace.NAME); + if (dataModelName.equals(cn))// process only own data model + processWiring(cn, adminSession, wiring, processed); + } + } } } finally { JcrUtils.logoutQuietly(adminSession); } } - private void processWiring(Session adminSession, BundleWiring wiring, Set processed) { + private void processWiring(String cn, Session adminSession, BundleWiring wiring, Set processed) { // recursively process requirements first List requiredWires = wiring.getRequiredWires(CMS_DATA_MODEL_NAMESPACE); for (BundleWire wire : requiredWires) { - processWiring(adminSession, wire.getProviderWiring(), processed); - // registerCnd(adminSession, wire.getCapability(), processed); + processWiring(cn, adminSession, wire.getProviderWiring(), processed); } List capabilities = wiring.getCapabilities(CMS_DATA_MODEL_NAMESPACE); for (BundleCapability capability : capabilities) { - registerDataModelCapability(adminSession, capability, processed); + registerDataModelCapability(cn, adminSession, capability, processed); } } - private void registerDataModelCapability(Session adminSession, BundleCapability capability, Set processed) { + private void registerDataModelCapability(String cn, Session adminSession, BundleCapability capability, + Set processed) { Map attrs = capability.getAttributes(); - String name = (String) attrs.get(DataModelNamespace.CAPABILITY_NAME_ATTRIBUTE); + String name = (String) attrs.get(DataModelNamespace.NAME); if (processed.contains(name)) { if (log.isTraceEnabled()) log.trace("Data model " + name + " has already been processed"); @@ -268,24 +281,41 @@ public class CmsDeployment implements NodeDeployment { } // CND - String path = (String) attrs.get(DataModelNamespace.CAPABILITY_CND_ATTRIBUTE); + String path = (String) attrs.get(DataModelNamespace.CND); 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); + File dataModel = bc.getBundle().getDataFile("dataModels/" + path); + if (!dataModel.exists()) { + 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); + dataModel.getParentFile().mkdirs(); + dataModel.createNewFile(); + 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))) { + if (KernelUtils.asBoolean((String) attrs.get(DataModelNamespace.ABSTRACT))) + return; + // Non abstract + boolean isStandalone = deployConfig.isStandalone(name); + boolean publishLocalRepo; + if (isStandalone && name.equals(cn))// includes the node itself + publishLocalRepo = true; + else if (!isStandalone && cn.equals(NodeConstants.NODE)) + publishLocalRepo = true; + else + publishLocalRepo = false; + + if (publishLocalRepo) { Hashtable properties = new Hashtable<>(); - properties.put(LEGACY_JCR_REPOSITORY_ALIAS, name); + // properties.put(LEGACY_JCR_REPOSITORY_ALIAS, name); properties.put(NodeConstants.CN, name); if (name.equals(NodeConstants.NODE)) properties.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE); @@ -296,20 +326,6 @@ public class CmsDeployment implements NodeDeployment { } } - 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 public Long getAvailableSince() { return availableSince; @@ -323,19 +339,20 @@ public class CmsDeployment implements NodeDeployment { @Override public RepositoryContext addingService(ServiceReference reference) { - RepositoryContext nodeRepo = bc.getService(reference); - Object cn = reference.getProperty(NodeConstants.CN); + RepositoryContext repoContext = bc.getService(reference); + String cn = (String) reference.getProperty(NodeConstants.CN); if (cn != null) { if (cn.equals(NodeConstants.NODE)) { - prepareNodeRepository(nodeRepo.getRepository()); - prepareHomeRepository(nodeRepo.getRepository()); + prepareNodeRepository(repoContext.getRepository()); + // TODO separate home repository + prepareHomeRepository(repoContext.getRepository()); nodeAvailable = true; checkReadiness(); } else { - // TODO standalone + prepareDataModel(cn, KernelUtils.openAdminSession(repoContext.getRepository())); } } - return nodeRepo; + return repoContext; } @Override