]> git.argeo.org Git - gpl/argeo-jcr.git/blob - CmsJcrFsProvider.java
4eb693b9cc9d78b200edb35d84db91e33f8c06e9
[gpl/argeo-jcr.git] / CmsJcrFsProvider.java
1 package org.argeo.cms.jcr.internal;
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.cms.CmsConstants;
22 import org.argeo.cms.CurrentUser;
23 import org.argeo.cms.jcr.CmsJcrUtils;
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
29 /** Implementation of an {@link FileSystemProvider} based on Jackrabbit. */
30 public class CmsJcrFsProvider extends AbstractJackrabbitFsProvider {
31 private Map<String, CmsFileSystem> fileSystems = new HashMap<>();
32
33 private RepositoryFactory repositoryFactory;
34 private Repository repository;
35
36 @Override
37 public String getScheme() {
38 return CmsConstants.SCHEME_NODE;
39 }
40
41 @Override
42 public FileSystem newFileSystem(URI uri, Map<String, ?> env) throws IOException {
43 // BundleContext bc = FrameworkUtil.getBundle(CmsJcrFsProvider.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 = CmsJcrUtils.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=" + CmsConstants.EGO_REPOSITORY + ")")
64 // .iterator().next());
65
66 // Session session = repository.login();
67 CmsFileSystem fileSystem = new CmsFileSystem(this, repository);
68 fileSystems.put(username, fileSystem);
69 return fileSystem;
70 }
71 } catch (URISyntaxException e) {
72 throw new IllegalArgumentException("Cannot open file system " + uri + " for user " + username, e);
73 }
74 }
75
76 @Override
77 public FileSystem getFileSystem(URI uri) {
78 return currentUserFileSystem();
79 }
80
81 @Override
82 public Path getPath(URI uri) {
83 JcrFileSystem fileSystem = currentUserFileSystem();
84 String path = uri.getPath();
85 if (fileSystem == null)
86 try {
87 fileSystem = (JcrFileSystem) newFileSystem(uri, new HashMap<String, Object>());
88 } catch (IOException e) {
89 throw new JcrFsException("Could not autocreate file system", e);
90 }
91 return fileSystem.getPath(path);
92 }
93
94 protected JcrFileSystem currentUserFileSystem() {
95 String username = CurrentUser.getUsername();
96 return fileSystems.get(username);
97 }
98
99 public Node getUserHome(Repository repository) {
100 try {
101 Session session = repository.login(CmsConstants.HOME_WORKSPACE);
102 return CmsJcrUtils.getUserHome(session);
103 } catch (RepositoryException e) {
104 throw new IllegalStateException("Cannot get user home", e);
105 }
106 }
107
108 public void setRepositoryFactory(RepositoryFactory repositoryFactory) {
109 this.repositoryFactory = repositoryFactory;
110 }
111
112 public void setRepository(Repository repository) {
113 this.repository = repository;
114 }
115
116 static class CmsFileSystem extends JcrFileSystem {
117 public CmsFileSystem(JcrFileSystemProvider provider, Repository repository) throws IOException {
118 super(provider, repository);
119 }
120
121 public boolean skipNode(Node node) throws RepositoryException {
122 // if (node.isNodeType(NodeType.NT_HIERARCHY_NODE) || node.isNodeType(NodeTypes.NODE_USER_HOME)
123 // || node.isNodeType(NodeTypes.NODE_GROUP_HOME))
124 if (node.isNodeType(NodeType.NT_HIERARCHY_NODE))
125 return false;
126 // FIXME Better identifies home
127 if (node.hasProperty(Property.JCR_ID))
128 return false;
129 return true;
130 }
131
132 }
133 }