1 package org
.argeo
.cms
.internal
.kernel
;
3 import java
.util
.Dictionary
;
4 import java
.util
.HashMap
;
7 import org
.apache
.commons
.logging
.Log
;
8 import org
.apache
.commons
.logging
.LogFactory
;
9 import org
.apache
.jackrabbit
.core
.RepositoryContext
;
10 import org
.argeo
.cms
.CmsException
;
11 import org
.argeo
.jcr
.ArgeoJcrConstants
;
12 import org
.argeo
.node
.NodeConstants
;
13 import org
.argeo
.util
.LangUtils
;
14 import org
.osgi
.framework
.BundleContext
;
15 import org
.osgi
.framework
.Constants
;
16 import org
.osgi
.framework
.FrameworkUtil
;
17 import org
.osgi
.service
.cm
.ConfigurationException
;
18 import org
.osgi
.service
.cm
.ManagedServiceFactory
;
20 class RepositoryServiceFactory
implements ManagedServiceFactory
{
21 private final static Log log
= LogFactory
.getLog(RepositoryServiceFactory
.class);
22 private final BundleContext bc
= FrameworkUtil
.getBundle(RepositoryServiceFactory
.class).getBundleContext();
24 private Map
<String
, RepositoryContext
> repositories
= new HashMap
<String
, RepositoryContext
>();
25 private Map
<String
, Object
> pidToCn
= new HashMap
<String
, Object
>();
28 public String
getName() {
29 return "Jackrabbit repository service factory";
33 public void updated(String pid
, Dictionary
<String
, ?
> properties
) throws ConfigurationException
{
34 if (repositories
.containsKey(pid
))
35 throw new CmsException("Already a repository registered for " + pid
);
37 if (properties
== null)
40 if (repositories
.containsKey(pid
)) {
41 log
.warn("Ignore update of Jackrabbit repository " + pid
);
46 RepositoryBuilder repositoryBuilder
= new RepositoryBuilder();
47 RepositoryContext repositoryContext
= repositoryBuilder
.createRepositoryContext(properties
);
48 repositories
.put(pid
, repositoryContext
);
49 Dictionary
<String
, Object
> props
= LangUtils
.init(Constants
.SERVICE_PID
, pid
);
50 // props.put(ArgeoJcrConstants.JCR_REPOSITORY_URI,
51 // properties.get(RepoConf.labeledUri.name()));
52 Object cn
= properties
.get(NodeConstants
.CN
);
54 props
.put(NodeConstants
.CN
, cn
);
55 props
.put(ArgeoJcrConstants
.JCR_REPOSITORY_ALIAS
, cn
);
58 bc
.registerService(RepositoryContext
.class, repositoryContext
, props
);
59 } catch (Exception e
) {
60 throw new CmsException("Cannot create Jackrabbit repository " + pid
, e
);
66 public void deleted(String pid
) {
67 RepositoryContext repositoryContext
= repositories
.remove(pid
);
68 repositoryContext
.getRepository().shutdown();
69 if (log
.isDebugEnabled())
70 log
.debug("Deleted repository " + pid
);
73 public void shutdown() {
74 for (String pid
: repositories
.keySet()) {
76 repositories
.get(pid
).getRepository().shutdown();
77 if (log
.isDebugEnabled())
78 log
.debug("Shut down repository " + pid
79 + (pidToCn
.containsKey(pid
) ?
" (" + pidToCn
.get(pid
) + ")" : ""));
80 } catch (Exception e
) {
81 log
.error("Error when shutting down Jackrabbit repository " + pid
, e
);