Extends Jackrabbit factory capabilities
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 9 Feb 2012 14:09:28 +0000 (14:09 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 9 Feb 2012 14:09:28 +0000 (14:09 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@5029 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/JackrabbitRepositoryFactory.java
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/OsgiJackrabbitRepositoryFactory.java [new file with mode: 0644]
server/runtime/org.argeo.server.jackrabbit/src/main/resources/org/argeo/jackrabbit/repository-inMemory.xml
server/runtime/org.argeo.server.jackrabbit/src/main/resources/org/argeo/jackrabbit/repository-memory.xml [new file with mode: 0644]

index 5be370fe12a0c4c981e2fa0d4387cc01177a17c9..65bdf29393478ae0b1b99371ed441e54288e9762 100644 (file)
@@ -15,54 +15,65 @@ import org.apache.jackrabbit.jcr2dav.Jcr2davRepositoryFactory;
 import org.argeo.ArgeoException;
 import org.argeo.jcr.ArgeoJcrConstants;
 import org.argeo.jcr.DefaultRepositoryFactory;
-import org.osgi.framework.BundleContext;
 
-/** Repository factory which can access remote Jackrabbit repositories */
+/**
+ * Repository factory which can create new repositories and access remote
+ * Jackrabbit repositories
+ */
 public class JackrabbitRepositoryFactory extends DefaultRepositoryFactory
                implements RepositoryFactory, ArgeoJcrConstants {
        private final static Log log = LogFactory
                        .getLog(JackrabbitRepositoryFactory.class);
 
-       private BundleContext bundleContext;
-
        @SuppressWarnings({ "rawtypes", "unchecked" })
        public Repository getRepository(Map parameters) throws RepositoryException {
+               // check if can be found by alias
                Repository repository = super.getRepository(parameters);
                if (repository != null)
                        return repository;
 
-               String uri;
+               // check if remote
+               String uri = null;
                if (parameters.containsKey(JCR_REPOSITORY_URI))
                        uri = parameters.get(JCR_REPOSITORY_URI).toString();
                else if (parameters.containsKey(JcrUtils.REPOSITORY_URI))
                        uri = parameters.get(JcrUtils.REPOSITORY_URI).toString();
-               else
-                       return null;
 
+               if (uri == null)
+                       repository = createRemoteRepository(uri);
+
+               if (parameters.containsKey(JCR_REPOSITORY_ALIAS)) {
+                       Properties properties = new Properties();
+                       properties.putAll(parameters);
+                       String alias = parameters.get(JCR_REPOSITORY_ALIAS).toString();
+                       publish(alias, repository, properties);
+                       log.info("Registered JCR repository under alias '" + alias
+                                       + "' with properties " + properties);
+               }
+
+               return repository;
+       }
+
+       protected Repository createRemoteRepository(String uri)
+                       throws RepositoryException {
                Map<String, String> params = new HashMap<String, String>();
                params.put(JcrUtils.REPOSITORY_URI, uri);
-               repository = new Jcr2davRepositoryFactory().getRepository(params);
+               Repository repository = new Jcr2davRepositoryFactory()
+                               .getRepository(params);
                if (repository == null)
                        throw new ArgeoException("Remote Davex repository " + uri
                                        + " not found");
                log.info("Initialized remote Jackrabbit repository from uri " + uri);
-
-               if (parameters.containsKey(JCR_REPOSITORY_ALIAS)
-                               && bundleContext != null) {
-                       Properties properties = new Properties();
-                       properties.putAll(parameters);
-                       bundleContext.registerService(Repository.class.getName(),
-                                       repository, properties);
-                       log.info("Registered under alias '"
-                                       + parameters.get(JCR_REPOSITORY_ALIAS)
-                                       + "' the remote JCR repository from uri " + uri);
-               }
-
                return repository;
        }
 
-       public void setBundleContext(BundleContext bundleContext) {
-               this.bundleContext = bundleContext;
+       /**
+        * Called after the repository has been initialized. Does nothing by
+        * default.
+        */
+       @SuppressWarnings("rawtypes")
+       protected void postInitialization(Repository repository, Map parameters) {
+
        }
 
 }
diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/OsgiJackrabbitRepositoryFactory.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/OsgiJackrabbitRepositoryFactory.java
new file mode 100644 (file)
index 0000000..d837a40
--- /dev/null
@@ -0,0 +1,36 @@
+package org.argeo.jackrabbit;
+
+import java.util.Properties;
+
+import javax.jcr.Repository;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.osgi.framework.BundleContext;
+
+/**
+ * OSGi-aware Jackrabbit repository factory which can retrieve/publish
+ * {@link Repository} as OSGi services.
+ */
+public class OsgiJackrabbitRepositoryFactory extends
+               JackrabbitRepositoryFactory {
+       private final static Log log = LogFactory
+                       .getLog(OsgiJackrabbitRepositoryFactory.class);
+       private BundleContext bundleContext;
+
+       protected void publish(String alias, Repository repository,
+                       Properties properties) {
+               if (bundleContext != null) {
+                       // do not modify reference
+                       Properties props = new Properties(properties);
+                       props.setProperty(JCR_REPOSITORY_ALIAS, alias);
+                       bundleContext.registerService(Repository.class.getName(),
+                                       repository, props);
+               }
+       }
+
+       public void setBundleContext(BundleContext bundleContext) {
+               this.bundleContext = bundleContext;
+       }
+
+}
index 348dc288b9703385e893cf0ae73f22cefb3d7215..417f8fe7ddde03d50025e234a956b9b42af1093c 100644 (file)
@@ -1,6 +1,7 @@
 <?xml version="1.0"?>
 <!DOCTYPE Repository PUBLIC "-//The Apache Software Foundation//DTD Jackrabbit 1.6//EN"
                             "http://jackrabbit.apache.org/dtd/repository-2.0.dtd">
+<!-- LEGACY, will be replaced by repository-memory.xml -->
 <Repository>
        <!-- Shared datasource -->
        <DataSources>
diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/resources/org/argeo/jackrabbit/repository-memory.xml b/server/runtime/org.argeo.server.jackrabbit/src/main/resources/org/argeo/jackrabbit/repository-memory.xml
new file mode 100644 (file)
index 0000000..9f49e55
--- /dev/null
@@ -0,0 +1,52 @@
+<?xml version="1.0"?>
+<!DOCTYPE Repository PUBLIC "-//The Apache Software Foundation//DTD Jackrabbit 1.6//EN"
+                            "http://jackrabbit.apache.org/dtd/repository-2.0.dtd">
+<Repository>
+       <!-- File system and datastore -->
+       <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem" />
+
+       <!-- Workspace templates -->
+       <Workspaces rootPath="${rep.home}/workspaces"
+               defaultWorkspace="${argeo.node.repo.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" />
+               </PersistenceManager>
+               <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
+                       <param name="path" value="${rep.home}/repository/index" />
+                       <param name="directoryManagerClass"
+                               value="org.apache.jackrabbit.core.query.lucene.directory.RAMDirectoryManager" />
+                       <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" />
+               </PersistenceManager>
+       </Versioning>
+
+       <!-- Indexing -->
+       <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
+               <param name="path" value="${rep.home}/repository/index" />
+               <param name="directoryManagerClass"
+                       value="org.apache.jackrabbit.core.query.lucene.directory.RAMDirectoryManager" />
+               <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem" />
+       </SearchIndex>
+
+       <!-- Security -->
+       <Security appName="Jackrabbit">
+               <SecurityManager class="org.argeo.security.jackrabbit.ArgeoSecurityManager"
+                       workspaceName="security">
+               </SecurityManager>
+               <AccessManager class="org.argeo.security.jackrabbit.ArgeoAccessManager">
+               </AccessManager>
+               <LoginModule class="org.argeo.security.jackrabbit.ArgeoLoginModule">
+               </LoginModule>
+       </Security>
+</Repository>
\ No newline at end of file