]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.util/src/org/argeo/osgi/useradmin/LdifUser.java
Introduce transaction working copy abstraction
[lgpl/argeo-commons.git] / org.argeo.util / src / org / argeo / osgi / useradmin / LdifUser.java
index 552bfdc8da8bfbeaac3d20c608abbb64e2d2d63d..aaac50272a02cb605ec962521fcf77f9f873a06a 100644 (file)
@@ -10,10 +10,8 @@ import java.util.Base64;
 import java.util.Collections;
 import java.util.Dictionary;
 import java.util.Enumeration;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Set;
 import java.util.StringJoiner;
 
 import javax.naming.NamingEnumeration;
@@ -23,13 +21,14 @@ import javax.naming.directory.Attributes;
 import javax.naming.directory.BasicAttribute;
 import javax.naming.ldap.LdapName;
 
-import org.argeo.util.naming.AuthPassword;
+import org.argeo.util.directory.Person;
 import org.argeo.util.naming.LdapAttrs;
 import org.argeo.util.naming.LdapObjs;
 import org.argeo.util.naming.SharedSecret;
+import org.argeo.util.naming.ldap.AuthPassword;
 
 /** Directory user implementation */
-class LdifUser implements DirectoryUser {
+abstract class LdifUser implements DirectoryUser {
        private final AbstractUserDirectory userAdmin;
 
        private final LdapName dn;
@@ -184,22 +183,22 @@ class LdifUser implements DirectoryUser {
        /** Should only be called from working copy thread. */
        private synchronized Attributes getModifiedAttributes() {
                assert getWc() != null;
-               return getWc().getAttributes(getDn());
+               return getWc().getModifiedData().get(getDn());
        }
 
        protected synchronized boolean isEditing() {
                return getWc() != null && getModifiedAttributes() != null;
        }
 
-       private synchronized UserDirectoryWorkingCopy getWc() {
+       private synchronized DirectoryUserWorkingCopy getWc() {
                return userAdmin.getWorkingCopy();
        }
 
        protected synchronized void startEditing() {
                if (frozen)
-                       throw new UserDirectoryException("Cannot edit frozen view");
+                       throw new IllegalStateException("Cannot edit frozen view");
                if (getUserAdmin().isReadOnly())
-                       throw new UserDirectoryException("User directory is read-only");
+                       throw new IllegalStateException("User directory is read-only");
                assert getModifiedAttributes() == null;
                getWc().startEditing(this);
                // modifiedAttributes = (Attributes) publishedAttributes.clone();
@@ -209,9 +208,9 @@ class LdifUser implements DirectoryUser {
                publishedAttributes = modifiedAttributes;
        }
 
-       public DirectoryUser getPublished() {
-               return new LdifUser(userAdmin, dn, publishedAttributes, true);
-       }
+//     public DirectoryUser getPublished() {
+//             return new LdifUser(userAdmin, dn, publishedAttributes, true);
+//     }
 
        @Override
        public int hashCode() {
@@ -243,21 +242,23 @@ class LdifUser implements DirectoryUser {
                private final List<String> attrFilter;
                private final Boolean includeFilter;
 
-               public AttributeDictionary(Boolean includeFilter) {
+               public AttributeDictionary(Boolean credentials) {
                        this.attrFilter = userAdmin.getCredentialAttributeIds();
-                       this.includeFilter = includeFilter;
+                       this.includeFilter = credentials;
                        try {
                                NamingEnumeration<String> ids = getAttributes().getIDs();
                                while (ids.hasMore()) {
                                        String id = ids.next();
-                                       if (includeFilter && attrFilter.contains(id))
+                                       if (credentials && attrFilter.contains(id))
                                                effectiveKeys.add(id);
-                                       else if (!includeFilter && !attrFilter.contains(id))
+                                       else if (!credentials && !attrFilter.contains(id))
                                                effectiveKeys.add(id);
                                }
                        } catch (NamingException e) {
-                               throw new UserDirectoryException("Cannot initialise attribute dictionary", e);
+                               throw new IllegalStateException("Cannot initialise attribute dictionary", e);
                        }
+                       if (!credentials)
+                               effectiveKeys.add(LdapAttrs.objectClasses.name());
                }
 
                @Override
@@ -297,7 +298,8 @@ class LdifUser implements DirectoryUser {
                @Override
                public Object get(Object key) {
                        try {
-                               Attribute attr = getAttributes().get(key.toString());
+                               Attribute attr = !key.equals(LdapAttrs.objectClasses.name()) ? getAttributes().get(key.toString())
+                                               : getAttributes().get(LdapAttrs.objectClass.name());
                                if (attr == null)
                                        return null;
                                Object value = attr.get();
@@ -310,7 +312,7 @@ class LdifUser implements DirectoryUser {
                                if (attr.size() == 1)
                                        return value;
                                // special case for object class
-                               if (attr.getID().equals(LdapAttrs.objectClass.name())) {
+                               if (key.equals(LdapAttrs.objectClass.name())) {
                                        // TODO support multiple object classes
                                        NamingEnumeration<?> en = attr.getAll();
                                        String first = null;
@@ -382,7 +384,7 @@ class LdifUser implements DirectoryUser {
                                else
                                        return null;
                        } catch (NamingException e) {
-                               throw new UserDirectoryException("Cannot get value for attribute " + key, e);
+                               throw new IllegalStateException("Cannot get value for attribute " + key, e);
                        }
                }
 
@@ -404,7 +406,7 @@ class LdifUser implements DirectoryUser {
                                else
                                        return null;
                        } catch (NamingException e) {
-                               throw new UserDirectoryException("Cannot remove attribute " + key, e);
+                               throw new IllegalStateException("Cannot remove attribute " + key, e);
                        }
                }
        }
@@ -426,4 +428,11 @@ class LdifUser implements DirectoryUser {
                return ch >= 32 && ch < 127;
        }
 
+       static class LdifPerson extends LdifUser implements Person {
+
+               public LdifPerson(AbstractUserDirectory userAdmin, LdapName dn, Attributes attributes) {
+                       super(userAdmin, dn, attributes);
+               }
+
+       }
 }