]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java
6fbe7a95c50964d5a4489b978456359fb879303d
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / CmsDeployment.java
1 package org.argeo.cms.internal.kernel;
2
3 import static org.argeo.node.DataModelNamespace.CMS_DATA_MODEL_NAMESPACE;
4
5 import java.io.InputStreamReader;
6 import java.io.Reader;
7 import java.net.URL;
8 import java.util.Dictionary;
9 import java.util.HashSet;
10 import java.util.Hashtable;
11 import java.util.List;
12 import java.util.Map;
13 import java.util.Set;
14
15 import javax.jcr.Repository;
16 import javax.jcr.Session;
17
18 import org.apache.commons.logging.Log;
19 import org.apache.commons.logging.LogFactory;
20 import org.apache.jackrabbit.commons.cnd.CndImporter;
21 import org.argeo.cms.CmsException;
22 import org.argeo.jcr.ArgeoJcrConstants;
23 import org.argeo.jcr.JcrUtils;
24 import org.argeo.node.DataModelNamespace;
25 import org.argeo.node.NodeDeployment;
26 import org.osgi.framework.Bundle;
27 import org.osgi.framework.BundleContext;
28 import org.osgi.framework.FrameworkUtil;
29 import org.osgi.framework.wiring.BundleCapability;
30 import org.osgi.framework.wiring.BundleWire;
31 import org.osgi.framework.wiring.BundleWiring;
32 import org.osgi.service.cm.ConfigurationException;
33 import org.osgi.service.cm.ManagedService;
34
35 public class CmsDeployment implements NodeDeployment, ManagedService {
36 private final Log log = LogFactory.getLog(getClass());
37 private final BundleContext bc = FrameworkUtil.getBundle(getClass()).getBundleContext();
38
39 private Repository deployedNodeRepository;
40 private HomeRepository homeRepository;
41
42 @Override
43 public void updated(Dictionary<String, ?> properties) throws ConfigurationException {
44 if (properties == null)
45 return;
46
47 prepareDataModel(KernelUtils.openAdminSession(deployedNodeRepository));
48 Hashtable<String, String> regProps = new Hashtable<String, String>();
49 regProps.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS, ArgeoJcrConstants.ALIAS_HOME);
50 homeRepository = new HomeRepository(deployedNodeRepository);
51 // register
52 bc.registerService(Repository.class, homeRepository, regProps);
53 }
54
55 /** Session is logged out. */
56 private void prepareDataModel(Session adminSession) {
57 try {
58 Set<String> processed = new HashSet<String>();
59 bundles: for (Bundle bundle : bc.getBundles()) {
60 BundleWiring wiring = bundle.adapt(BundleWiring.class);
61 if (wiring == null) {
62 if (log.isTraceEnabled())
63 log.error("No wiring for " + bundle.getSymbolicName());
64 continue bundles;
65 }
66 processWiring(adminSession, wiring, processed);
67 }
68 } finally {
69 JcrUtils.logoutQuietly(adminSession);
70 }
71 }
72
73 private void processWiring(Session adminSession, BundleWiring wiring, Set<String> processed) {
74 // recursively process requirements first
75 List<BundleWire> requiredWires = wiring.getRequiredWires(CMS_DATA_MODEL_NAMESPACE);
76 for (BundleWire wire : requiredWires) {
77 processWiring(adminSession, wire.getProviderWiring(), processed);
78 // registerCnd(adminSession, wire.getCapability(), processed);
79 }
80 List<BundleCapability> capabilities = wiring.getCapabilities(CMS_DATA_MODEL_NAMESPACE);
81 for (BundleCapability capability : capabilities) {
82 registerCnd(adminSession, capability, processed);
83 }
84 }
85
86 private void registerCnd(Session adminSession, BundleCapability capability, Set<String> processed) {
87 Map<String, Object> attrs = capability.getAttributes();
88 String name = attrs.get(DataModelNamespace.CAPABILITY_NAME_ATTRIBUTE).toString();
89 if (processed.contains(name)) {
90 if (log.isTraceEnabled())
91 log.trace("Data model " + name + " has already been processed");
92 return;
93 }
94 String path = attrs.get(DataModelNamespace.CAPABILITY_CND_ATTRIBUTE).toString();
95 URL url = capability.getRevision().getBundle().getResource(path);
96 try (Reader reader = new InputStreamReader(url.openStream())) {
97 CndImporter.registerNodeTypes(reader, adminSession, true);
98 processed.add(name);
99 if (log.isDebugEnabled())
100 log.debug("Registered CND " + url);
101 } catch (Exception e) {
102 throw new CmsException("Cannot import CND " + url, e);
103 }
104
105 Hashtable<String, Object> properties = new Hashtable<>();
106 properties.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS, name);
107 bc.registerService(Repository.class, adminSession.getRepository(), properties);
108 if (log.isDebugEnabled())
109 log.debug("Published data model " + name);
110 }
111
112 public void setDeployedNodeRepository(Repository deployedNodeRepository) {
113 this.deployedNodeRepository = deployedNodeRepository;
114 }
115
116
117 }