1 package org
.argeo
.cms
.internal
.kernel
;
3 import static org
.argeo
.node
.DataModelNamespace
.CMS_DATA_MODEL_NAMESPACE
;
5 import java
.io
.InputStreamReader
;
8 import java
.util
.Dictionary
;
9 import java
.util
.HashSet
;
10 import java
.util
.Hashtable
;
11 import java
.util
.List
;
15 import javax
.jcr
.Repository
;
16 import javax
.jcr
.Session
;
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
;
35 public class CmsDeployment
implements NodeDeployment
, ManagedService
{
36 private final Log log
= LogFactory
.getLog(getClass());
37 private final BundleContext bc
= FrameworkUtil
.getBundle(getClass()).getBundleContext();
39 private Repository deployedNodeRepository
;
40 private HomeRepository homeRepository
;
43 public void updated(Dictionary
<String
, ?
> properties
) throws ConfigurationException
{
44 if (properties
== null)
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
);
52 bc
.registerService(Repository
.class, homeRepository
, regProps
);
55 /** Session is logged out. */
56 private void prepareDataModel(Session adminSession
) {
58 Set
<String
> processed
= new HashSet
<String
>();
59 bundles
: for (Bundle bundle
: bc
.getBundles()) {
60 BundleWiring wiring
= bundle
.adapt(BundleWiring
.class);
62 if (log
.isTraceEnabled())
63 log
.error("No wiring for " + bundle
.getSymbolicName());
66 processWiring(adminSession
, wiring
, processed
);
69 JcrUtils
.logoutQuietly(adminSession
);
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);
80 List
<BundleCapability
> capabilities
= wiring
.getCapabilities(CMS_DATA_MODEL_NAMESPACE
);
81 for (BundleCapability capability
: capabilities
) {
82 registerCnd(adminSession
, capability
, processed
);
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");
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);
99 if (log
.isDebugEnabled())
100 log
.debug("Registered CND " + url
);
101 } catch (Exception e
) {
102 throw new CmsException("Cannot import CND " + url
, e
);
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
);
112 public void setDeployedNodeRepository(Repository deployedNodeRepository
) {
113 this.deployedNodeRepository
= deployedNodeRepository
;