Refactor JCR
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 9 Feb 2017 16:38:17 +0000 (17:38 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 9 Feb 2017 16:38:17 +0000 (17:38 +0100)
23 files changed:
org.argeo.cms/src/org/argeo/cms/internal/jcr/JackrabbitType.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/internal/jcr/RepoConf.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/internal/jcr/RepositoryBuilder.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-h2.xml [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-localfs.xml [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-memory.xml [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql.xml [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster.xml [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_ds.xml [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsPaths.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/internal/kernel/FirstInit.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitType.java [deleted file]
org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java [deleted file]
org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelUtils.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/RepoConf.java [deleted file]
org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryBuilder.java [deleted file]
org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryServiceFactory.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-h2.xml [deleted file]
org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-localfs.xml [deleted file]
org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-memory.xml [deleted file]
org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-postgresql.xml [deleted file]
org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-postgresql_cluster.xml [deleted file]
org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-postgresql_ds.xml [deleted file]

diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/JackrabbitType.java b/org.argeo.cms/src/org/argeo/cms/internal/jcr/JackrabbitType.java
new file mode 100644 (file)
index 0000000..9b07b59
--- /dev/null
@@ -0,0 +1,6 @@
+package org.argeo.cms.internal.jcr;
+
+/** The available Jackrabbit node types */
+enum JackrabbitType {
+       localfs, h2, postgresql, postgresql_ds, postgresql_cluster, memory;
+}
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/RepoConf.java b/org.argeo.cms/src/org/argeo/cms/internal/jcr/RepoConf.java
new file mode 100644 (file)
index 0000000..429a51a
--- /dev/null
@@ -0,0 +1,69 @@
+package org.argeo.cms.internal.jcr;
+
+import org.argeo.osgi.metatype.EnumAD;
+import org.argeo.osgi.metatype.EnumOCD;
+
+/** JCR repository configuration */
+public enum RepoConf implements EnumAD {
+       /** Repository type */
+       type("localfs"),
+       /** Default workspace */
+       @Deprecated defaultWorkspace("main"),
+       /** Database URL */
+       dburl(null),
+       /** Database user */
+       dbuser(null),
+       /** Database password */
+       dbpassword(null),
+
+       /** The identifier (can be an URL locating the repo) */
+       labeledUri(null),
+       //
+       // JACKRABBIT SPECIFIC
+       //
+       /** Maximum database pool size */
+       maxPoolSize(10),
+       /** Maximum cache size in MB */
+       @Deprecated maxCacheMB(null),
+       /** Bundle cache size in MB */
+       bundleCacheMB(8),
+       /** Extractor pool size */
+       extractorPoolSize(0),
+       /** Search cache size */
+       searchCacheSize(1000),
+       /** Max volatile index size */
+       maxVolatileIndexSize(1048576),
+       /** Cluster id (if appropriate configuration) */
+       clusterId("default");
+
+       /** The default value. */
+       private Object def;
+       private String oid;
+
+       RepoConf(String oid, Object def) {
+               this.oid = oid;
+               this.def = def;
+       }
+
+       RepoConf(Object def) {
+               this.def = def;
+       }
+
+       public Object getDefault() {
+               return def;
+       }
+
+       @Override
+       public String getID() {
+               if (oid != null)
+                       return oid;
+               return EnumAD.super.getID();
+       }
+
+       public static class OCD extends EnumOCD<RepoConf> {
+               public OCD(String locale) {
+                       super(RepoConf.class, locale);
+               }
+       }
+
+}
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/RepositoryBuilder.java b/org.argeo.cms/src/org/argeo/cms/internal/jcr/RepositoryBuilder.java
new file mode 100644 (file)
index 0000000..fab39fd
--- /dev/null
@@ -0,0 +1,190 @@
+package org.argeo.cms.internal.jcr;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.UUID;
+
+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.cms.CmsException;
+import org.argeo.cms.internal.kernel.CmsPaths;
+import org.argeo.jcr.ArgeoJcrException;
+import org.argeo.node.NodeConstants;
+import org.xml.sax.InputSource;
+
+/** Can interpret properties in order to create an actual JCR repository. */
+public class RepositoryBuilder {
+       private final static Log log = LogFactory.getLog(RepositoryBuilder.class);
+
+       public RepositoryContext createRepositoryContext(Dictionary<String, ?> properties) throws RepositoryException {
+               RepositoryConfig repositoryConfig = createRepositoryConfig(properties);
+               RepositoryContext repositoryContext = createJackrabbitRepository(repositoryConfig);
+               RepositoryImpl repository = repositoryContext.getRepository();
+
+               // cache
+               Object maxCacheMbStr = prop(properties, RepoConf.maxCacheMB);
+               if (maxCacheMbStr != null) {
+                       Integer maxCacheMB = Integer.parseInt(maxCacheMbStr.toString());
+                       CacheManager cacheManager = repository.getCacheManager();
+                       cacheManager.setMaxMemory(maxCacheMB * 1024l * 1024l);
+                       cacheManager.setMaxMemoryPerCache((maxCacheMB / 4) * 1024l * 1024l);
+               }
+
+               return repositoryContext;
+       }
+
+       RepositoryConfig createRepositoryConfig(Dictionary<String, ?> properties) throws RepositoryException {
+               JackrabbitType type = JackrabbitType.valueOf(prop(properties, RepoConf.type).toString());
+               ClassLoader cl = getClass().getClassLoader();
+               InputStream in = null;
+               try {
+                       final String base = "/org/argeo/cms/internal/jcr";
+                       in = cl.getResourceAsStream(base + "/repository-" + type.name() + ".xml");
+
+                       if (in == null)
+                               throw new ArgeoJcrException("Repository configuration not found");
+                       InputSource config = new InputSource(in);
+                       Properties jackrabbitVars = getConfigurationProperties(type, properties);
+                       RepositoryConfig repositoryConfig = RepositoryConfig.create(config, jackrabbitVars);
+                       return repositoryConfig;
+               } finally {
+                       IOUtils.closeQuietly(in);
+               }
+       }
+
+       private Properties getConfigurationProperties(JackrabbitType type, Dictionary<String, ?> properties) {
+               Properties props = new Properties();
+               for (Enumeration<String> keys = properties.keys(); keys.hasMoreElements();) {
+                       String key = keys.nextElement();
+                       props.put(key, properties.get(key));
+               }
+
+               // 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);
+               } else {
+                       try {
+                               homePath = Paths.get(new URI(homeUri)).toAbsolutePath();
+                       } catch (URISyntaxException e) {
+                               throw new CmsException("Invalid repository home URI", e);
+                       }
+               }
+               Path rootUuidPath = homePath.resolve("repository/meta/rootUUID");
+               if (!Files.exists(rootUuidPath)) {
+                       try {
+                               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();
+               // home cannot be overridden
+               props.put(RepositoryConfigurationParser.REPOSITORY_HOME_VARIABLE, homePath.toString());
+               
+               Path indexBase = CmsPaths.getRepoIndexBase();
+               props.put("indexBase", indexBase.toString());
+
+               // common
+               setProp(props, RepoConf.defaultWorkspace);
+               setProp(props, RepoConf.maxPoolSize);
+               // Jackrabbit defaults
+               setProp(props, RepoConf.bundleCacheMB);
+               // See http://wiki.apache.org/jackrabbit/Search
+               setProp(props, RepoConf.extractorPoolSize);
+               setProp(props, RepoConf.searchCacheSize);
+               setProp(props, RepoConf.maxVolatileIndexSize);
+
+               // specific
+               String dburl;
+               switch (type) {
+               case h2:
+                       dburl = "jdbc:h2:" + homeDir.getPath() + "/h2/repository";
+                       setProp(props, RepoConf.dburl, dburl);
+                       setProp(props, RepoConf.dbuser, "sa");
+                       setProp(props, RepoConf.dbpassword, "");
+                       break;
+               case postgresql:
+               case postgresql_ds:
+               case postgresql_cluster:
+                       dburl = "jdbc:postgresql://localhost/demo";
+                       setProp(props, RepoConf.dburl, dburl);
+                       setProp(props, RepoConf.dbuser, "argeo");
+                       setProp(props, RepoConf.dbpassword, "argeo");
+                       break;
+               case memory:
+                       break;
+               case localfs:
+                       break;
+               default:
+                       throw new ArgeoJcrException("Unsupported node type " + type);
+               }
+               return props;
+       }
+
+       private void setProp(Properties props, RepoConf key, String def) {
+               Object value = props.get(key.name());
+               if (value == null)
+                       value = def;
+               if (value == null)
+                       value = key.getDefault();
+               if (value != null)
+                       props.put(key.name(), value.toString());
+       }
+
+       private void setProp(Properties props, RepoConf key) {
+               setProp(props, key, null);
+       }
+
+       private String prop(Dictionary<String, ?> properties, RepoConf key) {
+               Object value = properties.get(key.name());
+               if (value == null)
+                       return key.getDefault() != null ? key.getDefault().toString() : null;
+               else
+                       return value.toString();
+       }
+
+       private RepositoryContext createJackrabbitRepository(RepositoryConfig repositoryConfig) throws RepositoryException {
+               ClassLoader currentContextCl = Thread.currentThread().getContextClassLoader();
+               Thread.currentThread().setContextClassLoader(RepositoryBuilder.class.getClassLoader());
+               try {
+                       long begin = System.currentTimeMillis();
+                       //
+                       // Actual repository creation
+                       //
+                       RepositoryContext repositoryContext = RepositoryContext.create(repositoryConfig);
+
+                       double duration = ((double) (System.currentTimeMillis() - begin)) / 1000;
+                       if (log.isTraceEnabled())
+                               log.trace(
+                                               "Created Jackrabbit repository in " + duration + " s, home: " + repositoryConfig.getHomeDir());
+
+                       return repositoryContext;
+               } finally {
+                       Thread.currentThread().setContextClassLoader(currentContextCl);
+               }
+       }
+
+}
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-h2.xml b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-h2.xml
new file mode 100644 (file)
index 0000000..0526762
--- /dev/null
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!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.h2.Driver" />
+                       <param name="url" value="${dburl}" />
+                       <param name="user" value="${dbuser}" />
+                       <param name="password" value="${dbpassword}" />
+                       <param name="databaseType" value="h2" />
+                       <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="default" />
+               <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="default" />
+                       <param name="schemaObjectPrefix" value="${wsp.name}_fs_" />
+               </FileSystem>
+               <PersistenceManager
+                       class="org.apache.jackrabbit.core.persistence.pool.H2PersistenceManager">
+                       <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="${wsp.home}/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="default" />
+                       <param name="schemaObjectPrefix" value="fs_ver_" />
+               </FileSystem>
+               <PersistenceManager
+                       class="org.apache.jackrabbit.core.persistence.pool.H2PersistenceManager">
+                       <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="${rep.home}/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>
+</Repository>
\ No newline at end of file
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-localfs.xml b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-localfs.xml
new file mode 100644 (file)
index 0000000..3d24708
--- /dev/null
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE Repository PUBLIC "Jackrabbit 2.6" "http://jackrabbit.apache.org/dtd/repository-2.6.dtd">
+<Repository>
+       <!-- File system and datastore -->
+       <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
+               <param name="path" value="${rep.home}/repository" />
+       </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.local.LocalFileSystem">
+                       <param name="path" value="${wsp.home}" />
+               </FileSystem>
+               <PersistenceManager
+                       class="org.apache.jackrabbit.core.persistence.bundle.BundleFsPersistenceManager">
+                       <param name="bundleCacheSize" value="${bundleCacheMB}" />
+               </PersistenceManager>
+               <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
+                       <param name="path" value="${wsp.home}/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.local.LocalFileSystem">
+                       <param name="path" value="${rep.home}/version" />
+               </FileSystem>
+               <PersistenceManager
+                       class="org.apache.jackrabbit.core.persistence.bundle.BundleFsPersistenceManager">
+                       <param name="bundleCacheSize" value="${bundleCacheMB}" />
+               </PersistenceManager>
+       </Versioning>
+
+       <!-- Indexing -->
+       <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
+               <param name="path" value="${rep.home}/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>
+</Repository>
\ No newline at end of file
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-memory.xml b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-memory.xml
new file mode 100644 (file)
index 0000000..ecee5bd
--- /dev/null
@@ -0,0 +1,55 @@
+<?xml version="1.0"?>
+<!DOCTYPE Repository PUBLIC "Jackrabbit 2.6" "http://jackrabbit.apache.org/dtd/repository-2.6.dtd">
+<Repository>
+       <!-- File system and datastore -->
+       <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem" />
+
+       <!-- Workspace templates -->
+       <Workspaces rootPath="${rep.home}/workspaces"
+               defaultWorkspace="${defaultWorkspace}" configRootPath="/workspaces" />
+       <Workspace name="${wsp.name}">
+               <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem" />
+               <PersistenceManager
+                       class="org.apache.jackrabbit.core.persistence.bundle.BundleFsPersistenceManager">
+                       <param name="blobFSBlockSize" value="1" />
+                       <param name="bundleCacheSize" value="${bundleCacheMB}" />
+               </PersistenceManager>
+               <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
+                       <param name="path" value="${wsp.home}/index" />
+                       <param name="directoryManagerClass"
+                               value="org.apache.jackrabbit.core.query.lucene.directory.RAMDirectoryManager" />
+                       <param name="extractorPoolSize" value="${extractorPoolSize}" />
+                       <param name="cacheSize" value="${searchCacheSize}" />
+                       <param name="maxVolatileIndexSize" value="${maxVolatileIndexSize}" />
+                       <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem" />
+               </SearchIndex>
+       </Workspace>
+
+       <!-- Versioning -->
+       <Versioning rootPath="${rep.home}/version">
+               <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem" />
+               <PersistenceManager
+                       class="org.apache.jackrabbit.core.persistence.bundle.BundleFsPersistenceManager">
+                       <param name="blobFSBlockSize" value="1" />
+                       <param name="bundleCacheSize" value="${bundleCacheMB}" />
+               </PersistenceManager>
+       </Versioning>
+
+       <!-- Indexing -->
+       <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
+               <param name="path" value="${rep.home}/index" />
+               <param name="directoryManagerClass"
+                       value="org.apache.jackrabbit.core.query.lucene.directory.RAMDirectoryManager" />
+               <param name="extractorPoolSize" value="${extractorPoolSize}" />
+               <param name="cacheSize" value="${searchCacheSize}" />
+               <param name="maxVolatileIndexSize" value="${maxVolatileIndexSize}" />
+               <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem" />
+       </SearchIndex>
+
+       <!-- Security -->
+       <Security appName="Jackrabbit">
+               <SecurityManager class="org.argeo.security.jackrabbit.ArgeoSecurityManager"
+                       workspaceName="security" />
+               <AccessManager class="org.argeo.security.jackrabbit.ArgeoAccessManager" />
+       </Security>
+</Repository>
\ No newline at end of file
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql.xml b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql.xml
new file mode 100644 (file)
index 0000000..9677828
--- /dev/null
@@ -0,0 +1,79 @@
+<?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>
+
+       <!-- 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="${wsp.home}/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="${rep.home}/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>
+</Repository>
\ No newline at end of file
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster.xml b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster.xml
new file mode 100644 (file)
index 0000000..d8c23e7
--- /dev/null
@@ -0,0 +1,87 @@
+<?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>
+
+       <!-- 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="${wsp.home}/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="${rep.home}/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
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_ds.xml b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_ds.xml
new file mode 100644 (file)
index 0000000..07a0d04
--- /dev/null
@@ -0,0 +1,82 @@
+<?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="${wsp.home}/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="${rep.home}/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>
+</Repository>
\ No newline at end of file
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsPaths.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsPaths.java
new file mode 100644 (file)
index 0000000..d4dbc81
--- /dev/null
@@ -0,0 +1,17 @@
+package org.argeo.cms.internal.kernel;
+
+import java.nio.file.Path;
+
+public class CmsPaths {
+       public static Path getRepoDirPath(String cn) {
+               return KernelUtils.getOsgiInstancePath(KernelConstants.DIR_REPOS + '/' + cn);
+       }
+
+       public static Path getRepoIndexBase() {
+               return KernelUtils.getOsgiInstancePath(KernelConstants.DIR_REPOS);
+       }
+
+       private CmsPaths() {
+
+       }
+}
index a8ef66a90813979e5604915939565b2610835ffa..8bd348f8e5efb147943e90a1f4ea344a341d51c0 100644 (file)
@@ -22,6 +22,7 @@ import org.apache.commons.io.FileUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.cms.CmsException;
+import org.argeo.cms.internal.jcr.RepoConf;
 import org.argeo.node.NodeConstants;
 import org.argeo.osgi.useradmin.UserAdminConf;
 import org.eclipse.equinox.http.jetty.JettyConstants;
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitType.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitType.java
deleted file mode 100644 (file)
index b9671f2..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.argeo.cms.internal.kernel;
-
-/** The available Jackrabbit node types */
-@Deprecated
-public enum JackrabbitType {
-       localfs, h2, postgresql, postgresql_ds,postgresql_cluster, 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
deleted file mode 100644 (file)
index 836e353..0000000
+++ /dev/null
@@ -1,759 +0,0 @@
-package org.argeo.cms.internal.kernel;
-
-/**
- * Argeo CMS Kernel. Responsible for :
- * <ul>
- * <li>security</li>
- * <li>provisioning</li>
- * <li>transaction</li>
- * <li>logging</li>
- * <li>local and remote file systems access</li>
- * <li>OS access</li>
- * </ul>
- */
-@Deprecated
-final class Kernel{
-//implements KernelHeader, KernelConstants {
-//     /*
-//      * SERVICE REFERENCES
-//      */
-//     // private ServiceReference<ConfigurationAdmin> configurationAdmin;
-//     private final ServiceTracker<ConfigurationAdmin, ConfigurationAdmin> configurationAdmin;
-//     private final ServiceTracker<LogReaderService, LogReaderService> logReaderService;
-//     private final ServiceTracker<HttpService, HttpService> httpService;
-//     private final ConditionalPermissionAdmin permissionAdmin;
-//     /*
-//      * REGISTERED SERVICES
-//      */
-//     private ServiceRegistration<ArgeoLogger> loggerReg;
-//     private ServiceRegistration<TransactionManager> tmReg;
-//     private ServiceRegistration<UserTransaction> utReg;
-//     private ServiceRegistration<TransactionSynchronizationRegistry> tsrReg;
-//     private ServiceRegistration<?> repositoryReg;
-//     private ServiceRegistration<RepositoryFactory> repositoryFactoryReg;
-//     private ServiceRegistration<UserAdmin> userAdminReg;
-//
-//     /*
-//      * SERVICES IMPLEMENTATIONS
-//      */
-//     private NodeLogger logger;
-//     private BitronixTransactionManager transactionManager;
-//     private BitronixTransactionSynchronizationRegistry transactionSynchronizationRegistry;
-//     private NodeRepositoryFactory repositoryFactory;
-//     private Repository repository;
-//     private NodeUserAdmin userAdmin;
-//
-//     // Members
-//     private final BundleContext bc;// = Activator.getBundleContext();
-//     private final NodeSecurity nodeSecurity;
-//
-//     private final static Log log = LogFactory.getLog(Kernel.class);
-//     ThreadGroup threadGroup = new ThreadGroup(Kernel.class.getSimpleName());
-//     private DataHttp dataHttp;
-//     private NodeHttp nodeHttp;
-//     private KernelThread kernelThread;
-//
-//     private Locale defaultLocale = null;
-//     private List<Locale> locales = null;
-//
-//     public Kernel() {
-//             // KernelUtils.logFrameworkProperties(log);
-//             nodeSecurity = new NodeSecurity();
-//             bc = FrameworkUtil.getBundle(getClass()).getBundleContext();
-//             configurationAdmin = new ServiceTracker<ConfigurationAdmin, ConfigurationAdmin>(bc, ConfigurationAdmin.class,
-//                             new PrepareStc<ConfigurationAdmin>());
-//             configurationAdmin.open();
-//             logReaderService = new ServiceTracker<LogReaderService, LogReaderService>(bc, LogReaderService.class,
-//                             new PrepareStc<LogReaderService>());
-//             logReaderService.open();
-//             httpService = new ServiceTracker<HttpService, HttpService>(bc, HttpService.class, new PrepareHttpStc());
-//             httpService.open();
-//
-//             permissionAdmin = bc.getService(bc.getServiceReference(ConditionalPermissionAdmin.class));
-//     }
-//
-//     /*
-//      * PACKAGE RESTRICTED INTERFACE
-//      */
-//     Subject getKernelSubject() {
-//             return nodeSecurity.getKernelSubject();
-//     }
-//
-//     /*
-//      * INITIALISATION
-//      */
-//
-//     final void init() {
-//             Subject.doAs(nodeSecurity.getKernelSubject(), new PrivilegedAction<Void>() {
-//                     @Override
-//                     public Void run() {
-//                             doInit();
-//                             return null;
-//                     }
-//             });
-//     }
-//
-//     private void doInit() {
-//             long begin = System.currentTimeMillis();
-//             // Use CMS bundle classloader
-//             ClassLoader currentContextCl = Thread.currentThread().getContextClassLoader();
-//             Thread.currentThread().setContextClassLoader(Kernel.class.getClassLoader());
-//             try {
-//                     // Listen to service publication (also ours)
-//                     // bc.addServiceListener(Kernel.this);
-//
-//                     if (nodeSecurity.isFirstInit())
-//                             firstInit();
-//
-//                     defaultLocale = new Locale(getFrameworkProp(NodeConstants.I18N_DEFAULT_LOCALE, ENGLISH.getLanguage()));
-//                     locales = asLocaleList(getFrameworkProp(NodeConstants.I18N_LOCALES));
-//
-//                     // ServiceTracker<LogReaderService, LogReaderService>
-//                     // logReaderService = new ServiceTracker<LogReaderService,
-//                     // LogReaderService>(
-//                     // bc, LogReaderService.class, null);
-//                     // logReaderService.open();
-//                     logger = new NodeLogger(logReaderService.getService());
-//                     // logReaderService.close();
-//
-//                     if (isMaintenance())
-//                             maintenanceInit();
-//                     else
-//                             normalInit();
-//             } catch (Throwable e) {
-//                     log.error("Cannot initialize Argeo CMS", e);
-//                     throw new ArgeoException("Cannot initialize", e);
-//             } finally {
-//                     Thread.currentThread().setContextClassLoader(currentContextCl);
-//                     // FIXME better manage lifecycle.
-//                     try {
-//                             new LoginContext(LOGIN_CONTEXT_KERNEL, nodeSecurity.getKernelSubject()).logout();
-//                     } catch (LoginException e) {
-//                             e.printStackTrace();
-//                     }
-//             }
-//
-//             long jvmUptime = ManagementFactory.getRuntimeMXBean().getUptime();
-//             log.info("## ARGEO CMS UP in " + (jvmUptime / 1000) + "." + (jvmUptime % 1000) + "s ##");
-//             long initDuration = System.currentTimeMillis() - begin;
-//             if (log.isTraceEnabled())
-//                     log.trace("Kernel initialization took " + initDuration + "ms");
-//             directorsCut(initDuration);
-//     }
-//
-//     private void normalInit() {
-//             ConfigurationAdmin conf = findConfigurationAdmin();
-//
-//             // HTTP
-//             initWebServer(conf);
-//             // ServiceReference<ExtendedHttpService> sr =
-//             // bc.getServiceReference(ExtendedHttpService.class);
-//             // if (sr != null)
-//             // addHttpService(sr);
-//             // else
-//             // log.warn("No http service found");
-//
-//             // Initialise services
-//             initTransactionManager();
-//
-//             RepositoryServiceFactory jrsf = new RepositoryServiceFactory();
-//             String[] clazzes = { ManagedServiceFactory.class.getName() };
-//             Hashtable<String, String> serviceProps = new Hashtable<String, String>();
-//             serviceProps.put(Constants.SERVICE_PID, ArgeoJcrConstants.JACKRABBIT_REPO_FACTORY_PID);
-//             bc.registerService(clazzes, jrsf, serviceProps);
-//
-//             try {
-//                     Configuration nodeConf = conf.createFactoryConfiguration(ArgeoJcrConstants.JACKRABBIT_REPO_FACTORY_PID);
-//                     // Configuration nodeConf =
-//                     // conf.getConfiguration(ArgeoJcrConstants.REPO_PID_NODE);
-//                     if (nodeConf.getProperties() == null) {
-//                             Dictionary<String, Object> props = getNodeConfigFromFrameworkProperties();
-//                             if (props == null) {
-//                                     // TODO interactive configuration
-//                                     if (log.isDebugEnabled())
-//                                             log.debug("No argeo.node.repo.type=localfs|h2|postgresql|memory"
-//                                                             + " property defined, entering interactive mode...");
-//                                     return;
-//                             }
-//                             // props.put(ConfigurationAdmin.SERVICE_FACTORYPID,
-//                             // ArgeoJcrConstants.JACKRABBIT_REPO_FACTORY_PID);
-//                             props.put(Constants.SERVICE_PID, ArgeoJcrConstants.REPO_PID_NODE);
-//                             nodeConf.update(props);
-//                     }
-//             } catch (IOException e) {
-//                     throw new CmsException("Cannot get configuration", e);
-//             }
-//
-//             // ManagedJackrabbitRepository nodeRepo = new
-//             // ManagedJackrabbitRepository();
-//             // String[] clazzes = { ManagedService.class.getName(),
-//             // Repository.class.getName(),
-//             // JackrabbitRepository.class.getName() };
-//             // Hashtable<String, String> serviceProps = new Hashtable<String,
-//             // String>();
-//             // serviceProps.put(Constants.SERVICE_PID,
-//             // ArgeoJcrConstants.REPO_PID_NODE);
-//             // serviceProps.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS,
-//             // ArgeoJcrConstants.ALIAS_NODE);
-//             // repositoryReg = bc.registerService(clazzes, nodeRepo, serviceProps);
-//             // nodeRepo.waitForInit();
-//
-//             ServiceTracker<JackrabbitRepository, JackrabbitRepository> jackrabbitSt = new ServiceTracker<>(bc,
-//                             JackrabbitRepository.class, new ServiceTrackerCustomizer<JackrabbitRepository, JackrabbitRepository>() {
-//
-//                                     @Override
-//                                     public JackrabbitRepository addingService(ServiceReference<JackrabbitRepository> reference) {
-//                                             JackrabbitRepository nodeRepo = bc.getService(reference);
-//                                             // new
-//                                             // JackrabbitDataModel(bc).prepareDataModel(nodeRepo);
-//                                             prepareDataModel(KernelUtils.openAdminSession(nodeRepo));
-//
-//                                             // repository = (JackrabbitRepository)
-//                                             // bc.getService(repositoryReg.getReference());
-//                                             repository = new HomeRepository(nodeRepo);
-//                                             Hashtable<String, String> regProps = new Hashtable<String, String>();
-//                                             regProps.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS, ArgeoJcrConstants.ALIAS_NODE);
-//                                             repositoryReg = (ServiceRegistration<? extends Repository>) bc.registerService(Repository.class,
-//                                                             repository, regProps);
-//
-//                                             // if (repository == null)
-//                                             // repository = new NodeRepository();
-//                                             if (repositoryFactory == null) {
-//                                                     repositoryFactory = new NodeRepositoryFactory();
-//                                                     // repositoryFactory.setBundleContext(bc);
-//                                                     repositoryFactoryReg = bc.registerService(RepositoryFactory.class, repositoryFactory, null);
-//                                             }
-//                                             userAdmin = new NodeUserAdmin(transactionManager, repository);
-//                                             userAdminReg = bc.registerService(UserAdmin.class, userAdmin, userAdmin.currentState());
-//                                             return nodeRepo;
-//                                     }
-//
-//                                     @Override
-//                                     public void modifiedService(ServiceReference<JackrabbitRepository> reference,
-//                                                     JackrabbitRepository service) {
-//                                     }
-//
-//                                     @Override
-//                                     public void removedService(ServiceReference<JackrabbitRepository> reference,
-//                                                     JackrabbitRepository service) {
-//                                     }
-//                             });
-//             jackrabbitSt.open();
-//
-//             // new JackrabbitDataModel(bc).prepareDataModel(nodeRepo);
-//             // prepareDataModel(nodeRepo);
-//             //
-//             // repository = (JackrabbitRepository)
-//             // bc.getService(repositoryReg.getReference());
-//             //
-//             //// if (repository == null)
-//             //// repository = new NodeRepository();
-//             // if (repositoryFactory == null) {
-//             // repositoryFactory = new OsgiJackrabbitRepositoryFactory();
-//             // repositoryFactory.setBundleContext(bc);
-//             // }
-//             // userAdmin = new NodeUserAdmin(transactionManager, repository);
-//
-//             // ADMIN UIs
-//             UserUi userUi = new UserUi();
-//             Hashtable<String, String> props = new Hashtable<String, String>();
-//             props.put("contextName", "user");
-//             bc.registerService(ApplicationConfiguration.class, userUi, props);
-//
-//             // Bundle rapWorkbenchBundle =
-//             // findBundle("org.eclipse.rap.ui.workbench");
-//             // if (rapWorkbenchBundle != null)
-//             // try {
-//             // Class<?> clss = rapWorkbenchBundle
-//             // .loadClass("org.eclipse.rap.ui.internal.servlet.WorkbenchApplicationConfiguration");
-//             //
-//             // Hashtable<String, String> rapWorkbenchProps = new Hashtable<String,
-//             // String>();
-//             // rapWorkbenchProps.put("contextName", "ui");
-//             // ApplicationConfiguration workbenchApplicationConfiguration =
-//             // (ApplicationConfiguration) clss
-//             // .newInstance();
-//             // bc.registerService(ApplicationConfiguration.class,
-//             // workbenchApplicationConfiguration,
-//             // rapWorkbenchProps);
-//             // } catch (Exception e) {
-//             // log.error("Cannot initalize RAP workbench", e);
-//             // }
-//
-//             // Kernel thread
-////           kernelThread = new KernelThread(this);
-////           kernelThread.setContextClassLoader(Kernel.class.getClassLoader());
-////           kernelThread.start();
-//
-//             // Publish services to OSGi
-//             publish();
-//     }
-//
-//     private Dictionary<String, Object> getNodeConfigFromFrameworkProperties() {
-//             String repoType = KernelUtils.getFrameworkProp(NodeConstants.NODE_REPO_PROP_PREFIX + RepoConf.type.name());
-//             if (repoType == null)
-//                     return null;
-//
-//             Hashtable<String, Object> props = new Hashtable<String, Object>();
-//             for (RepoConf repoConf : RepoConf.values()) {
-//                     String value = KernelUtils.getFrameworkProp(NodeConstants.NODE_REPO_PROP_PREFIX + repoConf.name());
-//                     if (value != null)
-//                             props.put(repoConf.name(), value);
-//             }
-//             return props;
-//     }
-//
-//     /** Session is logged out. */
-//     private void prepareDataModel(Session adminSession) {
-//             try {
-//                     Set<String> processed = new HashSet<String>();
-//                     bundles: for (Bundle bundle : bc.getBundles()) {
-//                             BundleWiring wiring = bundle.adapt(BundleWiring.class);
-//                             if (wiring == null) {
-//                                     if (log.isTraceEnabled())
-//                                             log.error("No wiring for " + bundle.getSymbolicName());
-//                                     continue bundles;
-//                             }
-//                             processWiring(adminSession, wiring, processed);
-//                     }
-//             } finally {
-//                     JcrUtils.logoutQuietly(adminSession);
-//             }
-//     }
-//
-//     private void processWiring(Session adminSession, BundleWiring wiring, Set<String> processed) {
-//             // recursively process requirements first
-//             List<BundleWire> requiredWires = wiring.getRequiredWires(CMS_DATA_MODEL_NAMESPACE);
-//             for (BundleWire wire : requiredWires) {
-//                     processWiring(adminSession, wire.getProviderWiring(), processed);
-//                     // registerCnd(adminSession, wire.getCapability(), processed);
-//             }
-//             List<BundleCapability> capabilities = wiring.getCapabilities(CMS_DATA_MODEL_NAMESPACE);
-//             for (BundleCapability capability : capabilities) {
-//                     registerCnd(adminSession, capability, processed);
-//             }
-//     }
-//
-//     private void registerCnd(Session adminSession, BundleCapability capability, Set<String> processed) {
-//             Map<String, Object> attrs = capability.getAttributes();
-//             String name = attrs.get(DataModelNamespace.CAPABILITY_NAME_ATTRIBUTE).toString();
-//             if (processed.contains(name)) {
-//                     if (log.isTraceEnabled())
-//                             log.trace("Data model " + name + " has already been processed");
-//                     return;
-//             }
-//             String path = attrs.get(DataModelNamespace.CAPABILITY_CND_ATTRIBUTE).toString();
-//             URL url = capability.getRevision().getBundle().getResource(path);
-//             try (Reader reader = new InputStreamReader(url.openStream())) {
-//                     CndImporter.registerNodeTypes(reader, adminSession, true);
-//                     processed.add(name);
-//                     if (log.isDebugEnabled())
-//                             log.debug("Registered CND " + url);
-//             } catch (Exception e) {
-//                     throw new CmsException("Cannot read cnd " + url, e);
-//             }
-//
-//             Hashtable<String, Object> properties = new Hashtable<>();
-//             properties.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS, name);
-//             bc.registerService(Repository.class, adminSession.getRepository(), properties);
-//             if (log.isDebugEnabled())
-//                     log.debug("Published data model " + name);
-//     }
-//
-//     private boolean isMaintenance() {
-//             String startLevel = KernelUtils.getFrameworkProp("osgi.startLevel");
-//             if (startLevel == null)
-//                     return false;
-//             int bundleStartLevel = bc.getBundle().adapt(BundleStartLevel.class).getStartLevel();
-//             // int frameworkStartLevel =
-//             // bc.getBundle(0).adapt(BundleStartLevel.class)
-//             // .getStartLevel();
-//             int frameworkStartLevel = Integer.parseInt(startLevel);
-//             // int frameworkStartLevel = bc.getBundle(0)
-//             // .adapt(FrameworkStartLevel.class).getStartLevel();
-//             return bundleStartLevel == frameworkStartLevel;
-//     }
-//
-//     private void maintenanceInit() {
-//             log.info("## MAINTENANCE ##");
-//             // bc.addServiceListener(Kernel.this);
-//             initWebServer(null);
-//             MaintenanceUi maintenanceUi = new MaintenanceUi();
-//             Hashtable<String, String> props = new Hashtable<String, String>();
-//             props.put("contextName", "maintenance");
-//             bc.registerService(ApplicationConfiguration.class, maintenanceUi, props);
-//     }
-//
-//     private void firstInit() {
-//             log.info("## FIRST INIT ##");
-//             String nodeInit = getFrameworkProp(NodeConstants.NODE_INIT);
-//             if (nodeInit == null)
-//                     nodeInit = "../../init";
-//             if (nodeInit.startsWith("http")) {
-//                     // remoteFirstInit(nodeInit);
-//                     return;
-//             }
-//             File initDir;
-//             if (nodeInit.startsWith("."))
-//                     initDir = KernelUtils.getExecutionDir(nodeInit);
-//             else
-//                     initDir = new File(nodeInit);
-//             // TODO also uncompress archives
-//             if (initDir.exists())
-//                     try {
-//                             FileUtils.copyDirectory(initDir, getOsgiInstanceDir(), new FileFilter() {
-//
-//                                     @Override
-//                                     public boolean accept(File pathname) {
-//                                             if (pathname.getName().equals(".svn") || pathname.getName().equals(".git"))
-//                                                     return false;
-//                                             return true;
-//                                     }
-//                             });
-//                             log.info("CMS initialized from " + initDir.getCanonicalPath());
-//                     } catch (IOException e) {
-//                             throw new CmsException("Cannot initialize from " + initDir, e);
-//                     }
-//     }
-//
-//     // private void remoteFirstInit(String uri) {
-//     // try {
-//     // repository = new NodeRepository();
-//     // repositoryFactory = new OsgiJackrabbitRepositoryFactory();
-//     // Repository remoteRepository =
-//     // ArgeoJcrUtils.getRepositoryByUri(repositoryFactory, uri);
-//     // Session remoteSession = remoteRepository.login(new
-//     // SimpleCredentials("root", "demo".toCharArray()), "main");
-//     // Session localSession = this.repository.login();
-//     // // FIXME register node type
-//     // // if (false)
-//     // // CndImporter.registerNodeTypes(null, localSession);
-//     // ByteArrayOutputStream out = new ByteArrayOutputStream();
-//     // remoteSession.exportSystemView("/", out, true, false);
-//     // ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
-//     // localSession.importXML("/", in,
-//     // ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW);
-//     // // JcrUtils.copy(remoteSession.getRootNode(),
-//     // // localSession.getRootNode());
-//     // } catch (Exception e) {
-//     // throw new CmsException("Cannot first init from " + uri, e);
-//     // }
-//     // }
-//
-//     /** Can be null */
-//     private ConfigurationAdmin findConfigurationAdmin() {
-//             // configurationAdmin =
-//             // bc.getServiceReference(ConfigurationAdmin.class);
-//             // if (configurationAdmin == null) {
-//             // return null;
-//             // }
-//             // return bc.getService(configurationAdmin);
-//             return configurationAdmin.getService();
-//     }
-//
-//     /** Can be null */
-//     Bundle findBundle(String symbolicName) {
-//             for (Bundle b : bc.getBundles())
-//                     if (b.getSymbolicName().equals(symbolicName))
-//                             return b;
-//             return null;
-//     }
-//
-//     private void initTransactionManager() {
-//             bitronix.tm.Configuration tmConf = TransactionManagerServices.getConfiguration();
-//             tmConf.setServerId(getFrameworkProp(FRAMEWORK_UUID));
-//
-//             // File tmBaseDir = new File(getFrameworkProp(TRANSACTIONS_HOME,
-//             // getOsgiInstancePath(DIR_TRANSACTIONS)));
-//             Bundle bitronixBundle = FrameworkUtil.getBundle(bitronix.tm.Configuration.class);
-//             File tmBaseDir = bitronixBundle.getDataFile(DIR_TRANSACTIONS);
-//             // File tmBaseDir = bc.getDataFile(DIR_TRANSACTIONS);
-//             File tmDir1 = new File(tmBaseDir, "btm1");
-//             tmDir1.mkdirs();
-//             tmConf.setLogPart1Filename(new File(tmDir1, tmDir1.getName() + ".tlog").getAbsolutePath());
-//             File tmDir2 = new File(tmBaseDir, "btm2");
-//             tmDir2.mkdirs();
-//             tmConf.setLogPart2Filename(new File(tmDir2, tmDir2.getName() + ".tlog").getAbsolutePath());
-//             transactionManager = getTransactionManager();
-//             transactionSynchronizationRegistry = getTransactionSynchronizationRegistry();
-//     }
-//
-//     private void initWebServer(final ConfigurationAdmin conf) {
-//             String httpPort = getFrameworkProp("org.osgi.service.http.port");
-//             String httpsPort = getFrameworkProp("org.osgi.service.http.port.secure");
-//             try {
-//                     if (httpPort != null || httpsPort != null) {
-//                             final Hashtable<String, Object> jettyProps = new Hashtable<String, Object>();
-//                             if (httpPort != null) {
-//                                     jettyProps.put(JettyConstants.HTTP_PORT, httpPort);
-//                                     jettyProps.put(JettyConstants.HTTP_ENABLED, true);
-//                             }
-//                             if (httpsPort != null) {
-//                                     jettyProps.put(JettyConstants.HTTPS_PORT, httpsPort);
-//                                     jettyProps.put(JettyConstants.HTTPS_ENABLED, true);
-//                                     jettyProps.put(JettyConstants.SSL_KEYSTORETYPE, "PKCS12");
-//                                     jettyProps.put(JettyConstants.SSL_KEYSTORE,
-//                                                     nodeSecurity.getHttpServerKeyStore().getCanonicalPath());
-//                                     jettyProps.put(JettyConstants.SSL_PASSWORD, "changeit");
-//                                     jettyProps.put(JettyConstants.SSL_WANTCLIENTAUTH, true);
-//                             }
-//                             if (conf != null) {
-//                                     // TODO make filter more generic
-//                                     String filter = "(" + JettyConstants.HTTP_PORT + "=" + httpPort + ")";
-//                                     if (conf.listConfigurations(filter) != null)
-//                                             return;
-//                                     Configuration jettyConf = conf.createFactoryConfiguration(JETTY_FACTORY_PID, null);
-//                                     jettyConf.update(jettyProps);
-//
-//                             } else {
-//                                     JettyConfigurator.startServer("default", jettyProps);
-//                             }
-//                     }
-//             } catch (Exception e) {
-//                     throw new CmsException("Cannot initialize web server on " + httpPortsMsg(httpPort, httpsPort), e);
-//             }
-//     }
-//
-//     private void publish() {
-//
-//             // Logging
-//             loggerReg = bc.registerService(ArgeoLogger.class, logger, null);
-//             // Transaction
-//             tmReg = bc.registerService(TransactionManager.class, transactionManager, null);
-//             utReg = bc.registerService(UserTransaction.class, transactionManager, null);
-//             tsrReg = bc.registerService(TransactionSynchronizationRegistry.class, transactionSynchronizationRegistry, null);
-//             // User admin
-//             // userAdminReg = bc.registerService(UserAdmin.class, userAdmin,
-//             // userAdmin.currentState());
-//             // JCR
-//             // Hashtable<String, String> regProps = new Hashtable<String, String>();
-//             // regProps.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS,
-//             // ArgeoJcrConstants.ALIAS_NODE);
-//             // repositoryReg = (ServiceRegistration<? extends Repository>)
-//             // bc.registerService(Repository.class, repository,
-//             // regProps);
-//             // repositoryFactoryReg = bc.registerService(RepositoryFactory.class,
-//             // repositoryFactory, null);
-//     }
-//
-//     void destroy() {
-//             long begin = System.currentTimeMillis();
-//             unpublish();
-//
-//             kernelThread.destroyAndJoin();
-//
-//             if (dataHttp != null)
-//                     dataHttp.destroy();
-//             if (nodeHttp != null)
-//                     nodeHttp.destroy();
-//             if (userAdmin != null)
-//                     userAdmin.destroy();
-//             // if (repository != null)
-//             // repository.shutdown();
-//             if (transactionManager != null)
-//                     transactionManager.shutdown();
-//
-//             // bc.removeServiceListener(this);
-//
-//             // Clean hanging threads from Jackrabbit
-//             TransientFileFactory.shutdown();
-//
-//             // Clean hanging Gogo shell thread
-//             new GogoShellKiller().start();
-//
-//             nodeSecurity.destroy();
-//             long duration = System.currentTimeMillis() - begin;
-//             log.info("## ARGEO CMS DOWN in " + (duration / 1000) + "." + (duration % 1000) + "s ##");
-//     }
-//
-//     private void unpublish() {
-//             userAdminReg.unregister();
-//             repositoryFactoryReg.unregister();
-//             repositoryReg.unregister();
-//             tmReg.unregister();
-//             utReg.unregister();
-//             tsrReg.unregister();
-//             loggerReg.unregister();
-//     }
-//
-//     // @Override
-//     // public void serviceChanged(ServiceEvent event) {
-//     // ServiceReference<?> sr = event.getServiceReference();
-//     // Object service = bc.getService(sr);
-//     // if (service instanceof Repository) {
-//     // Object jcrRepoAlias =
-//     // sr.getProperty(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS);
-//     // if (jcrRepoAlias != null) {// JCR repository
-//     // String alias = jcrRepoAlias.toString();
-//     // Repository repository = (Repository) bc.getService(sr);
-//     // Map<String, Object> props = new HashMap<String, Object>();
-//     // for (String key : sr.getPropertyKeys())
-//     // props.put(key, sr.getProperty(key));
-//     // if (ServiceEvent.REGISTERED == event.getType()) {
-//     // try {
-//     // // repositoryFactory.register(repository, props);
-//     // dataHttp.registerRepositoryServlets(alias, repository);
-//     // } catch (Exception e) {
-//     // throw new CmsException("Could not publish JCR repository " + alias, e);
-//     // }
-//     // } else if (ServiceEvent.UNREGISTERING == event.getType()) {
-//     // // repositoryFactory.unregister(repository, props);
-//     // dataHttp.unregisterRepositoryServlets(alias);
-//     // }
-//     // }
-//     // }
-//     // // else if (service instanceof ExtendedHttpService) {
-//     // // if (ServiceEvent.REGISTERED == event.getType()) {
-//     // // addHttpService(sr);
-//     // // } else if (ServiceEvent.UNREGISTERING == event.getType()) {
-//     // // dataHttp.destroy();
-//     // // dataHttp = null;
-//     // // }
-//     // // }
-//     // }
-//
-//     private HttpService addHttpService(ServiceReference<HttpService> sr) {
-//             // for (String key : sr.getPropertyKeys())
-//             // log.debug(key + "=" + sr.getProperty(key));
-//             HttpService httpService = bc.getService(sr);
-//             // TODO find constants
-//             Object httpPort = sr.getProperty("http.port");
-//             Object httpsPort = sr.getProperty("https.port");
-//             dataHttp = new DataHttp(httpService);
-//             nodeHttp = new NodeHttp(httpService, bc);
-//             if (log.isDebugEnabled())
-//                     log.debug(httpPortsMsg(httpPort, httpsPort));
-//             return httpService;
-//     }
-//
-//     private String httpPortsMsg(Object httpPort, Object httpsPort) {
-//             return "HTTP " + httpPort + (httpsPort != null ? " - HTTPS " + httpsPort : "");
-//     }
-//
-//     @Override
-//     public Locale getDefaultLocale() {
-//             return defaultLocale;
-//     }
-//
-//     /** Can be null. */
-//     @Override
-//     public List<Locale> getLocales() {
-//             return locales;
-//     }
-//
-//     final private static void directorsCut(long initDuration) {
-//             // final long ms = 128l + (long) (Math.random() * 128d);
-//             long ms = initDuration / 100;
-//             log.info("Spend " + ms + "ms" + " reflecting on the progress brought to mankind" + " by Free Software...");
-//             long beginNano = System.nanoTime();
-//             try {
-//                     Thread.sleep(ms, 0);
-//             } catch (InterruptedException e) {
-//                     // silent
-//             }
-//             long durationNano = System.nanoTime() - beginNano;
-//             final double M = 1000d * 1000d;
-//             double sleepAccuracy = ((double) durationNano) / (ms * M);
-//             if (log.isDebugEnabled())
-//                     log.debug("Sleep accuracy: " + String.format("%.2f", 100 - (sleepAccuracy * 100 - 100)) + " %");
-//     }
-//
-//     private class PrepareStc<T> implements ServiceTrackerCustomizer<T, T> {
-//
-//             @Override
-//             public T addingService(ServiceReference<T> reference) {
-//                     T service = bc.getService(reference);
-//                     System.out.println("addingService " + service);
-//                     return service;
-//             }
-//
-//             @Override
-//             public void modifiedService(ServiceReference<T> reference, T service) {
-//                     System.out.println("modifiedService " + service);
-//             }
-//
-//             @Override
-//             public void removedService(ServiceReference<T> reference, T service) {
-//                     System.out.println("removedService " + service);
-//             }
-//
-//     }
-//
-//     private class PrepareHttpStc implements ServiceTrackerCustomizer<HttpService, HttpService> {
-//
-//             @Override
-//             public HttpService addingService(ServiceReference<HttpService> reference) {
-//                     HttpService httpService = addHttpService(reference);
-//                     return httpService;
-//             }
-//
-//             @Override
-//             public void modifiedService(ServiceReference<HttpService> reference, HttpService service) {
-//             }
-//
-//             @Override
-//             public void removedService(ServiceReference<HttpService> reference, HttpService service) {
-//                     dataHttp.destroy();
-//                     dataHttp = null;
-//             }
-//
-//     }
-//
-//     /** Workaround for blocking Gogo shell by system shutdown. */
-//     private class GogoShellKiller extends Thread {
-//
-//             public GogoShellKiller() {
-//                     super("Gogo shell killer");
-//                     setDaemon(true);
-//             }
-//
-//             @Override
-//             public void run() {
-//                     ThreadGroup rootTg = getRootThreadGroup(null);
-//                     Thread gogoShellThread = findGogoShellThread(rootTg);
-//                     if (gogoShellThread == null)
-//                             return;
-//                     while (getNonDaemonCount(rootTg) > 2) {
-//                             try {
-//                                     Thread.sleep(100);
-//                             } catch (InterruptedException e) {
-//                                     // silent
-//                             }
-//                     }
-//                     gogoShellThread = findGogoShellThread(rootTg);
-//                     if (gogoShellThread == null)
-//                             return;
-//                     System.exit(0);
-//             }
-//     }
-//
-//     private static ThreadGroup getRootThreadGroup(ThreadGroup tg) {
-//             if (tg == null)
-//                     tg = Thread.currentThread().getThreadGroup();
-//             if (tg.getParent() == null)
-//                     return tg;
-//             else
-//                     return getRootThreadGroup(tg.getParent());
-//     }
-//
-//     private static int getNonDaemonCount(ThreadGroup rootThreadGroup) {
-//             Thread[] threads = new Thread[rootThreadGroup.activeCount()];
-//             rootThreadGroup.enumerate(threads);
-//             int nonDameonCount = 0;
-//             for (Thread t : threads)
-//                     if (t != null && !t.isDaemon())
-//                             nonDameonCount++;
-//             return nonDameonCount;
-//     }
-//
-//     private static Thread findGogoShellThread(ThreadGroup rootThreadGroup) {
-//             Thread[] threads = new Thread[rootThreadGroup.activeCount()];
-//             rootThreadGroup.enumerate(threads, true);
-//             for (Thread thread : threads) {
-//                     if (thread.getName().equals("Gogo shell"))
-//                             return thread;
-//             }
-//             return null;
-//     }
-
-}
\ No newline at end of file
index 5b1df1708ab47ad8d7114bb084ba01ac12daa20a..5d49797911125d0c755655f4bb4919a49745ed04 100644 (file)
@@ -9,7 +9,6 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.security.PrivilegedAction;
 import java.util.Dictionary;
-import java.util.Enumeration;
 import java.util.Hashtable;
 import java.util.Properties;
 import java.util.TreeMap;
@@ -21,7 +20,6 @@ import javax.jcr.Session;
 import javax.security.auth.Subject;
 import javax.security.auth.login.LoginContext;
 import javax.security.auth.login.LoginException;
-import javax.servlet.http.HttpServletRequest;
 
 import org.apache.commons.logging.Log;
 import org.argeo.cms.CmsException;
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepoConf.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepoConf.java
deleted file mode 100644 (file)
index 111c86c..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.argeo.cms.internal.kernel;
-
-import org.argeo.osgi.metatype.EnumAD;
-import org.argeo.osgi.metatype.EnumOCD;
-
-/** JCR repository configuration */
-enum RepoConf implements EnumAD {
-       /** Repository type */
-       type("localfs"),
-       /** Default workspace */
-       @Deprecated defaultWorkspace("main"),
-       /** Database URL */
-       dburl(null),
-       /** Database user */
-       dbuser(null),
-       /** Database password */
-       dbpassword(null),
-
-       /** The identifier (can be an URL locating the repo) */
-       labeledUri(null),
-       //
-       // JACKRABBIT SPECIFIC
-       //
-       /** Maximum database pool size */
-       maxPoolSize(10),
-       /** Maximum cache size in MB */
-       @Deprecated maxCacheMB(null),
-       /** Bundle cache size in MB */
-       bundleCacheMB(8),
-       /** Extractor pool size */
-       extractorPoolSize(0),
-       /** Search cache size */
-       searchCacheSize(1000),
-       /** Max volatile index size */
-       maxVolatileIndexSize(1048576),
-       /** Cluster id (if appropriate configuration) */
-       clusterId("default");
-
-       /** The default value. */
-       private Object def;
-       private String oid;
-
-       RepoConf(String oid, Object def) {
-               this.oid = oid;
-               this.def = def;
-       }
-
-       RepoConf(Object def) {
-               this.def = def;
-       }
-
-       public Object getDefault() {
-               return def;
-       }
-
-       @Override
-       public String getID() {
-               if (oid != null)
-                       return oid;
-               return EnumAD.super.getID();
-       }
-
-       public static class OCD extends EnumOCD<RepoConf> {
-               public OCD(String locale) {
-                       super(RepoConf.class, locale);
-               }
-       }
-
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryBuilder.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryBuilder.java
deleted file mode 100644 (file)
index f866c2b..0000000
+++ /dev/null
@@ -1,216 +0,0 @@
-package org.argeo.cms.internal.kernel;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.Properties;
-import java.util.UUID;
-
-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.cms.CmsException;
-import org.argeo.jcr.ArgeoJcrException;
-import org.argeo.node.NodeConstants;
-import org.xml.sax.InputSource;
-
-/** Can interpret properties in order to create an actual JCR repository. */
-class RepositoryBuilder {
-       private final static Log log = LogFactory.getLog(RepositoryBuilder.class);
-
-       RepositoryContext createRepositoryContext(Dictionary<String, ?> properties) throws RepositoryException {
-               RepositoryConfig repositoryConfig = createRepositoryConfig(properties);
-               RepositoryContext repositoryContext = createJackrabbitRepository(repositoryConfig);
-               RepositoryImpl repository = repositoryContext.getRepository();
-
-               // cache
-               Object maxCacheMbStr = prop(properties, RepoConf.maxCacheMB);
-               if (maxCacheMbStr != null) {
-                       Integer maxCacheMB = Integer.parseInt(maxCacheMbStr.toString());
-                       CacheManager cacheManager = repository.getCacheManager();
-                       cacheManager.setMaxMemory(maxCacheMB * 1024l * 1024l);
-                       cacheManager.setMaxMemoryPerCache((maxCacheMB / 4) * 1024l * 1024l);
-               }
-
-               return repositoryContext;
-       }
-
-       RepositoryConfig createRepositoryConfig(Dictionary<String, ?> properties) throws RepositoryException {
-               JackrabbitType type = JackrabbitType.valueOf(prop(properties, RepoConf.type).toString());
-               ClassLoader cl = getClass().getClassLoader();
-               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 postgresql_ds:
-//                             in = cl.getResourceAsStream(base + "/repository-postgresql-ds.xml");
-//                             break;
-//                     case memory:
-//                             in = cl.getResourceAsStream(base + "/repository-memory.xml");
-//                             break;
-//                     case localfs:
-//                             in = cl.getResourceAsStream(base + "/repository-localfs.xml");
-//                             break;
-//                     default:
-//                             throw new ArgeoJcrException("Unsupported node type " + type);
-//                     }
-                       in = cl.getResourceAsStream(base + "/repository-"+type.name()+".xml");
-
-                       if (in == null)
-                               throw new ArgeoJcrException("Repository configuration not found");
-                       InputSource config = new InputSource(in);
-                       Properties jackrabbitVars = getConfigurationProperties(type, properties);
-                       RepositoryConfig repositoryConfig = RepositoryConfig.create(config, jackrabbitVars);
-                       return repositoryConfig;
-               } finally {
-                       IOUtils.closeQuietly(in);
-               }
-       }
-
-       private Properties getConfigurationProperties(JackrabbitType type, Dictionary<String, ?> properties) {
-               Properties props = new Properties();
-               for (Enumeration<String> keys = properties.keys(); keys.hasMoreElements();) {
-                       String key = keys.nextElement();
-                       // if (key.equals(ConfigurationAdmin.SERVICE_FACTORYPID) ||
-                       // key.equals(Constants.SERVICE_PID)
-                       // || key.equals(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS))
-                       // continue keys;
-                       // try {
-                       // String value = prop(properties, RepoConf.valueOf(key));
-                       // if (value != null)
-                       props.put(key, properties.get(key));
-                       // } catch (IllegalArgumentException e) {
-                       // // ignore non RepoConf
-                       // // FIXME make it more flexible/extensible
-                       // }
-               }
-
-               // home
-               String homeUri = props.getProperty(RepoConf.labeledUri.name());
-               Path homePath;
-               if (homeUri == null) {
-                       String cn = props.getProperty(NodeConstants.CN);
-                       assert cn != null;
-                       homePath = KernelUtils.getOsgiInstancePath(KernelConstants.DIR_REPOS + '/' + cn);
-               } else {
-                       try {
-                               homePath = Paths.get(new URI(homeUri)).toAbsolutePath();
-                       } catch (URISyntaxException e) {
-                               throw new CmsException("Invalid repository home URI", e);
-                       }
-               }
-               Path rootUuidPath = homePath.resolve("repository/meta/rootUUID");
-               if (!Files.exists(rootUuidPath)) {
-                       try {
-                               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();
-               // home cannot be overridden
-               props.put(RepositoryConfigurationParser.REPOSITORY_HOME_VARIABLE, homePath.toString());
-
-               // common
-               setProp(props, RepoConf.defaultWorkspace);
-               setProp(props, RepoConf.maxPoolSize);
-               // Jackrabbit defaults
-               setProp(props, RepoConf.bundleCacheMB);
-               // See http://wiki.apache.org/jackrabbit/Search
-               setProp(props, RepoConf.extractorPoolSize);
-               setProp(props, RepoConf.searchCacheSize);
-               setProp(props, RepoConf.maxVolatileIndexSize);
-
-               // specific
-               String dburl;
-               switch (type) {
-               case h2:
-                       dburl = "jdbc:h2:" + homeDir.getPath() + "/h2/repository";
-                       setProp(props, RepoConf.dburl, dburl);
-                       setProp(props, RepoConf.dbuser, "sa");
-                       setProp(props, RepoConf.dbpassword, "");
-                       break;
-               case postgresql:
-               case postgresql_ds:
-               case postgresql_cluster:
-                       dburl = "jdbc:postgresql://localhost/demo";
-                       setProp(props, RepoConf.dburl, dburl);
-                       setProp(props, RepoConf.dbuser, "argeo");
-                       setProp(props, RepoConf.dbpassword, "argeo");
-                       break;
-               case memory:
-                       break;
-               case localfs:
-                       break;
-               default:
-                       throw new ArgeoJcrException("Unsupported node type " + type);
-               }
-               return props;
-       }
-
-       private void setProp(Properties props, RepoConf key, String def) {
-               Object value = props.get(key.name());
-               if (value == null)
-                       value = def;
-               if (value == null)
-                       value = key.getDefault();
-               if (value != null)
-                       props.put(key.name(), value.toString());
-       }
-
-       private void setProp(Properties props, RepoConf key) {
-               setProp(props, key, null);
-       }
-
-       private String prop(Dictionary<String, ?> properties, RepoConf key) {
-               Object value = properties.get(key.name());
-               if (value == null)
-                       return key.getDefault() != null ? key.getDefault().toString() : null;
-               else
-                       return value.toString();
-       }
-
-       private RepositoryContext createJackrabbitRepository(RepositoryConfig repositoryConfig) throws RepositoryException {
-               ClassLoader currentContextCl = Thread.currentThread().getContextClassLoader();
-               Thread.currentThread().setContextClassLoader(RepositoryBuilder.class.getClassLoader());
-               try {
-                       long begin = System.currentTimeMillis();
-                       //
-                       // Actual repository creation
-                       //
-                       RepositoryContext repositoryContext = RepositoryContext.create(repositoryConfig);
-
-                       double duration = ((double) (System.currentTimeMillis() - begin)) / 1000;
-                       if (log.isTraceEnabled())
-                               log.trace(
-                                               "Created Jackrabbit repository in " + duration + " s, home: " + repositoryConfig.getHomeDir());
-
-                       return repositoryContext;
-               } finally {
-                       Thread.currentThread().setContextClassLoader(currentContextCl);
-               }
-       }
-
-}
index 6ec27659063087838443a89ef8f1a1d89eb5e737..b718043d99c6bfbf160a323d249cffeeacae7485 100644 (file)
@@ -8,6 +8,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.jackrabbit.core.RepositoryContext;
 import org.argeo.cms.CmsException;
+import org.argeo.cms.internal.jcr.RepositoryBuilder;
 import org.argeo.node.NodeConstants;
 import org.argeo.util.LangUtils;
 import org.osgi.framework.BundleContext;
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-h2.xml b/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-h2.xml
deleted file mode 100644 (file)
index 0526762..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!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.h2.Driver" />
-                       <param name="url" value="${dburl}" />
-                       <param name="user" value="${dbuser}" />
-                       <param name="password" value="${dbpassword}" />
-                       <param name="databaseType" value="h2" />
-                       <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="default" />
-               <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="default" />
-                       <param name="schemaObjectPrefix" value="${wsp.name}_fs_" />
-               </FileSystem>
-               <PersistenceManager
-                       class="org.apache.jackrabbit.core.persistence.pool.H2PersistenceManager">
-                       <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="${wsp.home}/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="default" />
-                       <param name="schemaObjectPrefix" value="fs_ver_" />
-               </FileSystem>
-               <PersistenceManager
-                       class="org.apache.jackrabbit.core.persistence.pool.H2PersistenceManager">
-                       <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="${rep.home}/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>
-</Repository>
\ No newline at end of file
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-localfs.xml b/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-localfs.xml
deleted file mode 100644 (file)
index 3d24708..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Repository PUBLIC "Jackrabbit 2.6" "http://jackrabbit.apache.org/dtd/repository-2.6.dtd">
-<Repository>
-       <!-- File system and datastore -->
-       <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
-               <param name="path" value="${rep.home}/repository" />
-       </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.local.LocalFileSystem">
-                       <param name="path" value="${wsp.home}" />
-               </FileSystem>
-               <PersistenceManager
-                       class="org.apache.jackrabbit.core.persistence.bundle.BundleFsPersistenceManager">
-                       <param name="bundleCacheSize" value="${bundleCacheMB}" />
-               </PersistenceManager>
-               <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
-                       <param name="path" value="${wsp.home}/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.local.LocalFileSystem">
-                       <param name="path" value="${rep.home}/version" />
-               </FileSystem>
-               <PersistenceManager
-                       class="org.apache.jackrabbit.core.persistence.bundle.BundleFsPersistenceManager">
-                       <param name="bundleCacheSize" value="${bundleCacheMB}" />
-               </PersistenceManager>
-       </Versioning>
-
-       <!-- Indexing -->
-       <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
-               <param name="path" value="${rep.home}/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>
-</Repository>
\ No newline at end of file
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-memory.xml b/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-memory.xml
deleted file mode 100644 (file)
index ecee5bd..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Repository PUBLIC "Jackrabbit 2.6" "http://jackrabbit.apache.org/dtd/repository-2.6.dtd">
-<Repository>
-       <!-- File system and datastore -->
-       <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem" />
-
-       <!-- Workspace templates -->
-       <Workspaces rootPath="${rep.home}/workspaces"
-               defaultWorkspace="${defaultWorkspace}" configRootPath="/workspaces" />
-       <Workspace name="${wsp.name}">
-               <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem" />
-               <PersistenceManager
-                       class="org.apache.jackrabbit.core.persistence.bundle.BundleFsPersistenceManager">
-                       <param name="blobFSBlockSize" value="1" />
-                       <param name="bundleCacheSize" value="${bundleCacheMB}" />
-               </PersistenceManager>
-               <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
-                       <param name="path" value="${wsp.home}/index" />
-                       <param name="directoryManagerClass"
-                               value="org.apache.jackrabbit.core.query.lucene.directory.RAMDirectoryManager" />
-                       <param name="extractorPoolSize" value="${extractorPoolSize}" />
-                       <param name="cacheSize" value="${searchCacheSize}" />
-                       <param name="maxVolatileIndexSize" value="${maxVolatileIndexSize}" />
-                       <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem" />
-               </SearchIndex>
-       </Workspace>
-
-       <!-- Versioning -->
-       <Versioning rootPath="${rep.home}/version">
-               <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem" />
-               <PersistenceManager
-                       class="org.apache.jackrabbit.core.persistence.bundle.BundleFsPersistenceManager">
-                       <param name="blobFSBlockSize" value="1" />
-                       <param name="bundleCacheSize" value="${bundleCacheMB}" />
-               </PersistenceManager>
-       </Versioning>
-
-       <!-- Indexing -->
-       <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
-               <param name="path" value="${rep.home}/index" />
-               <param name="directoryManagerClass"
-                       value="org.apache.jackrabbit.core.query.lucene.directory.RAMDirectoryManager" />
-               <param name="extractorPoolSize" value="${extractorPoolSize}" />
-               <param name="cacheSize" value="${searchCacheSize}" />
-               <param name="maxVolatileIndexSize" value="${maxVolatileIndexSize}" />
-               <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem" />
-       </SearchIndex>
-
-       <!-- Security -->
-       <Security appName="Jackrabbit">
-               <SecurityManager class="org.argeo.security.jackrabbit.ArgeoSecurityManager"
-                       workspaceName="security" />
-               <AccessManager class="org.argeo.security.jackrabbit.ArgeoAccessManager" />
-       </Security>
-</Repository>
\ No newline at end of file
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-postgresql.xml b/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-postgresql.xml
deleted file mode 100644 (file)
index 9677828..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-<?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>
-
-       <!-- 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="${wsp.home}/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="${rep.home}/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>
-</Repository>
\ No newline at end of file
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-postgresql_cluster.xml b/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-postgresql_cluster.xml
deleted file mode 100644 (file)
index d8c23e7..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-<?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>
-
-       <!-- 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="${wsp.home}/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="${rep.home}/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
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-postgresql_ds.xml b/org.argeo.cms/src/org/argeo/cms/internal/kernel/repository-postgresql_ds.xml
deleted file mode 100644 (file)
index 07a0d04..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-<?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="${wsp.home}/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="${rep.home}/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>
-</Repository>
\ No newline at end of file