]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.enterprise/src/org/argeo/osgi/useradmin/LdifGroup.java
Change the approach for releases
[lgpl/argeo-commons.git] / org.argeo.enterprise / src / org / argeo / osgi / useradmin / LdifGroup.java
1 package org.argeo.osgi.useradmin;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import javax.naming.InvalidNameException;
7 import javax.naming.NamingEnumeration;
8 import javax.naming.directory.Attribute;
9 import javax.naming.directory.Attributes;
10 import javax.naming.ldap.LdapName;
11
12 import org.osgi.service.useradmin.Role;
13
14 /** Directory group implementation */
15 class LdifGroup extends LdifUser implements DirectoryGroup {
16 private final String memberAttributeId;
17
18 LdifGroup(AbstractUserDirectory userAdmin, LdapName dn, Attributes attributes) {
19 super(userAdmin, dn, attributes);
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 : getMemberNames()) {
74 Role role = findRole(ldapName);
75 if (role == null) {
76 throw new UserDirectoryException("Role " + ldapName + " cannot be added.");
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 (Exception e) {
111 throw new UserDirectoryException("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 }