Author: bdaw
Date: 2007-03-12 10:48:11 -0400 (Mon, 12 Mar 2007)
New Revision: 6638
Modified:
trunk/identity/src/main/org/jboss/portal/identity/ldap/LDAPExtUserModuleImpl.java
trunk/identity/src/main/org/jboss/portal/identity/ldap/LDAPUserModuleImpl.java
Log:
- update offset/limit LDAP search implementation to little more effecient (probably still
sux)
Modified:
trunk/identity/src/main/org/jboss/portal/identity/ldap/LDAPExtUserModuleImpl.java
===================================================================
---
trunk/identity/src/main/org/jboss/portal/identity/ldap/LDAPExtUserModuleImpl.java 2007-03-12
14:46:40 UTC (rev 6637)
+++
trunk/identity/src/main/org/jboss/portal/identity/ldap/LDAPExtUserModuleImpl.java 2007-03-12
14:48:11 UTC (rev 6638)
@@ -137,55 +137,47 @@
filter = "*" + filter + "*";
}
+ NamingEnumeration results = null;
+
String ldap_filter = getUserSearchFilter();
//* chars are escaped in filterArgs so we must replace it manually
ldap_filter = ldap_filter.replaceAll("\\{0\\}", filter);
log.debug("Search filter: " + ldap_filter);
- //Object[] filterArgs = {filter};
- NamingEnumeration results = searchUsers(ldap_filter, null);
- while (results.hasMoreElements())
+ results = searchUsers(ldap_filter, null);
+ uf = Tools.toList(results);
+
+ int size = uf.size();
+ if (offset == 0 && size <= limit)
{
- SearchResult res = (SearchResult)results.nextElement();
- Context ctx = (Context)res.getObject();
- String dn = ctx.getNameInNamespace();
- uf.add(createUserInstance(res.getAttributes(), dn));
+ return processUsers(uf);
}
+ Collections.sort(uf, new UserEntryComparator());
+
+ if (offset + limit <= size)
+ {
+ return processUsers(uf.subList(offset, offset + limit));
+ }
+ else if (offset >= size)
+ {
+ return new HashSet();
+ }
+
+ return Tools.toSet(uf.subList(offset, size).iterator());
}
catch (NoSuchElementException e)
{
- log.debug("No user found using filter: " + filter, e);
-
+ log.debug("No users found", e);
}
- catch (NamingException e)
+ catch (Throwable e)
{
throw new IdentityException("User search failed.", e);
}
- //this is not very cool. No easy way to do this using JNDI so we apply offset/limit
on all returned results
- //TODO: make it more efficient and apply sort before createUserInstance
invocation;
- int size = uf.size();
-
- if (offset == 0 && size <= limit)
- {
- return Tools.toSet(uf.iterator());
- }
-
- Collections.sort(uf, new LDAPUserImpl.LDAPUserComparator());
-
- if (offset + limit <= size)
- {
- return Tools.toSet(uf.subList(offset, offset + limit).iterator());
- }
- else if (offset >= size)
- {
- return new HashSet();
- }
-
-
- return Tools.toSet(uf.subList(offset, size).iterator());
+ //won't happen
+ return null;
}
public int getUserCount() throws IdentityException, IllegalArgumentException
Modified: trunk/identity/src/main/org/jboss/portal/identity/ldap/LDAPUserModuleImpl.java
===================================================================
---
trunk/identity/src/main/org/jboss/portal/identity/ldap/LDAPUserModuleImpl.java 2007-03-12
14:46:40 UTC (rev 6637)
+++
trunk/identity/src/main/org/jboss/portal/identity/ldap/LDAPUserModuleImpl.java 2007-03-12
14:48:11 UTC (rev 6638)
@@ -45,6 +45,8 @@
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Collections;
+import java.util.Collection;
+import java.util.Comparator;
import java.security.NoSuchAlgorithmException;
/**
@@ -248,9 +250,9 @@
}
List uf = new LinkedList();
+ NamingEnumeration results = null;
-
if (filter.length() == 0)
{
filter = "*";
@@ -267,51 +269,40 @@
log.debug("Search filter: " + filter);
- NamingEnumeration results = searchUsers(ldap_filter, null);
- while (results.hasMoreElements())
+ results = searchUsers(ldap_filter, null);
+ uf = Tools.toList(results);
+
+ int size = uf.size();
+ if (offset == 0 && size <= limit)
{
- SearchResult res = (SearchResult)results.nextElement();
- Context ctx = (Context)res.getObject();
- String dn = ctx.getNameInNamespace();
- uf.add(createUserInstance(res.getAttributes(), dn));
+ return processUsers(uf);
}
+ Collections.sort(uf, new UserEntryComparator());
+ if (offset + limit <= size)
+ {
+ return processUsers(uf.subList(offset, offset + limit));
+ }
+ else if (offset >= size)
+ {
+ return new HashSet();
+ }
+ return Tools.toSet(uf.subList(offset, size).iterator());
}
catch (NoSuchElementException e)
{
log.debug("No users found", e);
}
- catch (Exception e)
+ catch (Throwable e)
{
throw new IdentityException("User search failed.", e);
}
- //this is not very cool. No easy way to do this using JNDI so we apply offset/limit
on all returned results
- //TODO: make it more efficient and apply sort before createUserInstance
invocation;
+ //won't happen
+ return null;
- int size = uf.size();
-
- if (offset == 0 && size <= limit)
- {
- return Tools.toSet(uf.iterator());
- }
-
- Collections.sort(uf, new LDAPUserImpl.LDAPUserComparator());
-
- if (offset + limit <= size)
- {
- return Tools.toSet(uf.subList(offset, offset + limit).iterator());
- }
- else if (offset >= size)
- {
- return new HashSet();
- }
-
-
- return Tools.toSet(uf.subList(offset, size).iterator());
-
}
public int getUserCount() throws IdentityException, IllegalArgumentException
@@ -366,6 +357,52 @@
return getConnectionContext().createInitialContext().search(getContainerDN(),
filter, filterArgs, controls);
}
}
+
+
+ protected Set processUsers(Collection users) throws Exception
+ {
+ Set ui = new HashSet();
+ for (Iterator iterator = users.iterator(); iterator.hasNext();)
+ {
+ SearchResult res = (SearchResult)iterator.next();
+ Context ctx = (Context)res.getObject();
+ String dn = ctx.getNameInNamespace();
+ ui.add(createUserInstance(res.getAttributes(), dn));
+ }
+ return ui;
+ }
+
+ /**
+ * Comparator for users entries
+ */
+ protected class UserEntryComparator implements Comparator
+ {
+
+
+ public int compare(Object o1, Object o2)
+ {
+ try
+ {
+ SearchResult u1 = (SearchResult)o1;
+ SearchResult u2 = (SearchResult)o2;
+
+ Attribute uida1 = u1.getAttributes().get(getUidAttributeID());
+ Attribute uida2 = u2.getAttributes().get(getUidAttributeID());
+
+ String name1 = uida1.get().toString();
+ String name2 = uida2.get().toString();
+
+ return name1.compareToIgnoreCase(name2);
+ }
+ catch(Throwable e)
+ {
+ //none
+ }
+ return 0;
+ }
+ }
+
+
}