java.security.manager=
java.security.policy=file:../../all.policy
-argeo.node.repo.type=postgresql_cluster
+argeo.node.repo.type=postgresql_cluster_ds
argeo.node.repo.clusterId=03233754-16c3-49a1-8a00-58bf89a65182
argeo.node.repo.dburl=jdbc:postgresql://localhost/argeo_node_cluster
argeo.node.repo.dbuser=argeo
java.security.manager=
java.security.policy=file:../../all.policy
-argeo.node.repo.type=postgresql_cluster
+argeo.node.repo.type=postgresql_cluster_ds
argeo.node.repo.clusterId=52463fa3-2917-4814-9ff7-685c41cbc7c7
argeo.node.repo.dburl=jdbc:postgresql://localhost/argeo_node_cluster
argeo.node.repo.dbuser=argeo
package org.argeo.cms.internal.jcr;
-/** The available Jackrabbit node types */
+/** Pre-defined Jackrabbit repository configurations. */
enum JackrabbitType {
- localfs, h2, postgresql, postgresql_ds, postgresql_cluster, memory;
+ /** Local file system */
+ localfs,
+ /** Embedded Java H2 database */
+ h2,
+ /** PostgreSQL */
+ postgresql,
+ /** PostgreSQL with datastore */
+ postgresql_ds,
+ /** PostgreSQL with cluster */
+ postgresql_cluster,
+ /** PostgreSQL with cluster and datastore */
+ postgresql_cluster_ds,
+ /** Memory */
+ memory;
}
package org.argeo.cms.internal.jcr;
-import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
props.put(key, properties.get(key));
}
+ // cluster id
+ // cf. https://wiki.apache.org/jackrabbit/Clustering
+ // TODO deal with multiple repos
+ String clusterId = System.getProperty("org.apache.jackrabbit.core.cluster.node_id");
+ String clusterIdProp = props.getProperty(RepoConf.clusterId.name());
+ if (clusterId != null) {
+ if (clusterIdProp != null)
+ throw new CmsException("Cluster id defined as System properties and in deploy config");
+ props.put(RepoConf.clusterId.name(), clusterId);
+ } else {
+ clusterId = clusterIdProp;
+ }
+
// home
String homeUri = props.getProperty(RepoConf.labeledUri.name());
Path homePath;
if (homeUri == null) {
String cn = props.getProperty(NodeConstants.CN);
assert cn != null;
- homePath = CmsPaths.getRepoDirPath(cn);
+ if (clusterId != null) {
+ homePath = CmsPaths.getRepoDirPath(cn + '/' + clusterId);
+ } else {
+ homePath = CmsPaths.getRepoDirPath(cn);
+ }
} else {
try {
homePath = Paths.get(new URI(homeUri)).toAbsolutePath();
throw new CmsException("Invalid repository home URI", e);
}
}
+ // TODO use Jackrabbit API (?)
Path rootUuidPath = homePath.resolve("repository/meta/rootUUID");
- if (!Files.exists(rootUuidPath)) {
- try {
+ try {
+ if (!Files.exists(rootUuidPath)) {
Files.createDirectories(rootUuidPath.getParent());
Files.write(rootUuidPath, UUID.randomUUID().toString().getBytes());
- } catch (IOException e) {
- log.error("Could not set rootUUID", e);
}
+ // File homeDir = homePath.toFile();
+ // homeDir.mkdirs();
+ } catch (IOException e) {
+ throw new CmsException("Cannot set up repository home " + homePath, e);
}
- File homeDir = homePath.toFile();
- homeDir.mkdirs();
// home cannot be overridden
props.put(RepositoryConfigurationParser.REPOSITORY_HOME_VARIABLE, homePath.toString());
String dburl;
switch (type) {
case h2:
- dburl = "jdbc:h2:" + homeDir.getPath() + "/h2/repository";
+ dburl = "jdbc:h2:" + homePath.toAbsolutePath() + "/h2/repository";
setProp(props, RepoConf.dburl, dburl);
setProp(props, RepoConf.dbuser, "sa");
setProp(props, RepoConf.dbpassword, "");
case postgresql:
case postgresql_ds:
case postgresql_cluster:
+ case postgresql_cluster_ds:
dburl = "jdbc:postgresql://localhost/demo";
setProp(props, RepoConf.dburl, dburl);
setProp(props, RepoConf.dbuser, "argeo");
--- /dev/null
+<?xml version="1.0"?>
+<!DOCTYPE Repository PUBLIC "Jackrabbit 2.6" "http://jackrabbit.apache.org/dtd/repository-2.6.dtd">
+<Repository>
+ <!-- Shared datasource -->
+ <DataSources>
+ <DataSource name="dataSource">
+ <param name="driver" value="org.postgresql.Driver" />
+ <param name="url" value="${dburl}" />
+ <param name="user" value="${dbuser}" />
+ <param name="password" value="${dbpassword}" />
+ <param name="databaseType" value="postgresql" />
+ <param name="maxPoolSize" value="${maxPoolSize}" />
+ </DataSource>
+ </DataSources>
+
+ <!-- File system and datastore -->
+ <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
+ <param name="dataSourceName" value="dataSource" />
+ <param name="schema" value="postgresql" />
+ <param name="schemaObjectPrefix" value="fs_" />
+ </FileSystem>
+ <DataStore class="org.apache.jackrabbit.core.data.FileDataStore">
+ <param name="path" value="${rep.home}/../datastore" />
+ </DataStore>
+
+ <!-- Workspace templates -->
+ <Workspaces rootPath="${rep.home}/workspaces"
+ defaultWorkspace="${defaultWorkspace}" />
+ <Workspace name="${wsp.name}">
+ <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
+ <param name="dataSourceName" value="dataSource" />
+ <param name="schema" value="postgresql" />
+ <param name="schemaObjectPrefix" value="${wsp.name}_fs_" />
+ </FileSystem>
+ <PersistenceManager
+ class="org.apache.jackrabbit.core.persistence.pool.PostgreSQLPersistenceManager">
+ <param name="dataSourceName" value="dataSource" />
+ <param name="schemaObjectPrefix" value="${wsp.name}_pm_" />
+ <param name="bundleCacheSize" value="${bundleCacheMB}" />
+ </PersistenceManager>
+ <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
+ <param name="path" value="${indexesBase}/${cn}/${wsp.name}/index" />
+ <param name="extractorPoolSize" value="${extractorPoolSize}" />
+ <param name="cacheSize" value="${searchCacheSize}" />
+ <param name="maxVolatileIndexSize" value="${maxVolatileIndexSize}" />
+ </SearchIndex>
+ <WorkspaceSecurity>
+ <AccessControlProvider
+ class="org.argeo.security.jackrabbit.ArgeoAccessControlProvider" />
+ </WorkspaceSecurity>
+ </Workspace>
+
+ <!-- Versioning -->
+ <Versioning rootPath="${rep.home}/version">
+ <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
+ <param name="dataSourceName" value="dataSource" />
+ <param name="schema" value="postgresql" />
+ <param name="schemaObjectPrefix" value="fs_ver_" />
+ </FileSystem>
+ <PersistenceManager
+ class="org.apache.jackrabbit.core.persistence.pool.PostgreSQLPersistenceManager">
+ <param name="dataSourceName" value="dataSource" />
+ <param name="schemaObjectPrefix" value="pm_ver_" />
+ <param name="bundleCacheSize" value="${bundleCacheMB}" />
+ </PersistenceManager>
+ </Versioning>
+
+ <!-- Indexing -->
+ <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
+ <param name="path" value="${indexesBase}/${cn}/index" />
+ <param name="extractorPoolSize" value="${extractorPoolSize}" />
+ <param name="cacheSize" value="${searchCacheSize}" />
+ <param name="maxVolatileIndexSize" value="${maxVolatileIndexSize}" />
+ </SearchIndex>
+
+ <!-- Security -->
+ <Security appName="Jackrabbit">
+ <SecurityManager class="org.argeo.security.jackrabbit.ArgeoSecurityManager"
+ workspaceName="security" />
+ <AccessManager class="org.argeo.security.jackrabbit.ArgeoAccessManager" />
+ </Security>
+
+ <!-- Clustering -->
+ <Cluster id="${clusterId}">
+ <Journal class="org.apache.jackrabbit.core.journal.DatabaseJournal">
+ <param name="dataSourceName" value="dataSource" />
+ <param name="schemaObjectPrefix" value="journal_" />
+ </Journal>
+ </Cluster>
+</Repository>
\ No newline at end of file