X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FJackrabbitNode.java;h=8ef16c44ffc6d88a68ce261cd90e4176e6830ae5;hb=08fac35eeedb151c2fd1cc85ed4a36adf66e02fc;hp=627f26d0b05d4e21c4bfab202f9b58a14241db48;hpb=9b498d3407a628c8815d13f462962e2dd6c27b46;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitNode.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitNode.java index 627f26d0b..8ef16c44f 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitNode.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitNode.java @@ -15,13 +15,17 @@ import javax.jcr.RepositoryException; 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; @@ -31,15 +35,16 @@ class JackrabbitNode extends JackrabbitWrapper implements KernelConstants, ArgeoJcrConstants { private static Log log = LogFactory.getLog(JackrabbitNode.class); + private RepositoryContext repositoryContext; + private ServiceRegistration 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) { @@ -48,11 +53,12 @@ class JackrabbitNode extends JackrabbitWrapper implements KernelConstants, } } - public void publish() { + void publish(DefaultRepositoryRegister repositoryRegister) { Hashtable regProps = new Hashtable(); regProps.put(JCR_REPOSITORY_ALIAS, ALIAS_NODE); repositoryReg = getBundleContext().registerService(Repository.class, this, regProps); + repositoryRegister.register(this, regProps); } public void destroy() { @@ -60,9 +66,8 @@ class JackrabbitNode extends JackrabbitWrapper implements KernelConstants, ((RepositoryImpl) getRepository()).shutdown(); } - Dictionary getDefaults() { - return KernelUtils.asDictionary(getClass().getClassLoader(), - "/org/argeo/cms/internal/kernel/jackrabbit-node.properties"); + RepositoryStatisticsImpl getRepositoryStatistics() { + return repositoryContext.getRepositoryStatistics(); } private RepositoryConfig getConfiguration(JackrabbitNodeType type, @@ -113,6 +118,12 @@ class JackrabbitNode extends JackrabbitWrapper implements KernelConstants, // 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; @@ -139,33 +150,51 @@ class JackrabbitNode extends JackrabbitWrapper implements KernelConstants, private void setProp(Dictionary 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 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; } }