View Javadoc
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 }