]> git.argeo.org Git - lgpl/argeo-commons.git/blob - useradmin/LdifGroup.java
Prepare next development cycle
[lgpl/argeo-commons.git] / useradmin / LdifGroup.java
1 package org.argeo.cms.osgi.useradmin;
2
3 import java.util.HashSet;
4 import java.util.Set;
5
6 import javax.naming.InvalidNameException;
7 import javax.naming.directory.Attribute;
8 import javax.naming.ldap.LdapName;
9
10 import org.argeo.api.cms.directory.CmsRole;
11 import org.argeo.cms.directory.ldap.AbstractLdapDirectory;
12 import org.osgi.service.useradmin.Role;
13
14 /** Directory group implementation */
15 class LdifGroup extends LdifUser implements CmsOsgiGroup {
16 private final String memberAttributeId;
17
18 LdifGroup(AbstractLdapDirectory userAdmin, LdapName dn) {
19 super(userAdmin, dn);
20 memberAttributeId = userAdmin.getMemberAttributeId();
21 }
22
23 @Override
24 public boolean addMember(Role role) {
25 try {
26 Role foundRole = findRole(new LdapName(role.getName()));
27 if (foundRole == null)
28 throw new UnsupportedOperationException(
29 "Adding role " + role.getName() + " is unsupported within this context.");
30 } catch (InvalidNameException e) {
31 throw new IllegalArgumentException("Role name" + role.getName() + " is badly formatted");
32 }
33
34 getUserAdmin().checkEdit();
35 if (!isEditing())
36 startEditing();
37
38 Attribute member = getAttributes().get(memberAttributeId);
39 if (member != null) {
40 if (member.contains(role.getName()))
41 return false;
42 else
43 member.add(role.getName());
44 } else
45 getAttributes().put(memberAttributeId, role.getName());
46 return true;
47 }
48
49 @Override
50 public boolean addRequiredMember(Role role) {
51 throw new UnsupportedOperationException();
52 }
53
54 @Override
55 public boolean removeMember(Role role) {
56 getUserAdmin().checkEdit();
57 if (!isEditing())
58 startEditing();
59
60 Attribute member = getAttributes().get(memberAttributeId);
61 if (member != null) {
62 if (!member.contains(role.getName()))
63 return false;
64 member.remove(role.getName());
65 return true;
66 } else
67 return false;
68 }
69
70 @Override
71 public Role[] getMembers() {
72 Set<CmsOsgiRole> directMembers = new HashSet<>();
73 for (LdapName ldapName : getReferences(memberAttributeId)) {
74 CmsOsgiRole role = findRole(ldapName);
75 if (role == null) {
76 throw new IllegalStateException("Role " + ldapName + " not found.");
77 }
78 directMembers.add(role);
79 }
80 return directMembers.toArray(new Role[directMembers.size()]);
81 }
82
83 @Override
84 public Set<? extends CmsRole> getDirectMembers() {
85 return doGetDirectMembers();
86 }
87
88 protected Set<CmsOsgiRole> doGetDirectMembers() {
89 Set<CmsOsgiRole> directMembers = new HashSet<>();
90 for (LdapName ldapName : getReferences(memberAttributeId)) {
91 CmsOsgiRole role = findRole(ldapName);
92 if (role == null) {
93 throw new IllegalStateException("Role " + ldapName + " not found.");
94 }
95 directMembers.add(role);
96 }
97 return directMembers;
98 }
99
100 /**
101 * Whether a role with this name can be found from this context.
102 *
103 * @return The related {@link Role} or <code>null</code>.
104 */
105 protected CmsOsgiRole findRole(LdapName ldapName) {
106 Role role = getUserAdmin().getRole(ldapName.toString());
107 if (role == null) {
108 if (getUserAdmin().getExternalRoles() != null)
109 role = getUserAdmin().getExternalRoles().getRole(ldapName.toString());
110 }
111 return (CmsOsgiRole) role;
112 }
113
114 // @Override
115 // public List<LdapName> getMemberNames() {
116 // Attribute memberAttribute = getAttributes().get(memberAttributeId);
117 // if (memberAttribute == null)
118 // return new ArrayList<LdapName>();
119 // try {
120 // List<LdapName> roles = new ArrayList<LdapName>();
121 // NamingEnumeration<?> values = memberAttribute.getAll();
122 // while (values.hasMore()) {
123 // LdapName dn = new LdapName(values.next().toString());
124 // roles.add(dn);
125 // }
126 // return roles;
127 // } catch (NamingException e) {
128 // throw new IllegalStateException("Cannot get members", e);
129 // }
130 // }
131
132 @Override
133 public Role[] getRequiredMembers() {
134 throw new UnsupportedOperationException();
135 }
136
137 @Override
138 public int getType() {
139 return GROUP;
140 }
141
142 protected DirectoryUserAdmin getUserAdmin() {
143 return (DirectoryUserAdmin) getDirectory();
144 }
145 }