1 package org
.argeo
.cms
.internal
.kernel
;
3 import java
.io
.IOException
;
5 import java
.nio
.file
.FileSystem
;
6 import java
.nio
.file
.FileSystemAlreadyExistsException
;
7 import java
.nio
.file
.Path
;
8 import java
.util
.HashMap
;
11 import javax
.jcr
.Node
;
12 import javax
.jcr
.Repository
;
13 import javax
.jcr
.RepositoryException
;
14 import javax
.jcr
.RepositoryFactory
;
15 import javax
.jcr
.Session
;
16 import javax
.jcr
.nodetype
.NodeType
;
18 import org
.argeo
.cms
.CmsException
;
19 import org
.argeo
.cms
.auth
.CurrentUser
;
20 import org
.argeo
.jackrabbit
.fs
.AbstractJackrabbitFsProvider
;
21 import org
.argeo
.jcr
.fs
.JcrFileSystem
;
22 import org
.argeo
.jcr
.fs
.JcrFileSystemProvider
;
23 import org
.argeo
.jcr
.fs
.JcrFsException
;
24 import org
.argeo
.node
.NodeConstants
;
25 import org
.argeo
.node
.NodeTypes
;
26 import org
.argeo
.node
.NodeUtils
;
27 import org
.osgi
.framework
.BundleContext
;
28 import org
.osgi
.framework
.FrameworkUtil
;
30 public class CmsFsProvider
extends AbstractJackrabbitFsProvider
{
31 private Map
<String
, CmsFileSystem
> fileSystems
= new HashMap
<>();
34 public String
getScheme() {
35 return NodeConstants
.SCHEME_NODE
;
39 public FileSystem
newFileSystem(URI uri
, Map
<String
, ?
> env
) throws IOException
{
40 BundleContext bc
= FrameworkUtil
.getBundle(CmsFsProvider
.class).getBundleContext();
41 String username
= CurrentUser
.getUsername();
42 if (username
== null) {
43 // TODO deal with anonymous
46 if (fileSystems
.containsKey(username
))
47 throw new FileSystemAlreadyExistsException("CMS file system already exists for user " + username
);
50 String host
= uri
.getHost();
51 if (host
!= null && !host
.trim().equals("")) {
52 URI repoUri
= new URI("http", uri
.getUserInfo(), uri
.getHost(), uri
.getPort(), "/jcr/node", null, null);
53 RepositoryFactory repositoryFactory
= bc
.getService(bc
.getServiceReference(RepositoryFactory
.class));
54 Repository repository
= NodeUtils
.getRepositoryByUri(repositoryFactory
, repoUri
.toString());
55 Session session
= repository
.login("main");
56 CmsFileSystem fileSystem
= new CmsFileSystem(this, session
);
57 fileSystems
.put(username
, fileSystem
);
60 Repository repository
= bc
.getService(
61 bc
.getServiceReferences(Repository
.class, "(cn=" + NodeConstants
.HOME
+ ")").iterator().next());
62 Session session
= repository
.login();
63 CmsFileSystem fileSystem
= new CmsFileSystem(this, session
);
64 fileSystems
.put(username
, fileSystem
);
67 } catch (Exception e
) {
68 throw new CmsException("Cannot open file system " + uri
+ " for user " + username
, e
);
73 public FileSystem
getFileSystem(URI uri
) {
74 return currentUserFileSystem();
78 public Path
getPath(URI uri
) {
79 JcrFileSystem fileSystem
= currentUserFileSystem();
80 String path
= uri
.getPath();
81 if (fileSystem
== null)
83 fileSystem
= (JcrFileSystem
) newFileSystem(uri
, new HashMap
<String
, Object
>());
84 } catch (IOException e
) {
85 throw new JcrFsException("Could not autocreate file system", e
);
87 return fileSystem
.getPath(path
);
90 protected JcrFileSystem
currentUserFileSystem() {
91 String username
= CurrentUser
.getUsername();
92 return fileSystems
.get(username
);
95 public Node
getUserHome(Session session
) {
96 return NodeUtils
.getUserHome(session
);
99 static class CmsFileSystem
extends JcrFileSystem
{
100 public CmsFileSystem(JcrFileSystemProvider provider
, Session session
) throws IOException
{
101 super(provider
, session
);
104 public boolean skipNode(Node node
) throws RepositoryException
{
105 if (node
.isNodeType(NodeType
.NT_HIERARCHY_NODE
) || node
.isNodeType(NodeTypes
.NODE_USER_HOME
)
106 || node
.isNodeType(NodeTypes
.NODE_GROUP_HOME
))