View Javadoc
1   package org.argeo.jackrabbit.fs;
2   
3   import java.io.IOException;
4   import java.net.URI;
5   import java.net.URISyntaxException;
6   import java.net.URL;
7   import java.nio.file.FileSystem;
8   import java.nio.file.Files;
9   import java.nio.file.Path;
10  import java.util.HashMap;
11  import java.util.Map;
12  
13  import javax.jcr.Credentials;
14  import javax.jcr.Repository;
15  import javax.jcr.RepositoryException;
16  import javax.jcr.Session;
17  import javax.jcr.SimpleCredentials;
18  
19  import org.apache.jackrabbit.core.RepositoryImpl;
20  import org.apache.jackrabbit.core.config.RepositoryConfig;
21  import org.argeo.jcr.fs.JcrFileSystem;
22  import org.argeo.jcr.fs.JcrFsException;
23  
24  public class JackrabbitMemoryFsProvider extends AbstractJackrabbitFsProvider {
25  	private RepositoryImpl repository;
26  	private JcrFileSystem fileSystem;
27  
28  	private Credentials credentials;
29  
30  	public JackrabbitMemoryFsProvider() {
31  		String username = System.getProperty("user.name");
32  		credentials = new SimpleCredentials(username, username.toCharArray());
33  	}
34  
35  	@Override
36  	public String getScheme() {
37  		return "jcr+memory";
38  	}
39  
40  	@Override
41  	public FileSystem newFileSystem(URI uri, Map<String, ?> env) throws IOException {
42  		try {
43  			Path tempDir = Files.createTempDirectory("fs-memory");
44  			URL confUrl = JackrabbitMemoryFsProvider.class.getResource("fs-memory.xml");
45  			RepositoryConfig repositoryConfig = RepositoryConfig.create(confUrl.toURI(), tempDir.toString());
46  			repository = RepositoryImpl.create(repositoryConfig);
47  			postRepositoryCreation(repository);
48  			fileSystem = new JcrFileSystem(this, repository, credentials);
49  			return fileSystem;
50  		} catch (RepositoryException | URISyntaxException e) {
51  			throw new IOException("Cannot login to repository", e);
52  		}
53  	}
54  
55  	@Override
56  	public FileSystem getFileSystem(URI uri) {
57  		return fileSystem;
58  	}
59  
60  	@Override
61  	public Path getPath(URI uri) {
62  		String path = uri.getPath();
63  		if (fileSystem == null)
64  			try {
65  				newFileSystem(uri, new HashMap<String, Object>());
66  			} catch (IOException e) {
67  				throw new JcrFsException("Could not autocreate file system", e);
68  			}
69  		return fileSystem.getPath(path);
70  	}
71  
72  	public Repository getRepository() {
73  		return repository;
74  	}
75  
76  	public Session login() throws RepositoryException {
77  		return getRepository().login(credentials);
78  	}
79  
80  	/**
81  	 * Called after the repository has been created and before the file system is
82  	 * created.
83  	 */
84  	protected void postRepositoryCreation(RepositoryImpl repositoryImpl) throws RepositoryException {
85  
86  	}
87  }