1 package org
.argeo
.cms
.jcr
.internal
;
3 import java
.io
.IOException
;
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
;
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
;
21 import org
.argeo
.api
.cms
.CmsConstants
;
22 import org
.argeo
.cms
.auth
.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
;
29 /** Implementation of an {@link FileSystemProvider} based on Jackrabbit. */
30 public class CmsJcrFsProvider
extends AbstractJackrabbitFsProvider
{
31 private Map
<String
, CmsFileSystem
> fileSystems
= new HashMap
<>();
33 private RepositoryFactory repositoryFactory
;
34 private Repository repository
;
37 public String
getScheme() {
38 return CmsConstants
.SCHEME_NODE
;
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
49 if (fileSystems
.containsKey(username
))
50 throw new FileSystemAlreadyExistsException("CMS file system already exists for user " + username
);
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
);
62 // Repository repository = bc.getService(
63 // bc.getServiceReferences(Repository.class, "(cn=" + CmsConstants.EGO_REPOSITORY + ")")
64 // .iterator().next());
66 // Session session = repository.login();
67 CmsFileSystem fileSystem
= new CmsFileSystem(this, repository
);
68 fileSystems
.put(username
, fileSystem
);
71 } catch (URISyntaxException e
) {
72 throw new IllegalArgumentException("Cannot open file system " + uri
+ " for user " + username
, e
);
77 public FileSystem
getFileSystem(URI uri
) {
78 return currentUserFileSystem();
82 public Path
getPath(URI uri
) {
83 JcrFileSystem fileSystem
= currentUserFileSystem();
84 String path
= uri
.getPath();
85 if (fileSystem
== null)
87 fileSystem
= (JcrFileSystem
) newFileSystem(uri
, new HashMap
<String
, Object
>());
88 } catch (IOException e
) {
89 throw new JcrFsException("Could not autocreate file system", e
);
91 return fileSystem
.getPath(path
);
94 protected JcrFileSystem
currentUserFileSystem() {
95 String username
= CurrentUser
.getUsername();
96 return fileSystems
.get(username
);
99 public Node
getUserHome(Repository repository
) {
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
);
108 public void setRepositoryFactory(RepositoryFactory repositoryFactory
) {
109 this.repositoryFactory
= repositoryFactory
;
112 public void setRepository(Repository repository
) {
113 this.repository
= repository
;
116 static class CmsFileSystem
extends JcrFileSystem
{
117 public CmsFileSystem(JcrFileSystemProvider provider
, Repository repository
) throws IOException
{
118 super(provider
, repository
);
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
))
126 // FIXME Better identifies home
127 if (node
.hasProperty(Property
.JCR_ID
))