]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryServiceFactory.java
Fix automated Kerberos config
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / RepositoryServiceFactory.java
1 package org.argeo.cms.internal.kernel;
2
3 import java.util.Dictionary;
4 import java.util.HashMap;
5 import java.util.Map;
6
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.cms.internal.jcr.RepositoryBuilder;
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;
19
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();
23
24 private Map<String, RepositoryContext> repositories = new HashMap<String, RepositoryContext>();
25 private Map<String, Object> pidToCn = new HashMap<String, Object>();
26
27 @Override
28 public String getName() {
29 return "Jackrabbit repository service factory";
30 }
31
32 @Override
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);
36
37 if (properties == null)
38 return;
39
40 if (repositories.containsKey(pid)) {
41 log.warn("Ignore update of Jackrabbit repository " + pid);
42 return;
43 }
44
45 try {
46 RepositoryBuilder repositoryBuilder = new RepositoryBuilder();
47 RepositoryContext repositoryContext = repositoryBuilder.createRepositoryContext(properties);
48 repositories.put(pid, repositoryContext);
49 Dictionary<String, Object> props = LangUtils.dico(Constants.SERVICE_PID, pid);
50 // props.put(ArgeoJcrConstants.JCR_REPOSITORY_URI,
51 // properties.get(RepoConf.labeledUri.name()));
52 Object cn = properties.get(NodeConstants.CN);
53 if (cn != null) {
54 props.put(NodeConstants.CN, cn);
55 // props.put(NodeConstants.JCR_REPOSITORY_ALIAS, cn);
56 pidToCn.put(pid, cn);
57 }
58 bc.registerService(RepositoryContext.class, repositoryContext, props);
59 } catch (Exception e) {
60 throw new CmsException("Cannot create Jackrabbit repository " + pid, e);
61 }
62
63 }
64
65 @Override
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);
71 }
72
73 public void shutdown() {
74 for (String pid : repositories.keySet()) {
75 try {
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);
82 }
83 }
84 }
85 }