From 43f11eee07cca55cfe7c38362431371fb265a6e0 Mon Sep 17 00:00:00 2001
From: dugan <dugan@localhost>
Date: Fri, 06 Jul 2007 12:38:14 +0000
Subject: [PATCH] Issue 874 ldifsearch always returns objectclass attribute.

---
 opends/tests/unit-tests-testng/src/server/org/opends/server/tools/LDIFSearchTestCase.java |  216 +++++++++++++++++++++++++++++++++++++++++++
 opends/src/server/org/opends/server/tools/LDIFSearch.java                                 |   41 ++++++--
 opends/src/server/org/opends/server/types/LDIFExportConfig.java                           |   16 +++
 3 files changed, 263 insertions(+), 10 deletions(-)

diff --git a/opends/src/server/org/opends/server/tools/LDIFSearch.java b/opends/src/server/org/opends/server/tools/LDIFSearch.java
index 1d9130d..5d5aa0a 100644
--- a/opends/src/server/org/opends/server/tools/LDIFSearch.java
+++ b/opends/src/server/org/opends/server/tools/LDIFSearch.java
@@ -116,7 +116,7 @@
    */
   public static void main(String[] args)
   {
-    int exitCode = mainSearch(args);
+    int exitCode = mainSearch(args, true);
     if (exitCode != 0)
     {
       System.exit(filterExitCode(exitCode));
@@ -131,11 +131,13 @@
    *
    * @param  args  The command line arguments provided to this program.
    *
+   * @param initializeServer True if server initialization should be done.
+   * 
    * @return  The return code for this operation.  A value of zero indicates
    *          that all processing completed successfully.  A nonzero value
    *          indicates that some problem occurred during processing.
    */
-  public static int mainSearch(String[] args)
+  public static int mainSearch(String[] args, boolean initializeServer)
   {
     LinkedHashSet<String> scopeStrings = new LinkedHashSet<String>(4);
     scopeStrings.add(SCOPE_STRING_BASE);
@@ -272,7 +274,10 @@
     // way.
     boolean            allUserAttrs        = false;
     boolean            allOperationalAttrs = false;
-    LinkedList<String> attributeNames      = new LinkedList<String>();
+    //Return objectclass attribute unless analysis of the arguments determines
+    //otherwise.
+    boolean            includeObjectclassAttrs = true;
+    LinkedList<String> attributeNames;
     LinkedList<String> objectClassNames    = new LinkedList<String>();
     LinkedList<String> filterStrings;
     if (filterFile.isPresent())
@@ -359,20 +364,35 @@
       allUserAttrs = true;
     }
 
+    //Determine if objectclass attribute should be returned.
+    if(!allUserAttrs) {
+      //Single '+', never return objectclass.
+      if(allOperationalAttrs && objectClassNames.isEmpty() &&
+         attributeNames.isEmpty())
+        includeObjectclassAttrs=false;
+      //If "objectclass" isn't specified in the attributes to return, then
+      //don't include objectclass attribiute.
+      if(!attributeNames.isEmpty() && objectClassNames.isEmpty() &&
+         !attributeNames.contains("objectclass"))
+         includeObjectclassAttrs=false;
+    }
+
 
     // Bootstrap the Directory Server configuration for use as a client.
     DirectoryServer directoryServer = DirectoryServer.getInstance();
-    directoryServer.bootstrapClient();
-
 
     // If we're to use the configuration then initialize it, along with the
     // schema.
     boolean checkSchema = configFile.isPresent();
+
+    if(initializeServer) {
+     DirectoryServer.bootstrapClient();
+
     if (checkSchema)
     {
       try
       {
-        directoryServer.initializeJMX();
+        DirectoryServer.initializeJMX();
       }
       catch (Exception e)
       {
@@ -413,7 +433,7 @@
         return 1;
       }
     }
-
+    }
 
     // Choose the desired search scope.
     SearchScope searchScope;
@@ -466,7 +486,6 @@
          new LinkedHashSet<AttributeType>();
     LinkedHashSet<AttributeType> operationalAttributeTypes =
          new LinkedHashSet<AttributeType>();
-
     for (String attributeName : attributeNames)
     {
       AttributeType t = DirectoryServer.getAttributeType(attributeName, true);
@@ -598,12 +617,12 @@
     {
       if (overwriteExisting.isPresent())
       {
-        exportConfig = new LDIFExportConfig(outputFile.getName(),
+        exportConfig = new LDIFExportConfig(outputFile.getValue(),
                                             ExistingFileBehavior.OVERWRITE);
       }
       else
       {
-        exportConfig = new LDIFExportConfig(outputFile.getName(),
+        exportConfig = new LDIFExportConfig(outputFile.getValue(),
                                             ExistingFileBehavior.APPEND);
       }
     }
@@ -612,6 +631,7 @@
       exportConfig = new LDIFExportConfig(System.out);
     }
 
+    exportConfig.setIncludeObjectClasses(includeObjectclassAttrs);
     if (dontWrap.isPresent())
     {
       exportConfig.setWrapColumn(0);
@@ -805,3 +825,4 @@
   }
 }
 
+
diff --git a/opends/src/server/org/opends/server/types/LDIFExportConfig.java b/opends/src/server/org/opends/server/types/LDIFExportConfig.java
index 688f507..9c4a548 100644
--- a/opends/src/server/org/opends/server/types/LDIFExportConfig.java
+++ b/opends/src/server/org/opends/server/types/LDIFExportConfig.java
@@ -582,6 +582,21 @@
 
 
   /**
+   * Specifies whether the  objectclasss attribute should be
+   * included in the export.
+   *
+   * @param  includeObjectClasses  Specifies whether the
+   *                                objectclass attribute
+   *                                should be included in the
+   *                                export.
+   */
+  public void setIncludeObjectClasses(
+                   boolean includeObjectClasses)
+  {
+    this.includeObjectClasses = includeObjectClasses;
+  }
+
+  /**
    * Specifies whether the set of operational attributes should be
    * included in the export.
    *
@@ -900,3 +915,4 @@
   }
 }
 
+
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/tools/LDIFSearchTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/tools/LDIFSearchTestCase.java
new file mode 100644
index 0000000..72b34b9
--- /dev/null
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/tools/LDIFSearchTestCase.java
@@ -0,0 +1,216 @@
+/*
+ * 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
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * 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
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  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
+ *
+ *
+ *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
+ */
+
+package org.opends.server.tools;
+
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import org.testng.annotations.AfterClass;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertEquals;
+import org.opends.server.TestCaseUtils;
+import org.opends.server.types.LDIFImportConfig;
+import org.opends.server.types.Entry;
+import org.opends.server.util.LDIFReader;
+import java.io.*;
+import java.util.Map;
+import java.util.HashMap;
+
+
+/**
+ * LDIFSearch test cases.
+ */
+public class LDIFSearchTestCase extends ToolsTestCase {
+
+
+  private String ldifFilePath;
+  private String outLdifFilePath;
+  private File tempDir;
+
+  @BeforeClass
+  public void setUp() throws Exception {
+    TestCaseUtils.startServer();
+    String entry =
+            "dn: dc=example,dc=com\n" +
+                    "objectclass: domain\n" +
+                    "objectclass: top\n" +
+                    "dc: example\n\n" +
+                    "dn: uid=user.0,dc=example,dc=com\n" +
+                    "objectClass: person\n" +
+                    "objectClass: inetorgperson\n" +
+                    "objectClass: organizationalPerson\n" +
+                    "objectClass: top\n" +
+                    "givenName: Aaccf\n" +
+                    "sn: Amar\n" +
+                    "cn: Aaccf Amar\n" +
+                    "employeeNumber: 0\n" +
+                    "uid: user.0\n" +
+                    "mail: user.0@example.com\n" +
+                    "userPassword: password\n" +
+                    "telephoneNumber: 380-535-2354\n" +
+                    "description: This is the description for Aaccf Amar\n" +
+                    "creatorsName: Import\n" +
+                    "modifiersName: Import\n";
+
+    tempDir = TestCaseUtils.createTemporaryDirectory("LDIFSearchtest");
+    String homeDirName = tempDir.getAbsolutePath();
+    ldifFilePath =  homeDirName + File.separator + "entries.ldif";
+    outLdifFilePath =  homeDirName + File.separator + "out.ldif";
+    FileOutputStream ldifFile = new FileOutputStream(ldifFilePath);
+    PrintStream writer = new PrintStream(ldifFile);
+    writer.println(entry);
+    writer.close();
+    ldifFile.close();
+  }
+
+
+  /**
+   * Clean up method.
+   *
+   * @throws  Exception  If an unexpected problem occurs.
+   */
+  @AfterClass
+  public void cleanUp() throws Exception
+  {
+     TestCaseUtils.deleteDirectory(tempDir);
+  }
+
+
+  /**
+   * Test that objectclass is returned when both user attributes '*' and
+   * operational attributes is specified '+'.
+   *
+   * @throws Exception The objectclass attribute is not returned.
+   */
+ @Test()
+  public void testLDIFSearchStarOps() throws Exception {
+    String[] args =
+    {
+      "-b", "uid=user.0, dc=example,dc=com",
+      "-l", ldifFilePath,
+      "-o", outLdifFilePath,
+      "-O",
+      "(objectclass=*)",
+      "*", "+"
+    };
+    assertEquals(LDIFSearch.mainSearch(args, false), 0);
+    LDIFImportConfig ldifConfig = new LDIFImportConfig(outLdifFilePath);
+    ldifConfig.setValidateSchema(false);
+    LDIFReader reader = new LDIFReader(ldifConfig);
+    Entry e=reader.readEntry();
+    reader.close();
+    assertNotNull(e.getAttribute("objectclass"));
+  }
+
+  /**
+   * Test that objectclass attribute is not returned when all operational
+   * attributes  only is specified '+'.
+   *
+   * @throws Exception  The objectclass attribute is returned.
+   */
+ @Test()
+  public void testLDIFSearchOpsOnly() throws Exception {
+    String[] args =
+    {
+      "-b", "uid=user.0, dc=example,dc=com",
+      "-l", ldifFilePath,
+      "-o", outLdifFilePath,
+      "-O",
+      "(objectclass=*)",
+      "+"
+    };
+    assertEquals(LDIFSearch.mainSearch(args, false), 0);
+    LDIFImportConfig ldifConfig = new LDIFImportConfig(outLdifFilePath);
+    ldifConfig.setValidateSchema(false);
+    LDIFReader reader = new LDIFReader(ldifConfig);
+    Entry e=reader.readEntry();
+    reader.close();
+    assertNull(e.getAttribute("objectclass"));
+  }
+
+  /**
+   * Test that objectclass attribute is not returned when attributes are
+   * requested to be returned along with all operational attributes '+'.
+   *
+   * @throws Exception  The objectclass attribute is returned or one of the
+   * specified attributes is not returned.
+   */
+ @Test()
+  public void testLDIFSearchOpsAttrs() throws Exception {
+    String[] args =
+    {
+      "-b", "uid=user.0, dc=example,dc=com",
+      "-l", ldifFilePath,
+      "-o", outLdifFilePath,
+      "-O",
+      "(objectclass=*)",
+      "+", "mail", "uid"
+    };
+    assertEquals(LDIFSearch.mainSearch(args, false), 0);
+    LDIFImportConfig ldifConfig = new LDIFImportConfig(outLdifFilePath);
+    ldifConfig.setValidateSchema(false);
+    LDIFReader reader = new LDIFReader(ldifConfig);
+    Entry e=reader.readEntry();
+    reader.close();
+    assertNull(e.getAttribute("objectclass"));
+    assertNotNull(e.getAttribute("mail"));
+    assertNotNull(e.getAttribute("uid"));
+  }
+
+  /**
+   * Test that objectclass attribute is not returned when specific attributes
+   * are requested to be returned.
+   *
+   * @throws Exception  The objectclass attribute is returned or one of the
+   * specified attributes is not returned.
+   */
+
+ @Test()
+  public void testLDIFSearchAttrsOnly() throws Exception {
+
+    String[] args =
+    {
+      "-b", "uid=user.0, dc=example,dc=com",
+      "-l", ldifFilePath,
+      "-o", outLdifFilePath,
+      "-O",
+      "(objectclass=*)",
+      "mail", "uid"
+    };
+    assertEquals(LDIFSearch.mainSearch(args, false), 0);
+    LDIFImportConfig ldifConfig = new LDIFImportConfig(outLdifFilePath);
+    ldifConfig.setValidateSchema(false);
+    LDIFReader reader = new LDIFReader(ldifConfig);
+    Entry e=reader.readEntry();
+    reader.close();
+    assertNull(e.getAttribute("objectclass"));
+    assertNotNull(e.getAttribute("mail"));
+    assertNotNull(e.getAttribute("uid"));
+  }
+}

--
Gitblit v1.10.0