]> git.argeo.org Git - lgpl/argeo-commons.git/blob - RepositoryServiceFactory.java
2a47d120cfcd99c294332b28d1499c77133c8dd2
[lgpl/argeo-commons.git] / RepositoryServiceFactory.java
1 package org.argeo.cms.jcr.internal;
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.api.NodeConstants;
15 import org.argeo.cms.internal.jcr.RepoConf;
16 import org.argeo.cms.internal.jcr.RepositoryBuilder;
17 import org.argeo.cms.jcr.internal.osgi.CmsJcrActivator;
18 import org.argeo.util.LangUtils;
19 import org.osgi.framework.Constants;
20 import org.osgi.service.cm.ConfigurationException;
21 import org.osgi.service.cm.ManagedServiceFactory;
22
23 /** A {@link ManagedServiceFactory} creating or referencing JCR repositories. */
24 public class RepositoryServiceFactory implements ManagedServiceFactory {
25 private final static Log log = LogFactory.getLog(RepositoryServiceFactory.class);
26 // private final BundleContext bc = FrameworkUtil.getBundle(RepositoryServiceFactory.class).getBundleContext();
27
28 private Map<String, RepositoryContext> repositories = new HashMap<String, RepositoryContext>();
29 private Map<String, Object> pidToCn = new HashMap<String, Object>();
30
31 @Override
32 public String getName() {
33 return "Jackrabbit repository service factory";
34 }
35
36 @Override
37 public void updated(String pid, Dictionary<String, ?> properties) throws ConfigurationException {
38 if (repositories.containsKey(pid))
39 throw new IllegalArgumentException("Already a repository registered for " + pid);
40
41 if (properties == null)
42 return;
43
44 if (repositories.containsKey(pid)) {
45 log.warn("Ignore update of Jackrabbit repository " + pid);
46 return;
47 }
48
49 try {
50 Object labeledUri = properties.get(RepoConf.labeledUri.name());
51 if (labeledUri == null) {
52 RepositoryBuilder repositoryBuilder = new RepositoryBuilder();
53 RepositoryContext repositoryContext = repositoryBuilder.createRepositoryContext(properties);
54 repositories.put(pid, repositoryContext);
55 Dictionary<String, Object> props = LangUtils.dict(Constants.SERVICE_PID, pid);
56 // props.put(ArgeoJcrConstants.JCR_REPOSITORY_URI,
57 // properties.get(RepoConf.labeledUri.name()));
58 Object cn = properties.get(NodeConstants.CN);
59 if (cn != null) {
60 props.put(NodeConstants.CN, cn);
61 // props.put(NodeConstants.JCR_REPOSITORY_ALIAS, cn);
62 pidToCn.put(pid, cn);
63 }
64 CmsJcrActivator.registerService(RepositoryContext.class, repositoryContext, props);
65 } else {
66 try {
67 Object cn = properties.get(NodeConstants.CN);
68 Object defaultWorkspace = properties.get(RepoConf.defaultWorkspace.name());
69 if (defaultWorkspace == null)
70 defaultWorkspace = RepoConf.defaultWorkspace.getDefault();
71 URI uri = new URI(labeledUri.toString());
72 // RepositoryFactory repositoryFactory = bc
73 // .getService(bc.getServiceReference(RepositoryFactory.class));
74 RepositoryFactory repositoryFactory = CmsJcrActivator.getService(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.dict(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 CmsJcrActivator.registerService(Repository.class, repository, props);
91
92 // home
93 if (cn.equals(NodeConstants.NODE_REPOSITORY)) {
94 Dictionary<String, Object> homeProps = LangUtils.dict(NodeConstants.CN,
95 NodeConstants.EGO_REPOSITORY);
96 EgoRepository homeRepository = new EgoRepository(repository, true);
97 CmsJcrActivator.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 IllegalStateException("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
131 }