]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/RepositoryContextsFactory.java
1a1fda1f08756c47aba039545be7abaeadfc8576
[lgpl/argeo-commons.git] / org.argeo.cms.jcr / src / org / argeo / cms / jcr / internal / RepositoryContextsFactory.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.jackrabbit.core.RepositoryContext;
12 import org.argeo.api.cms.CmsConstants;
13 import org.argeo.api.cms.CmsLog;
14 import org.argeo.cms.internal.jcr.RepoConf;
15 import org.argeo.cms.internal.jcr.RepositoryBuilder;
16 import org.argeo.cms.jcr.internal.osgi.CmsJcrActivator;
17 import org.argeo.util.LangUtils;
18 import org.osgi.framework.Constants;
19 import org.osgi.service.cm.ConfigurationException;
20 import org.osgi.service.cm.ManagedServiceFactory;
21
22 /** A {@link ManagedServiceFactory} creating or referencing JCR repositories. */
23 public class RepositoryContextsFactory implements ManagedServiceFactory {
24 private final static CmsLog log = CmsLog.getLog(RepositoryContextsFactory.class);
25 // private final BundleContext bc = FrameworkUtil.getBundle(RepositoryServiceFactory.class).getBundleContext();
26
27 private Map<String, RepositoryContext> repositories = new HashMap<String, RepositoryContext>();
28 private Map<String, Object> pidToCn = new HashMap<String, Object>();
29
30 public void init() {
31
32 }
33
34 public void destroy() {
35 for (String pid : repositories.keySet()) {
36 try {
37 repositories.get(pid).getRepository().shutdown();
38 if (log.isDebugEnabled())
39 log.debug("Shut down repository " + pid
40 + (pidToCn.containsKey(pid) ? " (" + pidToCn.get(pid) + ")" : ""));
41 } catch (Exception e) {
42 log.error("Error when shutting down Jackrabbit repository " + pid, e);
43 }
44 }
45 }
46
47
48 @Override
49 public String getName() {
50 return "Jackrabbit repository service factory";
51 }
52
53 @Override
54 public void updated(String pid, Dictionary<String, ?> properties) throws ConfigurationException {
55 if (repositories.containsKey(pid))
56 throw new IllegalArgumentException("Already a repository registered for " + pid);
57
58 if (properties == null)
59 return;
60
61 if (repositories.containsKey(pid)) {
62 log.warn("Ignore update of Jackrabbit repository " + pid);
63 return;
64 }
65
66 try {
67 Object labeledUri = properties.get(RepoConf.labeledUri.name());
68 if (labeledUri == null) {
69 RepositoryBuilder repositoryBuilder = new RepositoryBuilder();
70 RepositoryContext repositoryContext = repositoryBuilder.createRepositoryContext(properties);
71 repositories.put(pid, repositoryContext);
72 Dictionary<String, Object> props = LangUtils.dict(Constants.SERVICE_PID, pid);
73 // props.put(ArgeoJcrConstants.JCR_REPOSITORY_URI,
74 // properties.get(RepoConf.labeledUri.name()));
75 Object cn = properties.get(CmsConstants.CN);
76 if (cn != null) {
77 props.put(CmsConstants.CN, cn);
78 // props.put(NodeConstants.JCR_REPOSITORY_ALIAS, cn);
79 pidToCn.put(pid, cn);
80 }
81 CmsJcrActivator.registerService(RepositoryContext.class, repositoryContext, props);
82 } else {
83 try {
84 Object cn = properties.get(CmsConstants.CN);
85 Object defaultWorkspace = properties.get(RepoConf.defaultWorkspace.name());
86 if (defaultWorkspace == null)
87 defaultWorkspace = RepoConf.defaultWorkspace.getDefault();
88 URI uri = new URI(labeledUri.toString());
89 // RepositoryFactory repositoryFactory = bc
90 // .getService(bc.getServiceReference(RepositoryFactory.class));
91 RepositoryFactory repositoryFactory = CmsJcrActivator.getService(RepositoryFactory.class);
92 Map<String, String> parameters = new HashMap<String, String>();
93 parameters.put(RepoConf.labeledUri.name(), uri.toString());
94 parameters.put(RepoConf.defaultWorkspace.name(), defaultWorkspace.toString());
95 Repository repository = repositoryFactory.getRepository(parameters);
96 // Repository repository = NodeUtils.getRepositoryByUri(repositoryFactory,
97 // uri.toString());
98 Dictionary<String, Object> props = LangUtils.dict(Constants.SERVICE_PID, pid);
99 props.put(RepoConf.labeledUri.name(),
100 new URI(uri.getScheme(), null, uri.getHost(), uri.getPort(), uri.getPath(), null, null)
101 .toString());
102 if (cn != null) {
103 props.put(CmsConstants.CN, cn);
104 // props.put(NodeConstants.JCR_REPOSITORY_ALIAS, cn);
105 pidToCn.put(pid, cn);
106 }
107 CmsJcrActivator.registerService(Repository.class, repository, props);
108
109 // home
110 if (cn.equals(CmsConstants.NODE_REPOSITORY)) {
111 Dictionary<String, Object> homeProps = LangUtils.dict(CmsConstants.CN,
112 CmsConstants.EGO_REPOSITORY);
113 EgoRepository homeRepository = new EgoRepository(repository, true);
114 CmsJcrActivator.registerService(Repository.class, homeRepository, homeProps);
115 }
116 } catch (Exception e) {
117 // TODO Auto-generated catch block
118 e.printStackTrace();
119 }
120 }
121 } catch (Exception e) {
122 throw new IllegalStateException("Cannot create Jackrabbit repository " + pid, e);
123 }
124
125 }
126
127 @Override
128 public void deleted(String pid) {
129 RepositoryContext repositoryContext = repositories.remove(pid);
130 repositoryContext.getRepository().shutdown();
131 if (log.isDebugEnabled())
132 log.debug("Deleted repository " + pid);
133 }
134
135
136 }