From dcebd8fa812bcbb465c5e5ef3100c012b280f69a Mon Sep 17 00:00:00 2001
From: Mark Craig <mark.craig@forgerock.com>
Date: Fri, 04 May 2012 05:28:20 +0000
Subject: [PATCH] Another control covered in the LDAP controls chapter

---
 opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/main/java/org/forgerock/opendj/examples/Controls.java |   37 ++++++++++++++++++
 opendj-sdk/opendj3/src/main/docbkx/dev-guide/chap-controls.xml                                        |   41 ++++++++++++++++++++
 2 files changed, 76 insertions(+), 2 deletions(-)

diff --git a/opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/main/java/org/forgerock/opendj/examples/Controls.java b/opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/main/java/org/forgerock/opendj/examples/Controls.java
index fea1ee6..5a84fc8 100644
--- a/opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/main/java/org/forgerock/opendj/examples/Controls.java
+++ b/opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/main/java/org/forgerock/opendj/examples/Controls.java
@@ -46,6 +46,7 @@
 import org.forgerock.opendj.ldap.controls.EntryChangeNotificationResponseControl;
 import org.forgerock.opendj.ldap.controls.GetEffectiveRightsRequestControl;
 import org.forgerock.opendj.ldap.controls.ManageDsaITRequestControl;
+import org.forgerock.opendj.ldap.controls.MatchedValuesRequestControl;
 import org.forgerock.opendj.ldap.controls.PersistentSearchChangeType;
 import org.forgerock.opendj.ldap.controls.PersistentSearchRequestControl;
 import org.forgerock.opendj.ldap.requests.BindRequest;
@@ -104,7 +105,8 @@
             // usePersistentSearchRequestControl()
             //useGetEffectiveRightsRequestControl(connection);
             //usePersistentSearchRequestControl(connection);
-            useManageDsaITRequestControl(connection);
+            //useManageDsaITRequestControl(connection);
+            useMatchedValuesRequestControl(connection);
             // TODO: The rest of the supported controls
 
         } catch (final ErrorResultException e) {
@@ -270,6 +272,39 @@
             }
         }
     }
+
+    /**
+     * Use the Matched Values Request Control to show read only one attribute
+     * value.
+     *
+     * @param connection
+     *            Active connection to LDAP server containing <a
+     *            href="http://opendj.forgerock.org/Example.ldif"
+     *            >Example.ldif</a> content.
+     * @throws ErrorResultException
+     *             Operation failed.
+     */
+    static void useMatchedValuesRequestControl(Connection connection) throws ErrorResultException {
+        if (isSupported(MatchedValuesRequestControl.OID)) {
+            final String dn = "uid=bjensen,ou=People,dc=example,dc=com";
+            SearchRequest request =
+                    Requests.newSearchRequest(dn, SearchScope.BASE_OBJECT,
+                            "(objectclass=*)", "cn");
+            final String filter = "cn=Babs Jensen";
+            request.addControl(MatchedValuesRequestControl.newControl(true, filter));
+
+            final SearchResultEntry entry = connection.searchSingleEntry(request);
+            System.out.println("Reading entry with matched values request.");
+            final LDIFEntryWriter writer = new LDIFEntryWriter(System.out);
+            try {
+                writer.writeEntry(entry);
+                writer.close();
+            } catch (final IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
     /**
      * Use the LDAP PersistentSearchRequestControl to set up a persistent
      * search. Also use the Entry Change Notification Response Control to get
diff --git a/opendj-sdk/opendj3/src/main/docbkx/dev-guide/chap-controls.xml b/opendj-sdk/opendj3/src/main/docbkx/dev-guide/chap-controls.xml
index 1686318..962cb2e 100644
--- a/opendj-sdk/opendj3/src/main/docbkx/dev-guide/chap-controls.xml
+++ b/opendj-sdk/opendj3/src/main/docbkx/dev-guide/chap-controls.xml
@@ -420,7 +420,46 @@
  
  <section xml:id="use-matched-values-request-control">
   <title>Matched Values Request Control</title>
-  <para>TODO</para>
+
+  <para>RFC 3876, <link xlink:href="http://tools.ietf.org/html/rfc3876"
+  xlink:show="new"><citetitle>Returning Matched Values with the
+  LDAPv3</citetitle></link>, describes a control that lets your application
+  pass a filter in a search request getting a multivalued attribute such that
+  the directory server only returns attribute values that match the
+  filter.</para>
+
+  <para>Barbara Jensen's entry contains two common name values,
+  <literal>Barbara Jensen</literal> and <literal>Babs Jensen</literal>. The
+  following excerpt retrieves only the latter.</para>
+
+  <programlisting language="java">
+if (isSupported(MatchedValuesRequestControl.OID)) {
+    final String dn = "uid=bjensen,ou=People,dc=example,dc=com";
+    SearchRequest request =
+            Requests.newSearchRequest(dn, SearchScope.BASE_OBJECT,
+                    "(objectclass=*)", "cn");
+    final String filter = "cn=Babs Jensen";
+    request.addControl(MatchedValuesRequestControl.newControl(true, filter));
+
+    final SearchResultEntry entry = connection.searchSingleEntry(request);
+    System.out.println("Reading entry with matched values request.");
+    final LDIFEntryWriter writer = new LDIFEntryWriter(System.out);
+    try {
+        writer.writeEntry(entry);
+        writer.close();
+    } catch (final IOException e) {
+        e.printStackTrace();
+    }
+}
+</programlisting>
+
+  <para>OpenDJ directory server supports the matched values request
+  control.</para>
+
+  <programlisting language="ldif">Reading entry with matched values request.
+dn: uid=bjensen,ou=People,dc=example,dc=com
+cn: Babs Jensen
+</programlisting>
  </section>
  
  <section xml:id="use-password-expired-control">

--
Gitblit v1.10.0