Make Jackrabbit node type configurable
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 16 Feb 2015 11:35:58 +0000 (11:35 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 16 Feb 2015 11:35:58 +0000 (11:35 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@7894 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

org.argeo.cms/bnd.bnd
org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitNode.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitNodeType.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitNodeTypes.java [deleted file]
org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/jackrabbit-node.properties

index af1220832d27623b4ec5e3086d2f9c95fb4ebd0a..c7f8c7416ebd875cf1dc353aa22e7242544f5172 100644 (file)
@@ -15,6 +15,7 @@ org.eclipse.swt;resolution:=optional,\
 org.eclipse.jface.window;resolution:=optional,\
 org.eclipse.swt.widgets;resolution:=optional,\
 org.h2;resolution:=optional,\
+org.postgresql;resolution:=optional,\
 org.apache.commons.vfs2.*;resolution:=optional,\
 org.apache.jackrabbit.*;resolution:=optional,\
 org.springframework.ldap.*;resolution:=optional,\
index e36f713563d384601519060c83287819c1040be8..3bda38813b79b3ce69c6e590b459f389ec05547e 100644 (file)
@@ -1,5 +1,7 @@
 package org.argeo.cms.internal.kernel;
 
+import static org.argeo.cms.internal.kernel.JackrabbitNodeType.h2;
+
 import java.io.File;
 import java.io.InputStream;
 import java.util.Arrays;
@@ -8,6 +10,7 @@ import java.util.Hashtable;
 import java.util.Properties;
 
 import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
@@ -16,29 +19,38 @@ import org.apache.jackrabbit.core.RepositoryImpl;
 import org.apache.jackrabbit.core.config.RepositoryConfig;
 import org.apache.jackrabbit.core.config.RepositoryConfigurationParser;
 import org.argeo.ArgeoException;
+import org.argeo.cms.CmsException;
 import org.argeo.jackrabbit.JackrabbitWrapper;
 import org.argeo.jcr.ArgeoJcrConstants;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
 import org.xml.sax.InputSource;
 
-/** Data storage */
-class JackrabbitNode extends JackrabbitWrapper {
+/** Jacrabbit based data layer */
+class JackrabbitNode extends JackrabbitWrapper implements KernelConstants,
+               ArgeoJcrConstants {
        private static Log log = LogFactory.getLog(JackrabbitNode.class);
 
        private ServiceRegistration<Repository> repositoryReg;
 
        public JackrabbitNode(BundleContext bundleContext) {
                setBundleContext(bundleContext);
-               createNode();
-               setCndFiles(Arrays.asList(KernelConstants.DEFAULT_CNDS));
-               prepareDataModel();
+               // TODO with OSGi CM
+               JackrabbitNodeType type = JackrabbitNodeType.valueOf(System
+                               .getProperty(REPO_TYPE, h2.name()));
+               try {
+                       createNode(type);
+                       setCndFiles(Arrays.asList(DEFAULT_CNDS));
+                       prepareDataModel();
+               } catch (Exception e) {
+                       throw new ArgeoException(
+                                       "Cannot create Jackrabbit repository of type " + type, e);
+               }
        }
 
        public void publish() {
                Hashtable<String, String> regProps = new Hashtable<String, String>();
-               regProps.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS,
-                               ArgeoJcrConstants.ALIAS_NODE);
+               regProps.put(JCR_REPOSITORY_ALIAS, ALIAS_NODE);
                repositoryReg = getBundleContext().registerService(Repository.class,
                                this, regProps);
        }
@@ -53,81 +65,108 @@ class JackrabbitNode extends JackrabbitWrapper {
                                "/org/argeo/cms/internal/kernel/jackrabbit-node.properties");
        }
 
-       InputSource getConfigurationXml(JackrabbitNodeTypes type) {
+       private RepositoryConfig getConfiguration(JackrabbitNodeType type,
+                       Hashtable<String, Object> vars) throws RepositoryException {
                ClassLoader cl = getClass().getClassLoader();
-               InputStream in = cl
-                               .getResourceAsStream("/org/argeo/cms/internal/kernel/repository-h2.xml");
-               return new InputSource(in);
-       }
-
-       Properties getDefaultConfigurationProperties() {
-               Properties configurationProperties = new Properties();
-               configurationProperties.setProperty(KernelConstants.REPO_DBUSER, "sa");
-               configurationProperties
-                               .setProperty(KernelConstants.REPO_DBPASSWORD, "");
-               configurationProperties.setProperty(KernelConstants.REPO_MAX_POOL_SIZE,
-                               "10");
-               configurationProperties.setProperty(
-                               KernelConstants.REPO_DEFAULT_WORKSPACE, "main");
-               return configurationProperties;
+               InputStream in = null;
+               try {
+                       final String base = "/org/argeo/cms/internal/kernel";
+                       switch (type) {
+                       case h2:
+                               in = cl.getResourceAsStream(base + "/repository-h2.xml");
+                               break;
+                       case postgresql:
+                               in = cl.getResourceAsStream(base + "/repository-postgresql.xml");
+                               break;
+                       case memory:
+                               in = cl.getResourceAsStream(base + "/repository-memory.xml");
+                               break;
+                       default:
+                               throw new CmsException("Unsupported node type " + type);
+                       }
+
+                       if (in == null)
+                               throw new CmsException("Repository configuration not found");
+                       InputSource config = new InputSource(in);
+                       Properties jackrabbitProps = new Properties();
+                       jackrabbitProps.putAll(vars);
+                       RepositoryConfig repositoryConfig = RepositoryConfig.create(config,
+                                       jackrabbitProps);
+                       return repositoryConfig;
+               } finally {
+                       IOUtils.closeQuietly(in);
+               }
        }
 
-       private void createNode() {
-               Thread.currentThread().setContextClassLoader(
-                               getClass().getClassLoader());
+       private Hashtable<String, Object> getConfigurationProperties(
+                       JackrabbitNodeType type) {
+               // use Hashtable to ease integration with Properties
+               Hashtable<String, Object> defaults = new Hashtable<String, Object>();
 
+               // home
                File osgiInstanceDir = KernelUtils
                                .getOsgiInstanceDir(getBundleContext());
                File homeDir = new File(osgiInstanceDir, "node");
-
-               // H2
-               String dburl = "jdbc:h2:" + homeDir.getPath() + "/h2/repository";
-               Properties configurationProperties = getDefaultConfigurationProperties();
-               configurationProperties.setProperty(KernelConstants.REPO_DBURL, dburl);
-               configurationProperties.put(
-                               RepositoryConfigurationParser.REPOSITORY_HOME_VARIABLE,
+               // home cannot be overridden
+               defaults.put(RepositoryConfigurationParser.REPOSITORY_HOME_VARIABLE,
                                homeDir.getAbsolutePath());
-               // InputSource configurationXml = getConfigurationXml(null);
 
-               // jackrabbitContainer.setHomeDirectory(homeDir);
-               // jackrabbitContainer.setConfigurationProperties(configurationProperties);
-               // jackrabbitContainer.setConfigurationXml(configurationXml);
-
-               // jackrabbitContainer.init();
+               // common
+               setProp(defaults, REPO_DEFAULT_WORKSPACE, "main");
+               setProp(defaults, REPO_MAX_POOL_SIZE, "10");
+
+               // specific
+               String dburl;
+               switch (type) {
+               case h2:
+                       dburl = "jdbc:h2:" + homeDir.getPath() + "/h2/repository";
+                       setProp(defaults, REPO_DBURL, dburl);
+                       setProp(defaults, REPO_DBUSER, "sa");
+                       setProp(defaults, REPO_DBPASSWORD, "");
+                       break;
+               case postgresql:
+                       dburl = "jdbc:postgresql://localhost/demo";
+                       setProp(defaults, REPO_DBURL, dburl);
+                       setProp(defaults, REPO_DBUSER, "argeo");
+                       setProp(defaults, REPO_DBPASSWORD, "argeo");
+                       break;
+               case memory:
+                       break;
+               default:
+                       throw new CmsException("Unsupported node type " + type);
+               }
+               return defaults;
+       }
 
-               RepositoryImpl repository = createJackrabbitRepository(
-                               configurationProperties, getConfigurationXml(null));
+       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);
+               props.put(key, value);
+       }
 
+       private void createNode(JackrabbitNodeType type) throws RepositoryException {
+               Hashtable<String, Object> vars = getConfigurationProperties(type);
+               RepositoryConfig repositoryConfig = getConfiguration(type, vars);
+               RepositoryImpl repository = createJackrabbitRepository(repositoryConfig);
                setRepository(repository);
        }
 
-       private RepositoryImpl createJackrabbitRepository(Properties vars,
-                       InputSource config) {
+       private RepositoryImpl createJackrabbitRepository(
+                       RepositoryConfig repositoryConfig) throws RepositoryException {
                File homeDirectory = null;
                long begin = System.currentTimeMillis();
-               InputStream configurationIn = null;
                RepositoryImpl repository;
-               try {
-                       RepositoryConfig repositoryConfig = RepositoryConfig.create(config,
-                                       vars);
+               //
+               // Actual repository creation
+               //
+               repository = RepositoryImpl.create(repositoryConfig);
 
-                       //
-                       // Actual repository creation
-                       //
-                       repository = RepositoryImpl.create(repositoryConfig);
+               double duration = ((double) (System.currentTimeMillis() - begin)) / 1000;
+               if (log.isTraceEnabled())
+                       log.trace("Created Jackrabbit repository in " + duration
+                                       + " s, home: " + homeDirectory);
 
-                       double duration = ((double) (System.currentTimeMillis() - begin)) / 1000;
-                       if (log.isTraceEnabled())
-                               log.trace("Created Jackrabbit repository in " + duration
-                                               + " s, home: " + homeDirectory);
-
-                       return repository;
-               } catch (Exception e) {
-                       throw new ArgeoException("Cannot create Jackrabbit repository "
-                                       + homeDirectory, e);
-               } finally {
-                       IOUtils.closeQuietly(configurationIn);
-               }
+               return repository;
        }
-
 }
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitNodeType.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitNodeType.java
new file mode 100644 (file)
index 0000000..026af09
--- /dev/null
@@ -0,0 +1,6 @@
+package org.argeo.cms.internal.kernel;
+
+/** The available Jackrabbit node types */
+public enum JackrabbitNodeType {
+       NOT_CONFIGURED, h2, postgresql, memory;
+}
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitNodeTypes.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitNodeTypes.java
deleted file mode 100644 (file)
index 1a84cae..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.argeo.cms.internal.kernel;
-
-enum JackrabbitNodeTypes {
-       NOT_CONFIGURED, h2, postgresql, memory;
-}
index 62efa364de3d470cd48b26b976f7be9033375efd..ad6ca084a345b20fa4f621b0bca45e719edf4cce 100644 (file)
@@ -41,6 +41,12 @@ final class Kernel {
        }
 
        void init() {
+               ClassLoader currentContextCl = Thread.currentThread()
+                               .getContextClassLoader();
+               // We use the CMS bundle classloader during initialization
+               Thread.currentThread().setContextClassLoader(
+                               Kernel.class.getClassLoader());
+
                long begin = System.currentTimeMillis();
                InternalAuthentication initAuth = new InternalAuthentication(
                                KernelConstants.DEFAULT_SECURITY_KEY);
@@ -61,6 +67,8 @@ final class Kernel {
                } catch (Exception e) {
                        log.error("Cannot initialize Argeo CMS", e);
                        throw new ArgeoException("Cannot initialize", e);
+               } finally {
+                       Thread.currentThread().setContextClassLoader(currentContextCl);
                }
 
                long jvmUptime = ManagementFactory.getRuntimeMXBean().getUptime();
index 79fd1f77a40b086e733ae4c0c5ce39ad3d7b0c0d..c93caa23dc3f358d93fd7383b7d8431d5c596532 100644 (file)
@@ -6,7 +6,8 @@ public interface KernelConstants {
 
        // Node
        final static String REPO_HOME = "argeo.node.repo.home";
-       final static String REPO_CONFIGURATION = "argeo.node.repo.configuration";
+       final static String REPO_TYPE = "argeo.node.repo.type";
+       // final static String REPO_CONFIGURATION = "argeo.node.repo.configuration";
        final static String REPO_DEFAULT_WORKSPACE = "argeo.node.repo.defaultWorkspace";
        final static String REPO_DBURL = "argeo.node.repo.dburl";
        final static String REPO_DBUSER = "argeo.node.repo.dbuser";
@@ -29,6 +30,7 @@ public interface KernelConstants {
        final static String PATH_REMOTING_PRIVATE = PATH_DATA + "/jcr";
 
        // RWT / RAP
-       final static String PATH_WORKBENCH_PUBLIC = "/ui/public";
+       final static String PATH_WORKBENCH = "/ui";
+       final static String PATH_WORKBENCH_PUBLIC = PATH_WORKBENCH + "/public";
 
 }
index c7ab79dbe0f47fde0f54f9c0c824dc956f6e460c..88972970424ad19aa19e627b66b165b52c6c253f 100644 (file)
@@ -1,3 +1,6 @@
+### OLD APPROACH, NOT USED
+### HERE FOR REFERENCE, WILL BE REMOVED
+
 # Workspace used by the node session
 argeo.node.repo.defaultWorkspace=main
 #argeo.node.repo.securityWorkspace=security