1 package org
.argeo
.cms
.internal
.kernel
;
4 import java
.util
.Dictionary
;
5 import java
.util
.HashMap
;
8 import javax
.jcr
.Repository
;
9 import javax
.jcr
.RepositoryFactory
;
11 import org
.apache
.commons
.logging
.Log
;
12 import org
.apache
.commons
.logging
.LogFactory
;
13 import org
.apache
.jackrabbit
.core
.RepositoryContext
;
14 import org
.argeo
.cms
.CmsException
;
15 import org
.argeo
.cms
.internal
.jcr
.RepoConf
;
16 import org
.argeo
.cms
.internal
.jcr
.RepositoryBuilder
;
17 import org
.argeo
.node
.NodeConstants
;
18 import org
.argeo
.util
.LangUtils
;
19 import org
.osgi
.framework
.BundleContext
;
20 import org
.osgi
.framework
.Constants
;
21 import org
.osgi
.framework
.FrameworkUtil
;
22 import org
.osgi
.service
.cm
.ConfigurationException
;
23 import org
.osgi
.service
.cm
.ManagedServiceFactory
;
25 class RepositoryServiceFactory
implements ManagedServiceFactory
{
26 private final static Log log
= LogFactory
.getLog(RepositoryServiceFactory
.class);
27 private final BundleContext bc
= FrameworkUtil
.getBundle(RepositoryServiceFactory
.class).getBundleContext();
29 private Map
<String
, RepositoryContext
> repositories
= new HashMap
<String
, RepositoryContext
>();
30 private Map
<String
, Object
> pidToCn
= new HashMap
<String
, Object
>();
33 public String
getName() {
34 return "Jackrabbit repository service factory";
38 public void updated(String pid
, Dictionary
<String
, ?
> properties
) throws ConfigurationException
{
39 if (repositories
.containsKey(pid
))
40 throw new CmsException("Already a repository registered for " + pid
);
42 if (properties
== null)
45 if (repositories
.containsKey(pid
)) {
46 log
.warn("Ignore update of Jackrabbit repository " + pid
);
51 Object labeledUri
= properties
.get(RepoConf
.labeledUri
.name());
52 if (labeledUri
== null) {
53 RepositoryBuilder repositoryBuilder
= new RepositoryBuilder();
54 RepositoryContext repositoryContext
= repositoryBuilder
.createRepositoryContext(properties
);
55 repositories
.put(pid
, repositoryContext
);
56 Dictionary
<String
, Object
> props
= LangUtils
.dico(Constants
.SERVICE_PID
, pid
);
57 // props.put(ArgeoJcrConstants.JCR_REPOSITORY_URI,
58 // properties.get(RepoConf.labeledUri.name()));
59 Object cn
= properties
.get(NodeConstants
.CN
);
61 props
.put(NodeConstants
.CN
, cn
);
62 // props.put(NodeConstants.JCR_REPOSITORY_ALIAS, cn);
65 bc
.registerService(RepositoryContext
.class, repositoryContext
, props
);
68 Object cn
= properties
.get(NodeConstants
.CN
);
69 Object defaultWorkspace
= properties
.get(RepoConf
.defaultWorkspace
.name());
70 if (defaultWorkspace
== null)
71 defaultWorkspace
= RepoConf
.defaultWorkspace
.getDefault();
72 URI uri
= new URI(labeledUri
.toString());
73 RepositoryFactory repositoryFactory
= bc
74 .getService(bc
.getServiceReference(RepositoryFactory
.class));
75 Map
<String
, String
> parameters
= new HashMap
<String
, String
>();
76 parameters
.put(RepoConf
.labeledUri
.name(), uri
.toString());
77 parameters
.put(RepoConf
.defaultWorkspace
.name(), defaultWorkspace
.toString());
78 Repository repository
= repositoryFactory
.getRepository(parameters
);
79 // Repository repository = NodeUtils.getRepositoryByUri(repositoryFactory,
81 Dictionary
<String
, Object
> props
= LangUtils
.dico(Constants
.SERVICE_PID
, pid
);
82 props
.put(RepoConf
.labeledUri
.name(),
83 new URI(uri
.getScheme(), null, uri
.getHost(), uri
.getPort(), uri
.getPath(), null, null)
86 props
.put(NodeConstants
.CN
, cn
);
87 // props.put(NodeConstants.JCR_REPOSITORY_ALIAS, cn);
90 bc
.registerService(Repository
.class, repository
, props
);
93 // TODO make a sperate home configurable
94 if (cn
.equals(NodeConstants
.NODE
)) {
95 Dictionary
<String
, Object
> homeProps
= LangUtils
.dico(NodeConstants
.CN
, NodeConstants
.HOME
);
96 HomeRepository homeRepository
= new HomeRepository(repository
, true);
97 bc
.registerService(Repository
.class, homeRepository
, homeProps
);
99 } catch (Exception e
) {
100 // TODO Auto-generated catch block
104 } catch (Exception e
) {
105 throw new CmsException("Cannot create Jackrabbit repository " + pid
, e
);
111 public void deleted(String pid
) {
112 RepositoryContext repositoryContext
= repositories
.remove(pid
);
113 repositoryContext
.getRepository().shutdown();
114 if (log
.isDebugEnabled())
115 log
.debug("Deleted repository " + pid
);
118 public void shutdown() {
119 for (String pid
: repositories
.keySet()) {
121 repositories
.get(pid
).getRepository().shutdown();
122 if (log
.isDebugEnabled())
123 log
.debug("Shut down repository " + pid
124 + (pidToCn
.containsKey(pid
) ?
" (" + pidToCn
.get(pid
) + ")" : ""));
125 } catch (Exception e
) {
126 log
.error("Error when shutting down Jackrabbit repository " + pid
, e
);