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
.Repository
;
12 import javax
.jcr
.Session
;
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
;
23 public class CmsFsProvider
extends AbstractJackrabbitFsProvider
{
24 private Map
<String
, JcrFileSystem
> fileSystems
= new HashMap
<>();
25 private BundleContext bc
= FrameworkUtil
.getBundle(CmsFsProvider
.class).getBundleContext();
28 public String
getScheme() {
29 return NodeConstants
.SCHEME_NODE
;
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
39 if (fileSystems
.containsKey(username
))
40 throw new FileSystemAlreadyExistsException("CMS file system already exists for user " + username
);
43 Repository repository
= bc
44 .getService(bc
.getServiceReferences(Repository
.class, "(cn=node)").iterator().next());
45 Session session
= repository
.login();
46 JcrFileSystem fileSystem
= new JcrFileSystem(this, session
);
47 fileSystems
.put(username
, fileSystem
);
49 } catch (Exception e
) {
50 throw new CmsException("Cannot open file system " + uri
+ " for user " + username
, e
);
55 public FileSystem
getFileSystem(URI uri
) {
56 return currentUserFileSystem();
60 public Path
getPath(URI uri
) {
61 JcrFileSystem fileSystem
= currentUserFileSystem();
62 String path
= uri
.getPath();
63 if (fileSystem
== null)
65 fileSystem
= (JcrFileSystem
) newFileSystem(uri
, new HashMap
<String
, Object
>());
66 } catch (IOException e
) {
67 throw new JcrFsException("Could not autocreate file system", e
);
69 return fileSystem
.getPath(path
);
72 protected JcrFileSystem
currentUserFileSystem() {
73 String username
= CurrentUser
.getUsername();
74 return fileSystems
.get(username
);