]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifGroup.java
Use Argeo TP v2.1.10
[lgpl/argeo-commons.git] / org.argeo.security.core / src / org / argeo / osgi / useradmin / LdifGroup.java
index c2c666700710c994aa6af93c080c066854ba2cca..a19052425491759a9c2c55687522fa9532a49397 100644 (file)
@@ -10,16 +10,32 @@ import javax.naming.ldap.LdapName;
 
 import org.osgi.service.useradmin.Group;
 import org.osgi.service.useradmin.Role;
+import org.osgi.service.useradmin.UserAdmin;
 
 public class LdifGroup extends LdifUser implements Group {
+       // optimisation
+       // List<Role> directMembers = null;
 
-       public LdifGroup(LdapName dn, Attributes attributes) {
+       private final UserAdmin userAdmin;
+       private String memberAttrName = "member";
+
+       public LdifGroup(UserAdmin userAdmin, LdapName dn, Attributes attributes) {
                super(dn, attributes);
+               this.userAdmin = userAdmin;
        }
 
        @Override
        public boolean addMember(Role role) {
-               throw new UnsupportedOperationException();
+               Attribute member = getAttributes().get(memberAttrName);
+               if (member != null) {
+                       if (member.contains(role.getName()))
+                               return false;
+               } else
+                       getAttributes().put(memberAttrName, role.getName());
+               // directMembers.add(role);
+               // if (role instanceof LdifUser)
+               // ((LdifUser) role).directMemberOf.add(this);
+               return true;
        }
 
        @Override
@@ -29,22 +45,89 @@ public class LdifGroup extends LdifUser implements Group {
 
        @Override
        public boolean removeMember(Role role) {
-               throw new UnsupportedOperationException();
+               Attribute member = getAttributes().get(memberAttrName);
+               if (member != null) {
+                       if (!member.contains(role.getName()))
+                               return false;
+                       member.remove(role.getName());
+                       // directMembers.remove(role);
+                       // if (role instanceof LdifUser)
+                       // ((LdifUser) role).directMemberOf.remove(this);
+                       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 = userAdmin.getRole(ldapName.toString());
+                       if (role == null && userAdmin instanceof AbstractLdapUserAdmin) {
+                               AbstractLdapUserAdmin ua = (AbstractLdapUserAdmin) userAdmin;
+                               if (ua.getExternalRoles() != null)
+                                       role = ua.getExternalRoles().getRole(ldapName.toString());
+                       }
+                       if (role == null)
+                               throw new ArgeoUserAdminException("No role found for "
+                                               + ldapName);
+
+                       // role.directMemberOf.add(group);
+                       // if (!directMemberOf.containsKey(role.getDn()))
+                       // directMemberOf.put(role.getDn(), new ArrayList<LdifGroup>());
+                       // directMemberOf.get(role.getDn()).add(group);
+                       directMembers.add(role);
+               }
+               return directMembers.toArray(new Role[directMembers.size()]);
+               // if (directMembers != null)
+               // return directMembers.toArray(new Role[directMembers.size()]);
+               // else
+               // throw new ArgeoUserAdminException("Members have not been loaded.");
+
+               // Attribute memberAttribute = getAttributes().get(memberAttrName);
+               // if (memberAttribute == null)
+               // return new Role[0];
+               // try {
+               // List<Role> roles = new ArrayList<Role>();
+               // NamingEnumeration values = memberAttribute.getAll();
+               // while (values.hasMore()) {
+               // LdapName dn = new LdapName(values.next().toString());
+               // roles.add(new LdifUser(dn, null));
+               // }
+               // return roles.toArray(new Role[roles.size()]);
+               // } catch (Exception e) {
+               // throw new ArgeoUserAdminException("Cannot get members", e);
+               // }
+       }
+
+       // void loadMembers(LdifUserAdmin userAdmin) {
+       // directMembers = new ArrayList<Role>();
+       // for (LdapName ldapName : getMemberNames()) {
+       // LdifUser role;
+       // if (userAdmin.groups.containsKey(ldapName))
+       // role = userAdmin.groups.get(ldapName);
+       // else if (userAdmin.users.containsKey(ldapName))
+       // role = userAdmin.users.get(ldapName);
+       // else
+       // throw new ArgeoUserAdminException("No role found for "
+       // + ldapName);
+       // role.directMemberOf.add(this);
+       // directMembers.add(role);
+       // }
+       // }
+
+       List<LdapName> getMemberNames() {
+               Attribute memberAttribute = getAttributes().get(memberAttrName);
                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);
                }
@@ -60,4 +143,8 @@ public class LdifGroup extends LdifUser implements Group {
                return GROUP;
        }
 
+       public String getMemberAttrName() {
+               return memberAttrName;
+       }
+
 }