From a97f3e970dcf503523c9bbaa1ce0cc0a64239edb Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Mon, 16 Feb 2015 11:35:58 +0000 Subject: [PATCH] Make Jackrabbit node type configurable git-svn-id: https://svn.argeo.org/commons/trunk@7894 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- org.argeo.cms/bnd.bnd | 1 + .../cms/internal/kernel/JackrabbitNode.java | 167 +++++++++++------- ...NodeTypes.java => JackrabbitNodeType.java} | 3 +- .../org/argeo/cms/internal/kernel/Kernel.java | 8 + .../cms/internal/kernel/KernelConstants.java | 6 +- .../kernel/jackrabbit-node.properties | 3 + 6 files changed, 121 insertions(+), 67 deletions(-) rename org.argeo.cms/src/org/argeo/cms/internal/kernel/{JackrabbitNodeTypes.java => JackrabbitNodeType.java} (52%) diff --git a/org.argeo.cms/bnd.bnd b/org.argeo.cms/bnd.bnd index af1220832..c7f8c7416 100644 --- a/org.argeo.cms/bnd.bnd +++ b/org.argeo.cms/bnd.bnd @@ -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,\ 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 e36f71356..3bda38813 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 @@ -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 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 regProps = new Hashtable(); - 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 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 getConfigurationProperties( + JackrabbitNodeType type) { + // use Hashtable to ease integration with Properties + Hashtable defaults = new Hashtable(); + // 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 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 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/JackrabbitNodeTypes.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitNodeType.java similarity index 52% rename from org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitNodeTypes.java rename to org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitNodeType.java index 1a84caef3..026af09a6 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitNodeTypes.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitNodeType.java @@ -1,5 +1,6 @@ package org.argeo.cms.internal.kernel; -enum JackrabbitNodeTypes { +/** 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/Kernel.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java index 62efa364d..ad6ca084a 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java @@ -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(); diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java index 79fd1f77a..c93caa23d 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java @@ -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"; } diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/jackrabbit-node.properties b/org.argeo.cms/src/org/argeo/cms/internal/kernel/jackrabbit-node.properties index c7ab79dbe..889729704 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/jackrabbit-node.properties +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/jackrabbit-node.properties @@ -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 -- 2.30.2