]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsFsProvider.java
Fix automated Kerberos config
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / 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.Repository;
12 import javax.jcr.Session;
13
14 import org.argeo.cms.CmsException;
15 import org.argeo.cms.auth.CurrentUser;
16 import org.argeo.jackrabbit.fs.AbstractJackrabbitFsProvider;
17 import org.argeo.jcr.fs.JcrFileSystem;
18 import org.argeo.jcr.fs.JcrFsException;
19 import org.argeo.node.NodeConstants;
20 import org.osgi.framework.BundleContext;
21 import org.osgi.framework.FrameworkUtil;
22
23 public class CmsFsProvider extends AbstractJackrabbitFsProvider {
24 private Map<String, JcrFileSystem> fileSystems = new HashMap<>();
25 private BundleContext bc = FrameworkUtil.getBundle(CmsFsProvider.class).getBundleContext();
26
27 @Override
28 public String getScheme() {
29 return NodeConstants.SCHEME_NODE;
30 }
31
32 @Override
33 public FileSystem newFileSystem(URI uri, Map<String, ?> env) throws IOException {
34 String username = CurrentUser.getUsername();
35 if (username == null) {
36 // TODO deal with anonymous
37 return null;
38 }
39 if (fileSystems.containsKey(username))
40 throw new FileSystemAlreadyExistsException("CMS file system already exists for user " + username);
41
42 try {
43 Repository repository = bc.getService(
44 bc.getServiceReferences(Repository.class, "(cn=" + NodeConstants.HOME + ")").iterator().next());
45 Session session = repository.login();
46 JcrFileSystem fileSystem = new JcrFileSystem(this, session);
47 fileSystems.put(username, fileSystem);
48 return fileSystem;
49 } catch (Exception e) {
50 throw new CmsException("Cannot open file system " + uri + " for user " + username, e);
51 }
52 }
53
54 @Override
55 public FileSystem getFileSystem(URI uri) {
56 return currentUserFileSystem();
57 }
58
59 @Override
60 public Path getPath(URI uri) {
61 JcrFileSystem fileSystem = currentUserFileSystem();
62 String path = uri.getPath();
63 if (fileSystem == null)
64 try {
65 fileSystem = (JcrFileSystem) 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 protected JcrFileSystem currentUserFileSystem() {
73 String username = CurrentUser.getUsername();
74 return fileSystems.get(username);
75 }
76 }