Introduce Jackrabbit cache customization
authorMathieu Baudier <mbaudier@argeo.org>
Tue, 24 Feb 2015 23:52:29 +0000 (23:52 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Tue, 24 Feb 2015 23:52:29 +0000 (23:52 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@7949 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitNode.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java

index 627f26d0b05d4e21c4bfab202f9b58a14241db48..e31e8af7d043b86be05630747f753c5b261b154c 100644 (file)
@@ -15,7 +15,9 @@ 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.argeo.ArgeoException;
@@ -31,15 +33,17 @@ class JackrabbitNode extends JackrabbitWrapper implements KernelConstants,
                ArgeoJcrConstants {
        private static Log log = LogFactory.getLog(JackrabbitNode.class);
 
+       @SuppressWarnings("unused")
+       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) {
@@ -139,33 +143,54 @@ class JackrabbitNode extends JackrabbitWrapper implements KernelConstants,
 
        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(KernelConstants.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;
+               // RepositoryImpl repository;
                //
                // Actual repository creation
                //
-               repository = RepositoryImpl.create(repositoryConfig);
+               RepositoryContext repositoryContext = RepositoryContext
+                               .create(repositoryConfig);
+               // repository = repositoryContext.getRepository();
+               // repository = RepositoryImpl.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;
        }
 }
index 299b912da6670236f3a494a9932fd158bb20e430..b3c0c519661c49ee0f6561eda12691ad9a68444a 100644 (file)
@@ -13,6 +13,7 @@ public interface KernelConstants {
        final static String REPO_DBUSER = "argeo.node.repo.dbuser";
        final static String REPO_DBPASSWORD = "argeo.node.repo.dbpassword";
        final static String REPO_MAX_POOL_SIZE = "argeo.node.repo.maxPoolSize";
+       final static String REPO_MAX_CACHE_MB = "argeo.node.repo.maxCacheMB";
 
        final static String[] DEFAULT_CNDS = { "/org/argeo/jcr/argeo.cnd",
                        "/org/argeo/cms/cms.cnd" };