From 5f88258aa3fce7ab3f874b012bc64d9bf5831e90 Mon Sep 17 00:00:00 2001
From: Mark Craig <mark.craig@forgerock.com>
Date: Fri, 27 Apr 2012 09:25:33 +0000
Subject: [PATCH] Examples for a dev guide chapter on writing to the directory

---
 opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/site/xdoc/index.xml.vm                                 |    4 +
 opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/main/java/org/forgerock/opendj/examples/ShortLife.java |  189 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 193 insertions(+), 0 deletions(-)

diff --git a/opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/main/java/org/forgerock/opendj/examples/ShortLife.java b/opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/main/java/org/forgerock/opendj/examples/ShortLife.java
new file mode 100644
index 0000000..0e4f535
--- /dev/null
+++ b/opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/main/java/org/forgerock/opendj/examples/ShortLife.java
@@ -0,0 +1,189 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *      Copyright 2012 ForgeRock AS
+ *
+ */
+
+package org.forgerock.opendj.examples;
+
+import java.io.IOException;
+
+import org.forgerock.opendj.ldap.Connection;
+import org.forgerock.opendj.ldap.DN;
+import org.forgerock.opendj.ldap.Entries;
+import org.forgerock.opendj.ldap.Entry;
+import org.forgerock.opendj.ldap.ErrorResultException;
+import org.forgerock.opendj.ldap.LDAPConnectionFactory;
+import org.forgerock.opendj.ldap.ResultCode;
+import org.forgerock.opendj.ldap.TreeMapEntry;
+import org.forgerock.opendj.ldap.requests.ModifyRequest;
+import org.forgerock.opendj.ldap.responses.Result;
+import org.forgerock.opendj.ldif.LDIFEntryWriter;
+
+/**
+ * A command-line client that creates, updates, renames, and deletes a
+ * short-lived entry in order to demonstrate LDAP write operations using the
+ * synchronous API. The client takes as arguments the host and port for the
+ * directory server, and expects to find the entries and access control
+ * instructions as defined in <a
+ * href="http://opendj.forgerock.org/Example.ldif">Example.ldif</a>.
+ *
+ * <ul>
+ * <li>host - host name of the directory server</li>
+ * <li>port - port number of the directory server, e.g. 1389, 1636</li>
+ * </ul>
+ * All arguments are required.
+ */
+public final class ShortLife {
+
+    /**
+     * Connect to directory server as a user with rights to add, modify, and
+     * delete entries, and the proceed to carry out the operations.
+     *
+     * @param args
+     *            The command line arguments: host, port
+     */
+    public static void main(final String[] args) {
+        if (args.length != 2) {
+            System.err.println("Usage: host port");
+            System.err.println("For example: localhost 1389");
+            System.exit(1);
+        }
+        String host = args[0];
+        int port = Integer.parseInt(args[1]);
+
+        // User credentials of a "Directory Administrators" group member.
+        // Kirsten Vaughan is authorized to create, update, and delete
+        // entries.
+        //
+        // You might prompt an administrator user for information needed to
+        // authenticate, or your application might have its own account with
+        // rights to perform all necessary operations.
+        String adminDN = "uid=kvaughan,ou=people,dc=example,dc=com";
+        char[] adminPwd = "bribery".toCharArray();
+
+        // An entry to add to the directory
+        DN entryDN = DN.valueOf("cn=User,ou=People,dc=example,dc=com");
+        Entry entry = new TreeMapEntry(entryDN);
+        entry.addAttribute("cn", "User");
+        entry.addAttribute("objectclass", "top");
+        entry.addAttribute("objectclass", "person");
+        entry.addAttribute("objectclass", "organizationalPerson");
+        entry.addAttribute("objectclass", "inetOrgPerson");
+        entry.addAttribute("mail", "user@example.com");
+        entry.addAttribute("sn", "Surname");
+
+        LDIFEntryWriter writer = new LDIFEntryWriter(System.out);
+
+        final LDAPConnectionFactory factory = new LDAPConnectionFactory(host, port);
+        Connection connection = null;
+        try {
+            connection = factory.getConnection();
+            Result result = connection.bind(adminDN, adminPwd);
+            if (!result.isSuccess()) {
+                System.out.println("Bind result: "
+                        + result.getResultCode().toString() + " "
+                        + result.getDiagnosticMessage());
+                System.exit(result.getResultCode().intValue());
+            }
+
+            System.out.println("Creating an entry...");
+            writer.writeEntry(entry);
+            writer.flush();
+            result = connection.add(entry);
+            if (!result.isSuccess()) {
+                System.out.println("Add result: "
+                        + result.getResultCode().toString() + " "
+                        + result.getDiagnosticMessage());
+                System.exit(result.getResultCode().intValue());
+            }
+            System.out.println("...done.");
+
+            System.out.println("Updating mail address, adding description...");
+            Entry old = TreeMapEntry.deepCopyOfEntry(entry);
+            entry = entry.replaceAttribute("mail", "spammer@example.com");
+            entry = entry.addAttribute("description", "Good user gone bad");
+            writer.writeEntry(entry);
+            writer.flush();
+            ModifyRequest request = Entries.diffEntries(old, entry);
+            result = connection.modify(request);
+            if (!result.isSuccess()) {
+                System.out.println("Modify result: "
+                        + result.getResultCode().toString() + " "
+                        + result.getDiagnosticMessage());
+                System.exit(result.getResultCode().intValue());
+            }
+            System.out.println("...done.");
+
+            System.out.println("Renaming the entry...");
+            DN newDN = DN.valueOf("cn=Abuser,ou=People,dc=example,dc=com");
+            entry = entry.setName(newDN);
+            writer.writeEntry(entry);
+            writer.flush();
+            result = connection.modifyDN(entryDN.toString(), "cn=Abuser");
+            if (!result.isSuccess()) {
+                System.out.println("Rename result: "
+                        + result.getResultCode().toString() + " "
+                        + result.getDiagnosticMessage());
+                System.exit(result.getResultCode().intValue());
+            }
+            System.out.println("...done.");
+
+            System.out.println("Deleting the entry...");
+            writer.writeEntry(entry);
+            writer.flush();
+            result = connection.delete(newDN.toString());
+            if (!result.isSuccess()) {
+                System.out.println("Delete result: "
+                        + result.getResultCode().toString() + " "
+                        + result.getDiagnosticMessage());
+                System.exit(result.getResultCode().intValue());
+            }
+            System.out.println("...done.");
+        } catch (final ErrorResultException e) {
+            System.err.println(e.getMessage());
+            System.exit(e.getResult().getResultCode().intValue());
+            return;
+        } catch (final IOException e) {
+            System.err.println(e.getMessage());
+            System.exit(ResultCode.CLIENT_SIDE_LOCAL_ERROR.intValue());
+            return;
+        } finally {
+            if (connection != null) {
+                connection.close();
+            }
+            try {
+                writer.close();
+            } catch (final IOException ignored) {
+                // Ignore.
+            }
+        }
+    }
+
+    /**
+     * Constructor not used.
+     */
+    private ShortLife() {
+        // Not used
+    }
+}
diff --git a/opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/site/xdoc/index.xml.vm b/opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/site/xdoc/index.xml.vm
index 412ee74..f752313 100644
--- a/opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/site/xdoc/index.xml.vm
+++ b/opendj-sdk/opendj3/opendj-ldap-sdk-examples/src/site/xdoc/index.xml.vm
@@ -77,6 +77,10 @@
           <a href="xref/org/forgerock/opendj/examples/SearchBind.html">Search &amp; bind</a>
           - illustrates how to authenticate given a mail address and a password
         </li>
+        <li>
+          <a href="xref/org/forgerock/opendj/examples/ShortLife.html">Short life</a>
+          - illustrates how to create, update, rename, and delete an entry
+        </li>
       </ul>
     </section>
     <section name="Get the OpenDJ LDAP SDK Examples">

--
Gitblit v1.10.0