]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeRepository.java
Improve social networking
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / NodeRepository.java
1 package org.argeo.cms.internal.kernel;
2
3 import static org.argeo.cms.internal.kernel.JackrabbitNodeType.h2;
4
5 import java.io.File;
6 import java.io.InputStream;
7 import java.util.Arrays;
8 import java.util.Dictionary;
9 import java.util.Hashtable;
10 import java.util.Properties;
11
12 import javax.jcr.RepositoryException;
13
14 import org.apache.commons.io.IOUtils;
15 import org.apache.commons.logging.Log;
16 import org.apache.commons.logging.LogFactory;
17 import org.apache.jackrabbit.core.RepositoryContext;
18 import org.apache.jackrabbit.core.RepositoryImpl;
19 import org.apache.jackrabbit.core.cache.CacheManager;
20 import org.apache.jackrabbit.core.config.RepositoryConfig;
21 import org.apache.jackrabbit.core.config.RepositoryConfigurationParser;
22 import org.apache.jackrabbit.stats.RepositoryStatisticsImpl;
23 import org.argeo.ArgeoException;
24 import org.argeo.cms.CmsException;
25 import org.argeo.jackrabbit.JackrabbitWrapper;
26 import org.argeo.jcr.ArgeoJcrConstants;
27 import org.xml.sax.InputSource;
28
29 /** Jacrabbit based data layer */
30 class NodeRepository extends JackrabbitWrapper implements KernelConstants,
31 ArgeoJcrConstants {
32 private static Log log = LogFactory.getLog(NodeRepository.class);
33
34 private RepositoryContext repositoryContext;
35
36 public NodeRepository() {
37 setBundleContext(Activator.getBundleContext());
38 JackrabbitNodeType type = JackrabbitNodeType.valueOf(prop(REPO_TYPE,
39 h2.name()));
40 try {
41 repositoryContext = createNode(type);
42 setCndFiles(Arrays.asList(DEFAULT_CNDS));
43 prepareDataModel();
44 } catch (Exception e) {
45 throw new ArgeoException(
46 "Cannot create Jackrabbit repository of type " + type, e);
47 }
48 }
49
50 public void destroy() {
51 ((RepositoryImpl) getRepository()).shutdown();
52 }
53
54 RepositoryStatisticsImpl getRepositoryStatistics() {
55 return repositoryContext.getRepositoryStatistics();
56 }
57
58 private RepositoryConfig getConfiguration(JackrabbitNodeType type,
59 Hashtable<String, Object> vars) throws RepositoryException {
60 ClassLoader cl = getClass().getClassLoader();
61 InputStream in = null;
62 try {
63 final String base = "/org/argeo/cms/internal/kernel";
64 switch (type) {
65 case h2:
66 in = cl.getResourceAsStream(base + "/repository-h2.xml");
67 break;
68 case postgresql:
69 in = cl.getResourceAsStream(base + "/repository-postgresql.xml");
70 break;
71 case memory:
72 in = cl.getResourceAsStream(base + "/repository-memory.xml");
73 break;
74 default:
75 throw new CmsException("Unsupported node type " + type);
76 }
77
78 if (in == null)
79 throw new CmsException("Repository configuration not found");
80 InputSource config = new InputSource(in);
81 Properties jackrabbitProps = new Properties();
82 jackrabbitProps.putAll(vars);
83 RepositoryConfig repositoryConfig = RepositoryConfig.create(config,
84 jackrabbitProps);
85 return repositoryConfig;
86 } finally {
87 IOUtils.closeQuietly(in);
88 }
89 }
90
91 private Hashtable<String, Object> getConfigurationProperties(
92 JackrabbitNodeType type) {
93 // use Hashtable to ease integration with Properties
94 Hashtable<String, Object> defaults = new Hashtable<String, Object>();
95
96 // home
97 File osgiInstanceDir = KernelUtils.getOsgiInstanceDir();
98 File homeDir = new File(osgiInstanceDir, DIR_NODE);
99 // home cannot be overridden
100 defaults.put(RepositoryConfigurationParser.REPOSITORY_HOME_VARIABLE,
101 homeDir.getAbsolutePath());
102
103 // common
104 setProp(defaults, REPO_DEFAULT_WORKSPACE, "main");
105 setProp(defaults, REPO_MAX_POOL_SIZE, "10");
106 // Jackrabbit defaults
107 setProp(defaults, REPO_BUNDLE_CACHE_MB, "8");
108 // See http://wiki.apache.org/jackrabbit/Search
109 setProp(defaults, REPO_EXTRACTOR_POOL_SIZE, "0");
110 setProp(defaults, REPO_SEARCH_CACHE_SIZE, "1000");
111 setProp(defaults, REPO_MAX_VOLATILE_INDEX_SIZE, "1048576");
112
113 // specific
114 String dburl;
115 switch (type) {
116 case h2:
117 dburl = "jdbc:h2:" + homeDir.getPath() + "/h2/repository";
118 setProp(defaults, REPO_DBURL, dburl);
119 setProp(defaults, REPO_DBUSER, "sa");
120 setProp(defaults, REPO_DBPASSWORD, "");
121 break;
122 case postgresql:
123 dburl = "jdbc:postgresql://localhost/demo";
124 setProp(defaults, REPO_DBURL, dburl);
125 setProp(defaults, REPO_DBUSER, "argeo");
126 setProp(defaults, REPO_DBPASSWORD, "argeo");
127 break;
128 case memory:
129 break;
130 default:
131 throw new CmsException("Unsupported node type " + type);
132 }
133 return defaults;
134 }
135
136 private void setProp(Dictionary<String, Object> props, String key,
137 String defaultValue) {
138 String value = prop(key, defaultValue);
139 props.put(key, value);
140 }
141
142 private String prop(String key, String defaultValue) {
143 // TODO use OSGi CM instead of Framework/System properties
144 return KernelUtils.getFrameworkProp(key, defaultValue);
145 }
146
147 private RepositoryContext createNode(JackrabbitNodeType type)
148 throws RepositoryException {
149 Hashtable<String, Object> vars = getConfigurationProperties(type);
150 RepositoryConfig repositoryConfig = getConfiguration(type, vars);
151 RepositoryContext repositoryContext = createJackrabbitRepository(repositoryConfig);
152 RepositoryImpl repository = repositoryContext.getRepository();
153
154 // cache
155 String maxCacheMbStr = prop(REPO_MAX_CACHE_MB, null);
156 if (maxCacheMbStr != null) {
157 Integer maxCacheMB = Integer.parseInt(maxCacheMbStr);
158 CacheManager cacheManager = repository.getCacheManager();
159 cacheManager.setMaxMemory(maxCacheMB * 1024l * 1024l);
160 cacheManager.setMaxMemoryPerCache((maxCacheMB / 4) * 1024l * 1024l);
161 }
162
163 // wrap the repository
164 setRepository(repository);
165 return repositoryContext;
166 }
167
168 private RepositoryContext createJackrabbitRepository(
169 RepositoryConfig repositoryConfig) throws RepositoryException {
170 long begin = System.currentTimeMillis();
171 //
172 // Actual repository creation
173 //
174 RepositoryContext repositoryContext = RepositoryContext
175 .create(repositoryConfig);
176
177 double duration = ((double) (System.currentTimeMillis() - begin)) / 1000;
178 if (log.isTraceEnabled())
179 log.trace("Created Jackrabbit repository in " + duration
180 + " s, home: " + repositoryConfig.getHomeDir());
181
182 return repositoryContext;
183 }
184 }