1 package org
.argeo
.cms
.acr
.directory
;
3 import java
.util
.ArrayList
;
4 import java
.util
.Collections
;
5 import java
.util
.Iterator
;
8 import javax
.xml
.namespace
.QName
;
10 import org
.argeo
.api
.acr
.ArgeoNamespace
;
11 import org
.argeo
.api
.acr
.Content
;
12 import org
.argeo
.api
.acr
.ContentName
;
13 import org
.argeo
.api
.acr
.ContentNotFoundException
;
14 import org
.argeo
.api
.acr
.spi
.ContentProvider
;
15 import org
.argeo
.api
.acr
.spi
.ProvidedContent
;
16 import org
.argeo
.api
.acr
.spi
.ProvidedSession
;
17 import org
.argeo
.api
.cms
.directory
.CmsUserManager
;
18 import org
.argeo
.api
.cms
.directory
.HierarchyUnit
;
19 import org
.argeo
.api
.cms
.directory
.UserDirectory
;
20 import org
.argeo
.cms
.acr
.AbstractContent
;
21 import org
.argeo
.cms
.acr
.ContentUtils
;
22 import org
.osgi
.service
.useradmin
.User
;
24 public class DirectoryContentProvider
implements ContentProvider
{
25 private String mountPath
;
26 private String mountName
;
28 private CmsUserManager userManager
;
30 public DirectoryContentProvider(String mountPath
, CmsUserManager userManager
) {
31 this.mountPath
= mountPath
;
32 List
<String
> mountSegments
= ContentUtils
.toPathSegments(mountPath
);
33 this.mountName
= mountSegments
.get(mountSegments
.size() - 1);
34 this.userManager
= userManager
;
38 public ProvidedContent
get(ProvidedSession session
, String relativePath
) {
39 List
<String
> segments
= ContentUtils
.toPathSegments(relativePath
);
40 if (segments
.size() == 0)
41 return new UserManagerContent(session
);
42 String userDirectoryName
= segments
.get(0);
43 UserDirectory userDirectory
= null;
44 userDirectories
: for (UserDirectory ud
: userManager
.getUserDirectories()) {
45 if (userDirectoryName
.equals(ud
.getName())) {
47 break userDirectories
;
50 if (userDirectory
== null)
51 throw new ContentNotFoundException(session
, mountPath
+ "/" + relativePath
,
52 "Cannot find user directory " + userDirectoryName
);
53 if (segments
.size() == 1) {
54 return new DirectoryContent(session
, this, userDirectory
);
56 List
<String
> relSegments
= new ArrayList
<>(segments
);
57 relSegments
.remove(0);
58 String pathWithinUserDirectory
= ContentUtils
.toPath(relSegments
);
61 // dn = LdapNameUtils.toLdapName(userDirectoryDn);
62 // for (int i = 1; i < segments.size(); i++) {
63 // dn.add(segments.get(i));
65 // } catch (InvalidNameException e) {
66 // throw new IllegalStateException("Cannot interpret " + segments + " as DN", e);
68 User user
= (User
) userDirectory
.getRoleByPath(pathWithinUserDirectory
);
70 HierarchyUnit parent
= userDirectory
.getHierarchyUnit(user
);
71 return new RoleContent(session
, this, new HierarchyUnitContent(session
, this, parent
), user
);
73 HierarchyUnit hierarchyUnit
= userDirectory
.getHierarchyUnit(pathWithinUserDirectory
);
74 if (hierarchyUnit
== null)
75 throw new ContentNotFoundException(session
,
76 mountPath
+ "/" + relativePath
+ "/" + pathWithinUserDirectory
,
77 "Cannot find " + pathWithinUserDirectory
+ " within " + userDirectoryName
);
78 return new HierarchyUnitContent(session
, this, hierarchyUnit
);
83 public boolean exists(ProvidedSession session
, String relativePath
) {
84 // TODO Auto-generated method stub
89 public String
getMountPath() {
94 public String
getNamespaceURI(String prefix
) {
95 if (ArgeoNamespace
.LDAP_DEFAULT_PREFIX
.equals(prefix
))
96 return ArgeoNamespace
.LDAP_NAMESPACE_URI
;
97 throw new IllegalArgumentException("Only prefix " + ArgeoNamespace
.LDAP_DEFAULT_PREFIX
+ " is supported");
101 public Iterator
<String
> getPrefixes(String namespaceURI
) {
102 if (ArgeoNamespace
.LDAP_NAMESPACE_URI
.equals(namespaceURI
))
103 return Collections
.singletonList(ArgeoNamespace
.LDAP_DEFAULT_PREFIX
).iterator();
104 throw new IllegalArgumentException("Only namespace URI " + ArgeoNamespace
.LDAP_NAMESPACE_URI
+ " is supported");
107 public void setUserManager(CmsUserManager userManager
) {
108 this.userManager
= userManager
;
111 public CmsUserManager
getUserManager() {
115 UserManagerContent
getRootContent(ProvidedSession session
) {
116 return new UserManagerContent(session
);
122 class UserManagerContent
extends AbstractContent
{
124 public UserManagerContent(ProvidedSession session
) {
129 public ContentProvider
getProvider() {
130 return DirectoryContentProvider
.this;
134 public QName
getName() {
135 return new ContentName(mountName
);
139 public Content
getParent() {
144 public Iterator
<Content
> iterator() {
145 List
<Content
> res
= new ArrayList
<>();
146 for (UserDirectory userDirectory
: userManager
.getUserDirectories()) {
147 DirectoryContent content
= new DirectoryContent(getSession(), DirectoryContentProvider
.this,
151 return res
.iterator();