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