Introduce multi-workspaces JCR file system.
[lgpl/argeo-commons.git] / org.argeo.jcr / src / org / argeo / jackrabbit / fs / JackrabbitMemoryFsProvider.java
index 0ed826894e9a5e79e2df98023f0a118389d44fb4..e3a70d0842165d11a447f19380b67a7e2c77278e 100644 (file)
@@ -2,6 +2,7 @@ package org.argeo.jackrabbit.fs;
 
 import java.io.IOException;
 import java.net.URI;
+import java.net.URISyntaxException;
 import java.net.URL;
 import java.nio.file.FileSystem;
 import java.nio.file.Files;
@@ -9,6 +10,9 @@ import java.nio.file.Path;
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.jcr.Credentials;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.SimpleCredentials;
 
@@ -21,6 +25,13 @@ public class JackrabbitMemoryFsProvider extends AbstractJackrabbitFsProvider {
        private RepositoryImpl repository;
        private JcrFileSystem fileSystem;
 
+       private Credentials credentials;
+
+       public JackrabbitMemoryFsProvider() {
+               String username = System.getProperty("user.name");
+               credentials = new SimpleCredentials(username, username.toCharArray());
+       }
+
        @Override
        public String getScheme() {
                return "jcr+memory";
@@ -30,15 +41,14 @@ public class JackrabbitMemoryFsProvider extends AbstractJackrabbitFsProvider {
        public FileSystem newFileSystem(URI uri, Map<String, ?> env) throws IOException {
                try {
                        Path tempDir = Files.createTempDirectory("fs-memory");
-                       URL confUrl = getClass().getResource("fs-memory.xml");
+                       URL confUrl = JackrabbitMemoryFsProvider.class.getResource("fs-memory.xml");
                        RepositoryConfig repositoryConfig = RepositoryConfig.create(confUrl.toURI(), tempDir.toString());
                        repository = RepositoryImpl.create(repositoryConfig);
-                       String username = System.getProperty("user.name");
-                       Session session = repository.login(new SimpleCredentials(username, username.toCharArray()));
-                       fileSystem = new JcrFileSystem(this, session);
+                       postRepositoryCreation(repository);
+                       fileSystem = new JcrFileSystem(this, repository, credentials);
                        return fileSystem;
-               } catch (Exception e) {
-                       throw new JcrFsException("Cannot login to repository", e);
+               } catch (RepositoryException | URISyntaxException e) {
+                       throw new IOException("Cannot login to repository", e);
                }
        }
 
@@ -50,13 +60,28 @@ public class JackrabbitMemoryFsProvider extends AbstractJackrabbitFsProvider {
        @Override
        public Path getPath(URI uri) {
                String path = uri.getPath();
-               if(fileSystem==null)
+               if (fileSystem == null)
                        try {
                                newFileSystem(uri, new HashMap<String, Object>());
                        } catch (IOException e) {
-                               throw new JcrFsException("Could not autocreate file system",e);
+                               throw new JcrFsException("Could not autocreate file system", e);
                        }
                return fileSystem.getPath(path);
        }
 
+       public Repository getRepository() {
+               return repository;
+       }
+
+       public Session login() throws RepositoryException {
+               return getRepository().login(credentials);
+       }
+
+       /**
+        * Called after the repository has been created and before the file system is
+        * created.
+        */
+       protected void postRepositoryCreation(RepositoryImpl repositoryImpl) throws RepositoryException {
+
+       }
 }