From 8420e42dfb20a5074de8453a24749c36c115ea08 Mon Sep 17 00:00:00 2001
From: ludovicp <ludovicp@localhost>
Date: Wed, 02 Jul 2008 17:38:36 +0000
Subject: [PATCH] Fix to defect 1805: Added options to LDIFdiff to ignore specific attributes or entries when comparing LDIF files. --ignoreattrs (-a) <FILE> --ignoreentries (-e) <FILE> Contribution from Gautam Gopalakrishnan, Sun Microsystems, Inc.

---
 opends/src/server/org/opends/server/tools/LDIFDiff.java |  128 ++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 121 insertions(+), 7 deletions(-)

diff --git a/opends/src/server/org/opends/server/tools/LDIFDiff.java b/opends/src/server/org/opends/server/tools/LDIFDiff.java
index 1b2cf9e..1d9365f 100644
--- a/opends/src/server/org/opends/server/tools/LDIFDiff.java
+++ b/opends/src/server/org/opends/server/tools/LDIFDiff.java
@@ -27,15 +27,18 @@
 package org.opends.server.tools;
 import org.opends.messages.Message;
 
-
-
+import java.io.BufferedReader;
+import java.io.FileReader;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.PrintStream;
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.ListIterator;
 import java.util.TreeMap;
 
 import org.opends.server.core.DirectoryServer;
@@ -45,6 +48,7 @@
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.DN;
+import org.opends.server.types.DirectoryException;
 import org.opends.server.types.Entry;
 import org.opends.server.types.ExistingFileBehavior;
 import org.opends.server.types.LDIFImportConfig;
@@ -166,6 +170,8 @@
     StringArgument  outputLDIF;
     StringArgument  sourceLDIF;
     StringArgument  targetLDIF;
+    StringArgument  ignoreAttrsFile;
+    StringArgument  ignoreEntriesFile;
 
 
     Message toolDescription = INFO_LDIFDIFF_TOOL_DESCRIPTION.get();
@@ -191,6 +197,18 @@
               INFO_LDIFDIFF_DESCRIPTION_OUTPUT_LDIF.get());
       argParser.addArgument(outputLDIF);
 
+      ignoreAttrsFile = new StringArgument(
+              "ignoreattrs", 'a', "ignoreAttrs", false,
+              false, true, INFO_FILE_PLACEHOLDER.get(), null, null,
+              INFO_LDIFDIFF_DESCRIPTION_IGNORE_ATTRS.get());
+      argParser.addArgument(ignoreAttrsFile);
+
+      ignoreEntriesFile = new StringArgument(
+              "ignoreentries", 'e', "ignoreEntries", false,
+              false, true, INFO_FILE_PLACEHOLDER.get(), null, null,
+              INFO_LDIFDIFF_DESCRIPTION_IGNORE_ENTRIES.get());
+      argParser.addArgument(ignoreEntriesFile);
+
       overwriteExisting =
            new BooleanArgument(
                    "overwriteexisting", 'O',
@@ -314,6 +332,82 @@
       }
     }
 
+    // Read in ignored entries and attributes if any
+    BufferedReader ignReader = null;
+    Collection<DN> ignoreEntries = new HashSet<DN>();
+    Collection<String> ignoreAttrs   = new HashSet<String>();
+
+    if (ignoreAttrsFile.getValue() != null)
+    {
+      try
+      {
+        ignReader = new BufferedReader(
+          new FileReader(ignoreAttrsFile.getValue()));
+        String line = null;
+        while ((line = ignReader.readLine()) != null)
+        {
+          ignoreAttrs.add(line.toLowerCase());
+        }
+        ignReader.close();
+      }
+      catch (Exception e)
+      {
+        Message message = ERR_LDIFDIFF_CANNOT_READ_FILE_IGNORE_ATTRIBS.get(
+                ignoreAttrsFile.getValue(),
+                String.valueOf(e));
+        err.println(message);
+        return 1;
+      }
+      finally
+      {
+        try
+        {
+          ignReader.close();
+        }
+        catch (Exception e) {}
+      }
+    }
+
+    if (ignoreEntriesFile.getValue() != null)
+    {
+      try
+      {
+        ignReader = new BufferedReader(
+          new FileReader(ignoreEntriesFile.getValue()));
+        String line = null;
+        while ((line = ignReader.readLine()) != null)
+        {
+          try
+          {
+            DN dn = DN.decode(line);
+            ignoreEntries.add(dn);
+          }
+          catch (DirectoryException e)
+          {
+            Message message = INFO_LDIFDIFF_CANNOT_PARSE_STRING_AS_DN.get(
+                    line, ignoreEntriesFile.getValue());
+            err.println(message);
+          }
+        }
+        ignReader.close();
+      }
+      catch (Exception e)
+      {
+        Message message = ERR_LDIFDIFF_CANNOT_READ_FILE_IGNORE_ENTRIES.get(
+                ignoreEntriesFile.getValue(),
+                String.valueOf(e));
+        err.println(message);
+        return 1;
+      }
+      finally
+      {
+        try
+        {
+          ignReader.close();
+        }
+        catch (Exception e) {}
+      }
+    }
 
     // Open the source LDIF file and read it into a tree map.
     LDIFReader reader;
@@ -342,7 +436,10 @@
           break;
         }
 
-        sourceMap.put(entry.getDN(), entry);
+        if (! ignoreEntries.contains(entry.getDN()))
+        {
+          sourceMap.put(entry.getDN(), entry);
+        }
       }
     }
     catch (Exception e)
@@ -388,7 +485,10 @@
           break;
         }
 
-        targetMap.put(entry.getDN(), entry);
+        if (! ignoreEntries.contains(entry.getDN()))
+        {
+          targetMap.put(entry.getDN(), entry);
+        }
       }
     }
     catch (Exception e)
@@ -550,7 +650,7 @@
           {
             // The DNs are the same, so check to see if the entries are the
             // same or have been modified.
-            if (writeModify(writer, sourceEntry, targetEntry,
+            if (writeModify(writer, sourceEntry, targetEntry, ignoreAttrs,
                             singleValueChanges.isPresent()))
             {
               differenceFound = true;
@@ -678,6 +778,8 @@
    *                             written.
    * @param  sourceEntry         The source form of the entry.
    * @param  targetEntry         The target form of the entry.
+   * @param  ignoreAttrs         Attributes that are ignored while calculating
+   *                             the differences.
    * @param  singleValueChanges  Indicates whether each attribute-level change
    *                             should be written in a separate modification
    *                             per attribute value.
@@ -689,7 +791,7 @@
    *                       change record.
    */
   private static boolean writeModify(LDIFWriter writer, Entry sourceEntry,
-                                     Entry targetEntry,
+                                     Entry targetEntry, Collection ignoreAttrs,
                                      boolean singleValueChanges)
           throws IOException
   {
@@ -854,6 +956,19 @@
       }
     }
 
+    // Remove ignored attributes
+    if (! ignoreAttrs.isEmpty())
+    {
+      ListIterator<Modification> modIter = modifications.listIterator();
+      while (modIter.hasNext())
+      {
+        String name = modIter.next().getAttribute().getName().toLowerCase();
+        if (ignoreAttrs.contains(name))
+        {
+            modIter.remove();
+        }
+      }
+    }
 
     // Write the modification change record.
     if (modifications.isEmpty())
@@ -902,4 +1017,3 @@
     }
   }
 }
-

--
Gitblit v1.10.0