]> git.argeo.org Git - lgpl/argeo-commons.git/blob - CmsFsProvider.java
f42646ec5907a6aa3a934448ae2b3a32fb9626c6
[lgpl/argeo-commons.git] / CmsFsProvider.java
1 package org.argeo.cms.internal.kernel;
2
3 import java.io.IOException;
4 import java.net.URI;
5 import java.nio.file.FileSystem;
6 import java.nio.file.FileSystemAlreadyExistsException;
7 import java.nio.file.Path;
8 import java.util.HashMap;
9 import java.util.Map;
10
11 import javax.jcr.Node;
12 import javax.jcr.Repository;
13 import javax.jcr.Session;
14
15 import org.argeo.cms.CmsException;
16 import org.argeo.cms.auth.CurrentUser;
17 import org.argeo.jackrabbit.fs.AbstractJackrabbitFsProvider;
18 import org.argeo.jcr.fs.JcrFileSystem;
19 import org.argeo.jcr.fs.JcrFsException;
20 import org.argeo.node.NodeConstants;
21 import org.argeo.node.NodeUtils;
22 import org.osgi.framework.BundleContext;
23 import org.osgi.framework.FrameworkUtil;
24
25 public class CmsFsProvider extends AbstractJackrabbitFsProvider {
26 private Map<String, JcrFileSystem> fileSystems = new HashMap<>();
27 private BundleContext bc = FrameworkUtil.getBundle(CmsFsProvider.class).getBundleContext();
28
29 @Override
30 public String getScheme() {
31 return NodeConstants.SCHEME_NODE;
32 }
33
34 @Override
35 public FileSystem newFileSystem(URI uri, Map<String, ?> env) throws IOException {
36 String username = CurrentUser.getUsername();
37 if (username == null) {
38 // TODO deal with anonymous
39 return null;
40 }
41 if (fileSystems.containsKey(username))
42 throw new FileSystemAlreadyExistsException("CMS file system already exists for user " + username);
43
44 try {
45 Repository repository = bc.getService(
46 bc.getServiceReferences(Repository.class, "(cn=" + NodeConstants.HOME + ")").iterator().next());
47 Session session = repository.login();
48 JcrFileSystem fileSystem = new JcrFileSystem(this, session);
49 fileSystems.put(username, fileSystem);
50 return fileSystem;
51 } catch (Exception e) {
52 throw new CmsException("Cannot open file system " + uri + " for user " + username, e);
53 }
54 }
55
56 @Override
57 public FileSystem getFileSystem(URI uri) {
58 return currentUserFileSystem();
59 }
60
61 @Override
62 public Path getPath(URI uri) {
63 JcrFileSystem fileSystem = currentUserFileSystem();
64 String path = uri.getPath();
65 if (fileSystem == null)
66 try {
67 fileSystem = (JcrFileSystem) newFileSystem(uri, new HashMap<String, Object>());
68 } catch (IOException e) {
69 throw new JcrFsException("Could not autocreate file system", e);
70 }
71 return fileSystem.getPath(path);
72 }
73
74 protected JcrFileSystem currentUserFileSystem() {
75 String username = CurrentUser.getUsername();
76 return fileSystems.get(username);
77 }
78
79 public Node getUserHome(Session session) {
80 return NodeUtils.getUserHome(session);
81 }
82 }