]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/osgi/useradmin/LdifGroup.java
Improve ACR attribute typing.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / osgi / useradmin / LdifGroup.java
1 package org.argeo.cms.osgi.useradmin;
2
3 import java.util.ArrayList;
4 import java.util.List;
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.CmsGroup;
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 CmsGroup {
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 List<Role> directMembers = new ArrayList<Role>();
73 for (LdapName ldapName : getReferences(memberAttributeId)) {
74 Role 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 /**
84 * Whether a role with this name can be found from this context.
85 *
86 * @return The related {@link Role} or <code>null</code>.
87 */
88 protected Role findRole(LdapName ldapName) {
89 Role role = getUserAdmin().getRole(ldapName.toString());
90 if (role == null) {
91 if (getUserAdmin().getExternalRoles() != null)
92 role = getUserAdmin().getExternalRoles().getRole(ldapName.toString());
93 }
94 return role;
95 }
96
97 // @Override
98 // public List<LdapName> getMemberNames() {
99 // Attribute memberAttribute = getAttributes().get(memberAttributeId);
100 // if (memberAttribute == null)
101 // return new ArrayList<LdapName>();
102 // try {
103 // List<LdapName> roles = new ArrayList<LdapName>();
104 // NamingEnumeration<?> values = memberAttribute.getAll();
105 // while (values.hasMore()) {
106 // LdapName dn = new LdapName(values.next().toString());
107 // roles.add(dn);
108 // }
109 // return roles;
110 // } catch (NamingException e) {
111 // throw new IllegalStateException("Cannot get members", e);
112 // }
113 // }
114
115 @Override
116 public Role[] getRequiredMembers() {
117 throw new UnsupportedOperationException();
118 }
119
120 @Override
121 public int getType() {
122 return GROUP;
123 }
124
125 protected DirectoryUserAdmin getUserAdmin() {
126 return (DirectoryUserAdmin) getDirectory();
127 }
128 }