Improve and simplify OSGi Boot
[lgpl/argeo-commons.git] / org.argeo.security.core / src / org / argeo / osgi / useradmin / LdifGroup.java
index c2c666700710c994aa6af93c080c066854ba2cca..bd129119b2592366a49fdba8582fa892d9795e0c 100644 (file)
@@ -8,18 +8,33 @@ import javax.naming.directory.Attribute;
 import javax.naming.directory.Attributes;
 import javax.naming.ldap.LdapName;
 
-import org.osgi.service.useradmin.Group;
 import org.osgi.service.useradmin.Role;
 
-public class LdifGroup extends LdifUser implements Group {
+/** Directory group implementation */
+class LdifGroup extends LdifUser implements DirectoryGroup {
+       private final String memberAttributeId;
 
-       public LdifGroup(LdapName dn, Attributes attributes) {
-               super(dn, attributes);
+       LdifGroup(AbstractUserDirectory userAdmin, LdapName dn,
+                       Attributes attributes) {
+               super(userAdmin, dn, attributes);
+               memberAttributeId = userAdmin.getMemberAttributeId();
        }
 
        @Override
        public boolean addMember(Role role) {
-               throw new UnsupportedOperationException();
+               getUserAdmin().checkEdit();
+               if (!isEditing())
+                       startEditing();
+
+               Attribute member = getAttributes().get(memberAttributeId);
+               if (member != null) {
+                       if (member.contains(role.getName()))
+                               return false;
+                       else
+                               member.add(role.getName());
+               } else
+                       getAttributes().put(memberAttributeId, role.getName());
+               return true;
        }
 
        @Override
@@ -29,24 +44,53 @@ public class LdifGroup extends LdifUser implements Group {
 
        @Override
        public boolean removeMember(Role role) {
-               throw new UnsupportedOperationException();
+               getUserAdmin().checkEdit();
+               if (!isEditing())
+                       startEditing();
+
+               Attribute member = getAttributes().get(memberAttributeId);
+               if (member != null) {
+                       if (!member.contains(role.getName()))
+                               return false;
+                       member.remove(role.getName());
+                       return true;
+               } else
+                       return false;
        }
 
        @Override
        public Role[] getMembers() {
-               Attribute memberAttribute = getAttributes().get("member");
+               List<Role> directMembers = new ArrayList<Role>();
+               for (LdapName ldapName : getMemberNames()) {
+                       Role role = getUserAdmin().getRole(ldapName.toString());
+                       if (role == null) {
+                               if (getUserAdmin().getExternalRoles() != null)
+                                       role = getUserAdmin().getExternalRoles().getRole(
+                                                       ldapName.toString());
+                       }
+                       if (role == null)
+                               throw new UserDirectoryException("No role found for "
+                                               + ldapName);
+                       directMembers.add(role);
+               }
+               return directMembers.toArray(new Role[directMembers.size()]);
+       }
+
+       @Override
+       public List<LdapName> getMemberNames() {
+               Attribute memberAttribute = getAttributes().get(memberAttributeId);
                if (memberAttribute == null)
-                       return new Role[0];
+                       return new ArrayList<LdapName>();
                try {
-                       List<Role> roles = new ArrayList<Role>();
-                       NamingEnumeration values = memberAttribute.getAll();
+                       List<LdapName> roles = new ArrayList<LdapName>();
+                       NamingEnumeration<?> values = memberAttribute.getAll();
                        while (values.hasMore()) {
                                LdapName dn = new LdapName(values.next().toString());
-                               roles.add(new LdifUser(dn, null));
+                               roles.add(dn);
                        }
-                       return roles.toArray(new Role[roles.size()]);
+                       return roles;
                } catch (Exception e) {
-                       throw new ArgeoUserAdminException("Cannot get members", e);
+                       throw new UserDirectoryException("Cannot get members", e);
                }
        }
 
@@ -59,5 +103,4 @@ public class LdifGroup extends LdifUser implements Group {
        public int getType() {
                return GROUP;
        }
-
 }