import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.jackrabbit.core.RepositoryContext;
import org.apache.jackrabbit.core.RepositoryImpl;
+import org.apache.jackrabbit.core.cache.CacheManager;
import org.apache.jackrabbit.core.config.RepositoryConfig;
import org.apache.jackrabbit.core.config.RepositoryConfigurationParser;
+import org.apache.jackrabbit.stats.RepositoryStatisticsImpl;
import org.argeo.ArgeoException;
import org.argeo.cms.CmsException;
import org.argeo.jackrabbit.JackrabbitWrapper;
import org.argeo.jcr.ArgeoJcrConstants;
+import org.argeo.jcr.DefaultRepositoryRegister;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
import org.xml.sax.InputSource;
ArgeoJcrConstants {
private static Log log = LogFactory.getLog(JackrabbitNode.class);
+ private RepositoryContext repositoryContext;
+
private ServiceRegistration<Repository> repositoryReg;
public JackrabbitNode(BundleContext bundleContext) {
setBundleContext(bundleContext);
- // TODO with OSGi CM
- JackrabbitNodeType type = JackrabbitNodeType.valueOf(System
- .getProperty(REPO_TYPE, h2.name()));
+ JackrabbitNodeType type = JackrabbitNodeType.valueOf(prop(REPO_TYPE,
+ h2.name()));
try {
- createNode(type);
+ repositoryContext = createNode(type);
setCndFiles(Arrays.asList(DEFAULT_CNDS));
prepareDataModel();
} catch (Exception e) {
}
}
- public void publish() {
+ void publish(DefaultRepositoryRegister repositoryRegister) {
Hashtable<String, String> regProps = new Hashtable<String, String>();
regProps.put(JCR_REPOSITORY_ALIAS, ALIAS_NODE);
repositoryReg = getBundleContext().registerService(Repository.class,
this, regProps);
+ repositoryRegister.register(this, regProps);
}
public void destroy() {
((RepositoryImpl) getRepository()).shutdown();
}
- Dictionary<String, ?> getDefaults() {
- return KernelUtils.asDictionary(getClass().getClassLoader(),
- "/org/argeo/cms/internal/kernel/jackrabbit-node.properties");
+ RepositoryStatisticsImpl getRepositoryStatistics() {
+ return repositoryContext.getRepositoryStatistics();
}
private RepositoryConfig getConfiguration(JackrabbitNodeType type,
// common
setProp(defaults, REPO_DEFAULT_WORKSPACE, "main");
setProp(defaults, REPO_MAX_POOL_SIZE, "10");
+ // Jackrabbit defaults
+ setProp(defaults, REPO_BUNDLE_CACHE_MB, "8");
+ // See http://wiki.apache.org/jackrabbit/Search
+ setProp(defaults, REPO_EXTRACTOR_POOL_SIZE, "0");
+ setProp(defaults, REPO_SEARCH_CACHE_SIZE, "1000");
+ setProp(defaults, REPO_MAX_VOLATILE_INDEX_SIZE, "1048576");
// specific
String dburl;
private void setProp(Dictionary<String, Object> props, String key,
String defaultValue) {
- // TODO use OSGi CM instead of System properties
- String value = System.getProperty(key, defaultValue);
+ String value = prop(key, defaultValue);
props.put(key, value);
}
- private void createNode(JackrabbitNodeType type) throws RepositoryException {
+ private String prop(String key, String defaultValue) {
+ // TODO use OSGi CM instead of Framework/System properties
+ return KernelUtils.getFrameworkProp(key, defaultValue);
+ }
+
+ private RepositoryContext createNode(JackrabbitNodeType type)
+ throws RepositoryException {
Hashtable<String, Object> vars = getConfigurationProperties(type);
RepositoryConfig repositoryConfig = getConfiguration(type, vars);
- RepositoryImpl repository = createJackrabbitRepository(repositoryConfig);
+ RepositoryContext repositoryContext = createJackrabbitRepository(repositoryConfig);
+ RepositoryImpl repository = repositoryContext.getRepository();
+
+ // cache
+ String maxCacheMbStr = prop(REPO_MAX_CACHE_MB, null);
+ if (maxCacheMbStr != null) {
+ Integer maxCacheMB = Integer.parseInt(maxCacheMbStr);
+ CacheManager cacheManager = repository.getCacheManager();
+ cacheManager.setMaxMemory(maxCacheMB * 1024l * 1024l);
+ cacheManager.setMaxMemoryPerCache((maxCacheMB / 4) * 1024l * 1024l);
+ }
+
+ // wrap the repository
setRepository(repository);
+ return repositoryContext;
}
- private RepositoryImpl createJackrabbitRepository(
+ private RepositoryContext createJackrabbitRepository(
RepositoryConfig repositoryConfig) throws RepositoryException {
File homeDirectory = null;
long begin = System.currentTimeMillis();
- RepositoryImpl repository;
//
// Actual repository creation
//
- repository = RepositoryImpl.create(repositoryConfig);
+ RepositoryContext repositoryContext = RepositoryContext
+ .create(repositoryConfig);
double duration = ((double) (System.currentTimeMillis() - begin)) / 1000;
if (log.isTraceEnabled())
log.trace("Created Jackrabbit repository in " + duration
+ " s, home: " + homeDirectory);
- return repository;
+ return repositoryContext;
}
}