Package javax.naming.ldap

Source Code of javax.naming.ldap.PagedResultsControl

/*
* @(#)PagedResultsControl.java  1.5 05/11/17
*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/

package javax.naming.ldap;

import java.io.IOException;
import com.sun.jndi.ldap.Ber;
import com.sun.jndi.ldap.BerEncoder;

/**
* Requests that the results of a search operation be returned by the LDAP
* server in batches of a specified size.
* The requestor controls the rate at which batches are returned by the rate
* at which it invokes search operations.
* <p>
* The following code sample shows how the class may be used:
* <pre>
*
*     // Open an LDAP association
*     LdapContext ctx = new InitialLdapContext();
*
*     // Activate paged results
*     int pageSize = 20; // 20 entries per page
*     byte[] cookie = null;
*     int total;
*     ctx.setRequestControls(new Control[]{
*         new PagedResultsControl(pageSize, Control.CRITICAL) });
*
*     do {
*         // Perform the search
*         NamingEnumeration results =
*             ctx.search("", "(objectclass=*)", new SearchControls());
*
*         // Iterate over a batch of search results
*         while (results != null && results.hasMore()) {
*             // Display an entry
*             SearchResult entry = (SearchResult)results.next();
*             System.out.println(entry.getName());
*             System.out.println(entry.getAttributes());
*
*             // Handle the entry's response controls (if any)
*             if (entry instanceof HasControls) {
*                 // ((HasControls)entry).getControls();
*             }
*         }
*         // Examine the paged results control response
*         Control[] controls = ctx.getResponseControls();
*         if (controls != null) {
*             for (int i = 0; i < controls.length; i++) {
*                 if (controls[i] instanceof PagedResultsResponseControl) {
*                     PagedResultsResponseControl prrc =
*                         (PagedResultsResponseControl)controls[i];
*                     total = prrc.getResultSize();
*                     cookie = prrc.getCookie();
*                 } else {
*                     // Handle other response controls (if any)
*                 }
*             }
*         }
*
*         // Re-activate paged results
*         ctx.setRequestControls(new Control[]{
*             new PagedResultsControl(pageSize, cookie, Control.CRITICAL) });
*     } while (cookie != null);
*
*     // Close the LDAP association
*     ctx.close();
*     ...
*
* </pre>
* <p>
* This class implements the LDAPv3 Control for paged-results as defined in
* <a href="http://www.ietf.org/rfc/rfc2696.txt">RFC 2696</a>.
*
* The control's value has the following ASN.1 definition:
* <pre>
*
*     realSearchControlValue ::= SEQUENCE {
*         size      INTEGER (0..maxInt),
*                           -- requested page size from client
*                           -- result set size estimate from server
*         cookie    OCTET STRING
*     }
*
* </pre>
*
* @since 1.5
* @see PagedResultsResponseControl
* @author Vincent Ryan
*/
final public class PagedResultsControl extends BasicControl {

    /**
     * The paged-results control's assigned object identifier
     * is 1.2.840.113556.1.4.319.
     */
    public static final String OID = "1.2.840.113556.1.4.319";

    private static final byte[] EMPTY_COOKIE = new byte[0];

    private static final long serialVersionUID = 6684806685736844298L;

    /**
     * Constructs a control to set the number of entries to be returned per
     * page of results.
     *
     * @param  pageSize  The number of entries to return in a page.
     * @param  criticality  If true then the server must honor the control
     *                          and return search results as indicated by
     *                          pageSize or refuse to perform the search.
     *                          If false, then the server need not honor the
     *                          control.
     * @exception IOException  If an error was encountered while encoding the
     *                          supplied arguments into a control.
     */
    public PagedResultsControl(int pageSize, boolean criticality)
      throws IOException {

  super(OID, criticality, null);
  value = setEncodedValue(pageSize, EMPTY_COOKIE);
    }

    /**
     * Constructs a control to set the number of entries to be returned per
     * page of results. The cookie is provided by the server and may be
     * obtained from the paged-results response control.
     * <p>
     * A sequence of paged-results can be abandoned by setting the pageSize
     * to zero and setting the cookie to the last cookie received from the
     * server.
     *
     * @param  pageSize  The number of entries to return in a page.
     * @param  cookie    A possibly null server-generated cookie.
     * @param  criticality  If true then the server must honor the control
     *                          and return search results as indicated by
     *                          pageSize or refuse to perform the search.
     *                          If false, then the server need not honor the
     *                          control.
     * @exception IOException  If an error was encountered while encoding the
     *                          supplied arguments into a control.
     */
    public PagedResultsControl(int pageSize, byte[] cookie,
  boolean criticality) throws IOException {

  super(OID, criticality, null);
  if (cookie == null) {
      cookie = EMPTY_COOKIE;
  }
  value = setEncodedValue(pageSize, cookie);
    }

    /*
     * Encodes the paged-results control's value using ASN.1 BER.
     * The result includes the BER tag and length for the control's value but
     * does not include the control's object identifier and criticality setting.
     *
     * @param  pageSize  The number of entries to return in a page.
     * @param  cookie    A non-null server-generated cookie.
     * @return A possibly null byte array representing the ASN.1 BER encoded
     *         value of the LDAP paged-results control.
     * @exception IOException If a BER encoding error occurs.
     */
    private byte[] setEncodedValue(int pageSize, byte[] cookie)
  throws IOException {

  // build the ASN.1 encoding
  BerEncoder ber = new BerEncoder(10 + cookie.length);

  ber.beginSeq(Ber.ASN_SEQUENCE | Ber.ASN_CONSTRUCTOR);
      ber.encodeInt(pageSize);
            ber.encodeOctetString(cookie, Ber.ASN_OCTET_STR);
  ber.endSeq();

  return ber.getTrimmedBuf();
    }
}
TOP

Related Classes of javax.naming.ldap.PagedResultsControl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.