ds: paged results with jndi ldap (java)
I see this often enough that I thought I'd give myself a reference for when I see a lead on it.
first example is on the forums.sun.com site. http://forums.sun.com/thread.jspa?threadID=578347&tstart=0
second example on the java2s.com site. http://www.java2s.com/Code/Java/JNDI-LDAP/howapagedsearchcanbeperformedusingthePagedResultsControlAPI.htm
since I know nothing about java, I can't validate that this works... but it's good reference.
1: /** 2: * paged.java 3: * 5 July 2001 4: * Sample JNDI application that performs a paged search. 5: * 6: */ 7: 8: import java.util.Hashtable; 9: import java.util.Enumeration; 10: 11: import javax.naming.*; 12: import javax.naming.directory.*; 13: import javax.naming.ldap.*; 14: import com.sun.jndi.ldap.ctl.*; 15: 16: class paged { 17: 18: public static void main(String[] args) { 19: 20: 21: Hashtable env = new Hashtable();22: String adminName = "CN=Administrator,CN=Users,DC=antipodes,DC=com";
23: String adminPassword = "XXXXXXXX";
24: String searchBase = "DC=antipodes,DC=com";
25: String searchFilter = "(&(objectClass=user)(mail=*))";
26: 27: env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
28: 29: //set security credentials, note using simple cleartext authentication30: env.put(Context.SECURITY_AUTHENTICATION,"simple");
31: env.put(Context.SECURITY_PRINCIPAL,adminName); 32: env.put(Context.SECURITY_CREDENTIALS,adminPassword); 33: 34: //connect to my domain controller35: env.put(Context.PROVIDER_URL, "ldap://mydc.antipodes.com:389");
36: try { 37: 38: // Create the initial directory context 39: LdapContext ctx = new InitialLdapContext(env,null); 40: 41: // Create the search controls 42: SearchControls searchCtls = new SearchControls(); 43: 44: //Specify the attributes to return
45: String returnedAtts[]={"sn","givenName","mail"};
46: searchCtls.setReturningAttributes(returnedAtts); 47: 48: //Specify the search scope 49: searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); 50: 51: //Set the page size and initialize the cookie that we pass back in subsequent pages
52: int pageSize = 10; 53: byte[] cookie = null; 54: 55: //Request the paged results control 56: Control[] ctls = new Control[]{new PagedResultsControl(pageSize)}; 57: ctx.setRequestControls(ctls); 58: 59: //initialize counter to total the results 60: int totalResults = 0; 61: 62: // Search for objects using the filter
63: 64: do { 65: NamingEnumeration results = ctx.search(searchBase, searchFilter, searchCtls); 66: 67: // loop through the results in each page
68: 69: while (results != null && results.hasMoreElements()) {
70: SearchResult sr = (SearchResult)results.next(); 71: 72: //print out the name 73: System.out.println("name: " + sr.getName());
74: 75: //increment the counter 76: totalResults++; 77: 78: } 79: 80: 81: // examine the response controls 82: cookie = parseControls(ctx.getResponseControls()); 83: 84: // pass the cookie back to the server for the next page
85: ctx.setRequestControls(new Control[]{new PagedResultsControl(pageSize, cookie, Control.CRITICAL) }); 86: 87: } while ((cookie != null) && (cookie.length != 0));
88: 89: 90: ctx.close(); 91: 92: System.out.println("Total entries: " + totalResults);
93: 94: 95: } 96: catch (NamingException e) {97: System.err.println("Paged Search failed." + e);
98: } 99: catch (java.io.IOException e) {100: System.err.println("Paged Search failed." + e);
101: } 102: } 103: 104: static byte[] parseControls(Control[] controls) throws NamingException { 105: 106: byte[] cookie = null; 107: 108: if (controls != null) {
109: 110: for (int i = 0; i < controls.length; i++) {
111: if (controls[i] instanceof PagedResultsResponseControl) {
112: PagedResultsResponseControl prrc = (PagedResultsResponseControl)controls[i]; 113: cookie = prrc.getCookie();114: System.out.println(">>Next Page \n");
115: } 116: } 117: } 118: 119: return (cookie == null) ? new byte[0] : cookie;
120: } 121: }
1: /* 2: * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. 3: *4: * Redistribution and use in source and binary forms, with or without
5: * modification, are permitted provided that the following conditions 6: * are met: 7: * 8: * - Redistributions of source code must retain the above copyright 9: * notice, this list of conditions and the following disclaimer. 10: *11: * - Redistributions in binary form must reproduce the above copyright
12: * notice, this list of conditions and the following disclaimer in the
13: * documentation and/or other materials provided with the distribution. 14: * 15: * - Neither the name of Sun Microsystems nor the names of its 16: * contributors may be used to endorse or promote products derived 17: * from this software without specific prior written permission. 18: *19: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
20: * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 21: * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 23: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 26: * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 27: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 28: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 29: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30: */ 31: 32: import java.io.IOException; 33: import java.util.Hashtable; 34: 35: import javax.naming.Context; 36: import javax.naming.NamingEnumeration; 37: import javax.naming.NamingException; 38: import javax.naming.directory.SearchControls; 39: import javax.naming.directory.SearchResult; 40: import javax.naming.ldap.Control; 41: import javax.naming.ldap.InitialLdapContext; 42: import javax.naming.ldap.LdapContext; 43: import javax.naming.ldap.PagedResultsControl; 44: import javax.naming.ldap.PagedResultsResponseControl; 45: 46: /** 47: * Shows how a paged search can be performed using the PagedResultsControl API 48: */ 49: 50: class PagedSearch { 51: 52: public static void main(String[] args) { 53: 54: Hashtable<String, Object> env = new Hashtable<String, Object>(11); 55: env 56: .put(Context.INITIAL_CONTEXT_FACTORY,57: "com.sun.jndi.ldap.LdapCtxFactory");
58: 59: /* Specify host and port to use for directory service */
60: env.put(Context.PROVIDER_URL,61: "ldap://localhost:389/ou=People,o=JNDITutorial");
62: 63: try { 64: LdapContext ctx = new InitialLdapContext(env, null); 65: 66: // Activate paged results 67: int pageSize = 5; 68: byte[] cookie = null; 69: ctx.setRequestControls(new Control[] { new PagedResultsControl(pageSize, 70: Control.NONCRITICAL) }); 71: int total; 72: 73: do { 74: /* perform the search */75: NamingEnumeration results = ctx.search("", "(objectclass=*)",
76: new SearchControls()); 77: 78: /* for each entry print out name + all attrs and values */
79: while (results != null && results.hasMore()) {
80: SearchResult entry = (SearchResult) results.next(); 81: System.out.println(entry.getName()); 82: } 83: 84: // Examine the paged results control response 85: Control[] controls = ctx.getResponseControls();86: if (controls != null) {
87: for (int i = 0; i < controls.length; i++) {
88: if (controls[i] instanceof PagedResultsResponseControl) {
89: PagedResultsResponseControl prrc = (PagedResultsResponseControl) controls[i]; 90: total = prrc.getResultSize();91: if (total != 0) {
92: System.out.println("***************** END-OF-PAGE "
93: + "(total : " + total + ") *****************\n");
94: } else {
95: System.out.println("***************** END-OF-PAGE "
96: + "(total: unknown) ***************\n");
97: } 98: cookie = prrc.getCookie(); 99: } 100: }101: } else {
102: System.out.println("No controls were sent from the server");
103: } 104: // Re-activate paged results 105: ctx.setRequestControls(new Control[] { new PagedResultsControl( 106: pageSize, cookie, Control.CRITICAL) }); 107: 108: } while (cookie != null);
109: 110: ctx.close(); 111: 112: } catch (NamingException e) {113: System.err.println("PagedSearch failed.");
114: e.printStackTrace(); 115: } catch (IOException ie) {116: System.err.println("PagedSearch failed.");
117: ie.printStackTrace(); 118: } 119: } 120: }
Comments
Post a Comment