]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsFsProvider.java
Merge branch 'master' of https://mbaudier@code.argeo.org/git/lgpl/argeo-commons.git
[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.net.URISyntaxException;
6 import java.nio.file.FileSystem;
7 import java.nio.file.FileSystemAlreadyExistsException;
8 import java.nio.file.Path;
9 import java.nio.file.spi.FileSystemProvider;
10 import java.util.HashMap;
11 import java.util.Map;
12
13 import javax.jcr.Node;
14 import javax.jcr.Property;
15 import javax.jcr.Repository;
16 import javax.jcr.RepositoryException;
17 import javax.jcr.RepositoryFactory;
18 import javax.jcr.Session;
19 import javax.jcr.nodetype.NodeType;
20
21 import org.argeo.api.NodeConstants;
22 import org.argeo.api.NodeUtils;
23 import org.argeo.cms.auth.CurrentUser;
24 import org.argeo.jackrabbit.fs.AbstractJackrabbitFsProvider;
25 import org.argeo.jcr.fs.JcrFileSystem;
26 import org.argeo.jcr.fs.JcrFileSystemProvider;
27 import org.argeo.jcr.fs.JcrFsException;
28 import org.osgi.framework.BundleContext;
29 import org.osgi.framework.FrameworkUtil;
30 import org.osgi.framework.InvalidSyntaxException;
31
32 /** Implementation of an {@link FileSystemProvider} based on Jackrabbit. */
33 public class CmsFsProvider extends AbstractJackrabbitFsProvider {
34 private Map<String, CmsFileSystem> fileSystems = new HashMap<>();
35
36 @Override
37 public String getScheme() {
38 return NodeConstants.SCHEME_NODE;
39 }
40
41 @Override
42 public FileSystem newFileSystem(URI uri, Map<String, ?> env) throws IOException {
43 BundleContext bc = FrameworkUtil.getBundle(CmsFsProvider.class).getBundleContext();
44 String username = CurrentUser.getUsername();
45 if (username == null) {
46 // TODO deal with anonymous
47 return null;
48 }
49 if (fileSystems.containsKey(username))
50 throw new FileSystemAlreadyExistsException("CMS file system already exists for user " + username);
51
52 try {
53 String host = uri.getHost();
54 if (host != null && !host.trim().equals("")) {
55 URI repoUri = new URI("http", uri.getUserInfo(), uri.getHost(), uri.getPort(), "/jcr/node", null, null);
56 RepositoryFactory repositoryFactory = bc.getService(bc.getServiceReference(RepositoryFactory.class));
57 Repository repository = NodeUtils.getRepositoryByUri(repositoryFactory, repoUri.toString());
58 CmsFileSystem fileSystem = new CmsFileSystem(this, repository);
59 fileSystems.put(username, fileSystem);
60 return fileSystem;
61 } else {
62 Repository repository = bc.getService(
63 bc.getServiceReferences(Repository.class, "(cn=" + NodeConstants.EGO_REPOSITORY + ")")
64 .iterator().next());
65 // Session session = repository.login();
66 CmsFileSystem fileSystem = new CmsFileSystem(this, repository);
67 fileSystems.put(username, fileSystem);
68 return fileSystem;
69 }
70 } catch (InvalidSyntaxException | URISyntaxException e) {
71 throw new IllegalArgumentException("Cannot open file system " + uri + " for user " + username, e);
72 }
73 }
74
75 @Override
76 public FileSystem getFileSystem(URI uri) {
77 return currentUserFileSystem();
78 }
79
80 @Override
81 public Path getPath(URI uri) {
82 JcrFileSystem fileSystem = currentUserFileSystem();
83 String path = uri.getPath();
84 if (fileSystem == null)
85 try {
86 fileSystem = (JcrFileSystem) newFileSystem(uri, new HashMap<String, Object>());
87 } catch (IOException e) {
88 throw new JcrFsException("Could not autocreate file system", e);
89 }
90 return fileSystem.getPath(path);
91 }
92
93 protected JcrFileSystem currentUserFileSystem() {
94 String username = CurrentUser.getUsername();
95 return fileSystems.get(username);
96 }
97
98 public Node getUserHome(Repository repository) {
99 try {
100 Session session = repository.login(NodeConstants.HOME_WORKSPACE);
101 return NodeUtils.getUserHome(session);
102 } catch (RepositoryException e) {
103 throw new IllegalStateException("Cannot get user home", e);
104 }
105 }
106
107 static class CmsFileSystem extends JcrFileSystem {
108 public CmsFileSystem(JcrFileSystemProvider provider, Repository repository) throws IOException {
109 super(provider, repository);
110 }
111
112 public boolean skipNode(Node node) throws RepositoryException {
113 // if (node.isNodeType(NodeType.NT_HIERARCHY_NODE) || node.isNodeType(NodeTypes.NODE_USER_HOME)
114 // || node.isNodeType(NodeTypes.NODE_GROUP_HOME))
115 if (node.isNodeType(NodeType.NT_HIERARCHY_NODE))
116 return false;
117 // FIXME Better identifies home
118 if (node.hasProperty(Property.JCR_ID))
119 return false;
120 return true;
121 }
122
123 }
124 }