]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitNode.java
Introduce aggregating node user admin
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / JackrabbitNode.java
index 3bda38813b79b3ce69c6e590b459f389ec05547e..8ef16c44ffc6d88a68ce261cd90e4176e6830ae5 100644 (file)
@@ -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<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) {
@@ -48,11 +53,12 @@ class JackrabbitNode extends JackrabbitWrapper implements KernelConstants,
                }
        }
 
-       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() {
@@ -60,9 +66,8 @@ class JackrabbitNode extends JackrabbitWrapper implements KernelConstants,
                ((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,
@@ -104,8 +109,7 @@ class JackrabbitNode extends JackrabbitWrapper implements KernelConstants,
                Hashtable<String, Object> defaults = new Hashtable<String, Object>();
 
                // home
-               File osgiInstanceDir = KernelUtils
-                               .getOsgiInstanceDir(getBundleContext());
+               File osgiInstanceDir = KernelUtils.getOsgiInstanceDir();
                File homeDir = new File(osgiInstanceDir, "node");
                // home cannot be overridden
                defaults.put(RepositoryConfigurationParser.REPOSITORY_HOME_VARIABLE,
@@ -114,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;
@@ -140,33 +150,51 @@ 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(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;
        }
 }