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
.Content
;
11 import org
.argeo
.api
.acr
.ContentName
;
12 import org
.argeo
.api
.acr
.ContentNotFoundException
;
13 import org
.argeo
.api
.acr
.CrName
;
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
.cms
.CmsUserManager
;
18 import org
.argeo
.cms
.acr
.AbstractContent
;
19 import org
.argeo
.cms
.acr
.ContentUtils
;
20 import org
.argeo
.osgi
.useradmin
.HierarchyUnit
;
21 import org
.argeo
.osgi
.useradmin
.UserDirectory
;
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("Cannot find user directory " + userDirectoryName
);
52 if (segments
.size() == 1) {
53 return new DirectoryContent(session
, this, userDirectory
);
55 List
<String
> relSegments
= new ArrayList
<>(segments
);
56 relSegments
.remove(0);
57 String pathWithinUserDirectory
= ContentUtils
.toPath(relSegments
);
60 // dn = LdapNameUtils.toLdapName(userDirectoryDn);
61 // for (int i = 1; i < segments.size(); i++) {
62 // dn.add(segments.get(i));
64 // } catch (InvalidNameException e) {
65 // throw new IllegalStateException("Cannot interpret " + segments + " as DN", e);
67 User user
= (User
) userDirectory
.getRoleByPath(pathWithinUserDirectory
);
69 HierarchyUnit parent
= userDirectory
.getHierarchyUnit(user
);
70 return new RoleContent(session
, this, new HierarchyUnitContent(session
, this, parent
), user
);
72 HierarchyUnit hierarchyUnit
= userDirectory
.getHierarchyUnit(pathWithinUserDirectory
);
73 if (hierarchyUnit
== null)
74 throw new ContentNotFoundException(
75 "Cannot find " + pathWithinUserDirectory
+ " within " + userDirectoryName
);
76 return new HierarchyUnitContent(session
, this, hierarchyUnit
);
81 public boolean exists(ProvidedSession session
, String relativePath
) {
82 // TODO Auto-generated method stub
87 public String
getMountPath() {
92 public String
getNamespaceURI(String prefix
) {
93 if (CrName
.LDAP_DEFAULT_PREFIX
.equals(prefix
))
94 return CrName
.LDAP_NAMESPACE_URI
;
95 throw new IllegalArgumentException("Only prefix " + CrName
.LDAP_DEFAULT_PREFIX
+ " is supported");
99 public Iterator
<String
> getPrefixes(String namespaceURI
) {
100 if (CrName
.LDAP_NAMESPACE_URI
.equals(namespaceURI
))
101 return Collections
.singletonList(CrName
.LDAP_DEFAULT_PREFIX
).iterator();
102 throw new IllegalArgumentException("Only namespace URI " + CrName
.LDAP_NAMESPACE_URI
+ " is supported");
105 public void setUserManager(CmsUserManager userManager
) {
106 this.userManager
= userManager
;
109 UserManagerContent
getRootContent(ProvidedSession session
) {
110 return new UserManagerContent(session
);
113 class UserManagerContent
extends AbstractContent
{
115 public UserManagerContent(ProvidedSession session
) {
120 public ContentProvider
getProvider() {
121 return DirectoryContentProvider
.this;
125 public QName
getName() {
126 return new ContentName(mountName
);
130 public Content
getParent() {
135 public Iterator
<Content
> iterator() {
136 List
<Content
> res
= new ArrayList
<>();
137 for (UserDirectory userDirectory
: userManager
.getUserDirectories()) {
138 DirectoryContent content
= new DirectoryContent(getSession(), DirectoryContentProvider
.this,
142 return res
.iterator();