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