1 package org
.argeo
.cms
.internal
.jcr
;
4 import java
.net
.URISyntaxException
;
5 import java
.util
.Dictionary
;
6 import java
.util
.HashMap
;
7 import java
.util
.Hashtable
;
10 import javax
.jcr
.Repository
;
11 import javax
.jcr
.RepositoryException
;
12 import javax
.jcr
.RepositoryFactory
;
14 import org
.argeo
.api
.cms
.CmsDeployment
;
15 import org
.argeo
.api
.cms
.CmsLog
;
16 import org
.argeo
.api
.cms
.CmsConstants
;
17 import org
.argeo
.jackrabbit
.client
.ClientDavexRepositoryFactory
;
18 import org
.argeo
.jcr
.JcrException
;
19 import org
.argeo
.util
.naming
.LdapAttrs
;
20 import org
.osgi
.framework
.BundleContext
;
21 import org
.osgi
.framework
.Constants
;
22 import org
.osgi
.framework
.FrameworkUtil
;
24 /** JCR specific init utilities. */
25 public class JcrInitUtils
{
26 private final static CmsLog log
= CmsLog
.getLog(JcrInitUtils
.class);
27 private final static BundleContext bundleContext
= FrameworkUtil
.getBundle(JcrInitUtils
.class).getBundleContext();
29 public static void addToDeployment(CmsDeployment nodeDeployment
) {
31 // Dictionary<String, Object> provided = null;
32 Dictionary
<String
, Object
> provided
= nodeDeployment
.getProps(CmsConstants
.NODE_REPOS_FACTORY_PID
,
34 Dictionary
<String
, Object
> nodeConfig
= JcrInitUtils
.getNodeRepositoryConfig(provided
);
35 // node repository is mandatory
36 nodeDeployment
.addFactoryDeployConfig(CmsConstants
.NODE_REPOS_FACTORY_PID
, nodeConfig
);
38 // additional repositories
39 // dataModels: for (DataModels.DataModel dataModel : dataModels.getNonAbstractDataModels()) {
40 // if (NodeConstants.NODE_REPOSITORY.equals(dataModel.getName()))
41 // continue dataModels;
42 // Dictionary<String, Object> config = JcrInitUtils.getRepositoryConfig(dataModel.getName(),
43 // getProps(NodeConstants.NODE_REPOS_FACTORY_PID, dataModel.getName()));
44 // if (config.size() != 0)
45 // putFactoryDeployConfig(NodeConstants.NODE_REPOS_FACTORY_PID, config);
50 /** Override the provided config with the framework properties */
51 public static Dictionary
<String
, Object
> getNodeRepositoryConfig(Dictionary
<String
, Object
> provided
) {
52 Dictionary
<String
, Object
> props
= provided
!= null ? provided
: new Hashtable
<String
, Object
>();
53 for (RepoConf repoConf
: RepoConf
.values()) {
54 Object value
= getFrameworkProp(CmsConstants
.NODE_REPO_PROP_PREFIX
+ repoConf
.name());
56 props
.put(repoConf
.name(), value
);
57 if (log
.isDebugEnabled())
58 log
.debug("Set node repo configuration " + repoConf
.name() + " to " + value
);
61 props
.put(CmsConstants
.CN
, CmsConstants
.NODE_REPOSITORY
);
65 public static Dictionary
<String
, Object
> getRepositoryConfig(String dataModelName
,
66 Dictionary
<String
, Object
> provided
) {
67 if (dataModelName
.equals(CmsConstants
.NODE_REPOSITORY
) || dataModelName
.equals(CmsConstants
.EGO_REPOSITORY
))
68 throw new IllegalArgumentException("Data model '" + dataModelName
+ "' is reserved.");
69 Dictionary
<String
, Object
> props
= provided
!= null ? provided
: new Hashtable
<String
, Object
>();
70 for (RepoConf repoConf
: RepoConf
.values()) {
71 Object value
= getFrameworkProp(
72 CmsConstants
.NODE_REPOS_PROP_PREFIX
+ dataModelName
+ '.' + repoConf
.name());
74 props
.put(repoConf
.name(), value
);
75 if (log
.isDebugEnabled())
76 log
.debug("Set " + dataModelName
+ " repo configuration " + repoConf
.name() + " to " + value
);
79 if (props
.size() != 0)
80 props
.put(CmsConstants
.CN
, dataModelName
);
84 private static void registerRemoteInit(String uri
) {
86 Repository repository
= createRemoteRepository(new URI(uri
));
87 Hashtable
<String
, Object
> properties
= new Hashtable
<>();
88 properties
.put(CmsConstants
.CN
, CmsConstants
.NODE_INIT
);
89 properties
.put(LdapAttrs
.labeledURI
.name(), uri
);
90 properties
.put(Constants
.SERVICE_RANKING
, -1000);
91 bundleContext
.registerService(Repository
.class, repository
, properties
);
92 } catch (RepositoryException e
) {
93 throw new JcrException(e
);
94 } catch (URISyntaxException e
) {
95 throw new IllegalArgumentException(e
);
99 private static Repository
createRemoteRepository(URI uri
) throws RepositoryException
{
100 RepositoryFactory repositoryFactory
= new ClientDavexRepositoryFactory();
101 Map
<String
, String
> params
= new HashMap
<String
, String
>();
102 params
.put(ClientDavexRepositoryFactory
.JACKRABBIT_DAVEX_URI
, uri
.toString());
103 // TODO make it configurable
104 params
.put(ClientDavexRepositoryFactory
.JACKRABBIT_REMOTE_DEFAULT_WORKSPACE
, CmsConstants
.SYS_WORKSPACE
);
105 return repositoryFactory
.getRepository(params
);
108 private static String
getFrameworkProp(String key
, String def
) {
110 if (bundleContext
!= null)
111 value
= bundleContext
.getProperty(key
);
113 value
= System
.getProperty(key
);
119 private static String
getFrameworkProp(String key
) {
120 return getFrameworkProp(key
, null);