]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryServiceFactory.java
Remove JCR servlet.
[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.net.URI;
4 import java.util.Dictionary;
5 import java.util.HashMap;
6 import java.util.Map;
7
8 import javax.jcr.Repository;
9 import javax.jcr.RepositoryFactory;
10
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;
24
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();
28
29 private Map<String, RepositoryContext> repositories = new HashMap<String, RepositoryContext>();
30 private Map<String, Object> pidToCn = new HashMap<String, Object>();
31
32 @Override
33 public String getName() {
34 return "Jackrabbit repository service factory";
35 }
36
37 @Override
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);
41
42 if (properties == null)
43 return;
44
45 if (repositories.containsKey(pid)) {
46 log.warn("Ignore update of Jackrabbit repository " + pid);
47 return;
48 }
49
50 try {
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);
60 if (cn != null) {
61 props.put(NodeConstants.CN, cn);
62 // props.put(NodeConstants.JCR_REPOSITORY_ALIAS, cn);
63 pidToCn.put(pid, cn);
64 }
65 bc.registerService(RepositoryContext.class, repositoryContext, props);
66 } else {
67 try {
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,
80 // uri.toString());
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)
84 .toString());
85 if (cn != null) {
86 props.put(NodeConstants.CN, cn);
87 // props.put(NodeConstants.JCR_REPOSITORY_ALIAS, cn);
88 pidToCn.put(pid, cn);
89 }
90 bc.registerService(Repository.class, repository, props);
91
92 // home
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);
98 }
99 } catch (Exception e) {
100 // TODO Auto-generated catch block
101 e.printStackTrace();
102 }
103 }
104 } catch (Exception e) {
105 throw new CmsException("Cannot create Jackrabbit repository " + pid, e);
106 }
107
108 }
109
110 @Override
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);
116 }
117
118 public void shutdown() {
119 for (String pid : repositories.keySet()) {
120 try {
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);
127 }
128 }
129 }
130 }