From 7c21be35088d22e3efcba541b51d2286a1ac97e9 Mon Sep 17 00:00:00 2001
From: neil_a_wilson <neil_a_wilson@localhost>
Date: Fri, 09 Mar 2007 18:44:33 +0000
Subject: [PATCH] Update the build process so that the current configuration and schema are saved in a config/upgrade directory that may be used as a reference when identifying changes to apply to the base configuration when performing an upgrade from one version to another.

---
 opends/build-tools/src/org/opends/build/tools/ConcatSchema.java |  272 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 opends/build.xml                                                |   16 +++
 2 files changed, 288 insertions(+), 0 deletions(-)

diff --git a/opends/build-tools/src/org/opends/build/tools/ConcatSchema.java b/opends/build-tools/src/org/opends/build/tools/ConcatSchema.java
new file mode 100644
index 0000000..e28be56
--- /dev/null
+++ b/opends/build-tools/src/org/opends/build/tools/ConcatSchema.java
@@ -0,0 +1,272 @@
+/*
+ * 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 2007 Sun Microsystems, Inc.
+ */
+package org.opends.build.tools;
+
+
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.util.LinkedList;
+import java.util.TreeSet;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+
+
+
+/**
+ * This class provides an implementation of an Ant task that concatenates the
+ * contents of the files in the schema directory to create a base schema that
+ * may be used during the upgrade process.  Each element will also include the
+ * X-SCHEMA-FILE extension to indicate the source schema file.
+ */
+public class ConcatSchema
+       extends Task
+{
+  // The path to the directory containing the schema files.
+  private String schemaDirectory;
+
+  // The path to the concatenated schema file to create.
+  private String toFile;
+
+
+
+  /**
+   * Specifies the path to the directory containing the schema files.
+   *
+   * @param  schemaDirectory  The path to the directory containing the schema
+   *                          files.
+   */
+  public void setSchemaDirectory(String schemaDirectory)
+  {
+    this.schemaDirectory = schemaDirectory;
+  }
+
+
+
+  /**
+   * Specifies the path to the file to create containing the concatenated schema
+   * elements.
+   *
+   * @param  toFile  The path to the file containing the concatenated schema
+   *                 elements.
+   */
+  public void setToFile(String toFile)
+  {
+    this.toFile = toFile;
+  }
+
+
+
+  /**
+   * Performs the appropriate processing needed for this task.  In this case,
+   * it uses SVNKit to identify all modified files in the current workspace.
+   * For all source files, look for comment lines containing the word
+   * "copyright" and make sure at least one of them contains the current year.
+   */
+  @Override()
+  public void execute()
+  {
+    // Get a sorted list of the files in the schema directory.
+    TreeSet<String> schemaFileNames = new TreeSet<String>();
+    for (File f : new File(schemaDirectory).listFiles())
+    {
+      if (f.isFile())
+      {
+        schemaFileNames.add(f.getName());
+      }
+    }
+
+
+    // Create a set of lists that will hold the schema elements read from the
+    // files.
+    LinkedList<String> attributeTypes    = new LinkedList<String>();
+    LinkedList<String> objectClasses     = new LinkedList<String>();
+    LinkedList<String> nameForms         = new LinkedList<String>();
+    LinkedList<String> ditContentRules   = new LinkedList<String>();
+    LinkedList<String> ditStructureRules = new LinkedList<String>();
+    LinkedList<String> matchingRuleUses  = new LinkedList<String>();
+
+
+    // Open each of the files in order and read the elements that they contain,
+    // appending them to the appropriate lists.
+    for (String name : schemaFileNames)
+    {
+      // Read the contents of the file into a list with one schema element per
+      // list element.
+      LinkedList<StringBuilder> lines = new LinkedList<StringBuilder>();
+      try
+      {
+        BufferedReader reader = new BufferedReader(new FileReader(
+                                         new File(schemaDirectory, name)));
+
+        while (true)
+        {
+          String line = reader.readLine();
+          if (line == null)
+          {
+            break;
+          }
+          else if (line.startsWith("#") || (line.length() == 0))
+          {
+            continue;
+          }
+          else if (line.startsWith(" "))
+          {
+            lines.getLast().append(line.substring(1));
+          }
+          else
+          {
+            lines.add(new StringBuilder(line));
+          }
+        }
+
+        reader.close();
+      }
+      catch (Exception e)
+      {
+        throw new BuildException("Error while reading schema file " + name +
+                                 ":  " + e, e);
+      }
+
+
+      // Iterate through each line in the list.  Find the colon and get the
+      // attribute name at the beginning.  If it's someting that we don't
+      // recognize, then skip it.  Otherwise, add the X-SCHEMA-FILE extension
+      // and add it to the appropriate schema element list.
+      for (StringBuilder buffer : lines)
+      {
+        // Get the line and add the X-SCHEMA-FILE extension to the end of it.
+        // All of them should end with " )" but some might have the parenthesis
+        // crammed up against the last character so deal with that as well.
+        String line = buffer.toString().trim();
+        if (line.endsWith(" )"))
+        {
+         line = line.substring(0, line.length()-1) + "X-SCHEMA-FILE '" + name +
+            "' )";
+        }
+        else if (line.endsWith(")"))
+        {
+         line = line.substring(0, line.length()-1) + " X-SCHEMA-FILE '" + name +
+            "' )";
+        }
+        else
+        {
+          continue;
+        }
+
+        String lowerLine = line.toLowerCase();
+        if (lowerLine.startsWith("attributetypes:"))
+        {
+          attributeTypes.add(line);
+        }
+        else if (lowerLine.startsWith("objectclasses:"))
+        {
+          objectClasses.add(line);
+        }
+        else if (lowerLine.startsWith("nameforms:"))
+        {
+          nameForms.add(line);
+        }
+        else if (lowerLine.startsWith("ditcontentrules:"))
+        {
+          ditContentRules.add(line);
+        }
+        else if (lowerLine.startsWith("ditstructurerules:"))
+        {
+          ditStructureRules.add(line);
+        }
+        else if (lowerLine.startsWith("matchingruleuse:"))
+        {
+          matchingRuleUses.add(line);
+        }
+      }
+    }
+
+
+    // Write the resulting output to the merged schema file.
+    try
+    {
+      BufferedWriter writer = new BufferedWriter(new FileWriter(toFile));
+      writer.write("dn: cn=schema");
+      writer.newLine();
+      writer.write("objectClass: top");
+      writer.newLine();
+      writer.write("objectClass: ldapSubentry");
+      writer.newLine();
+      writer.write("objectClass: subschema");
+      writer.newLine();
+
+      for (String line : attributeTypes)
+      {
+        writer.write(line);
+        writer.newLine();
+      }
+
+      for (String line : objectClasses)
+      {
+        writer.write(line);
+        writer.newLine();
+      }
+
+      for (String line : nameForms)
+      {
+        writer.write(line);
+        writer.newLine();
+      }
+
+      for (String line : ditContentRules)
+      {
+        writer.write(line);
+        writer.newLine();
+      }
+
+      for (String line : ditStructureRules)
+      {
+        writer.write(line);
+        writer.newLine();
+      }
+
+      for (String line : matchingRuleUses)
+      {
+        writer.write(line);
+        writer.newLine();
+      }
+
+      writer.close();
+    }
+    catch (Exception e)
+    {
+      throw new BuildException("Error while writing concatenated schema file " +
+                               toFile + ":  " + e, e);
+    }
+  }
+}
+
diff --git a/opends/build.xml b/opends/build.xml
index 2d45b20..c65453e 100644
--- a/opends/build.xml
+++ b/opends/build.xml
@@ -591,6 +591,7 @@
     <mkdir dir="${pdir}/bin"             />
     <mkdir dir="${pdir}/classes"         />
     <mkdir dir="${pdir}/config"          />
+    <mkdir dir="${pdir}/config/upgrade"  />
     <mkdir dir="${pdir}/config/schema"   />
     <mkdir dir="${pdir}/config/messages" />
     <mkdir dir="${pdir}/config/MakeLDIF" />
@@ -628,6 +629,21 @@
       <fileset file="${config.dir}/*" />
     </copy>
 
+    <copy file="${pdir}/config/config.ldif"
+         tofile="${pdir}/config/upgrade/config.ldif.${REVISION_NUMBER}" />
+
+    <taskdef name="concatschema"
+             classname="org.opends.build.tools.ConcatSchema">
+      <classpath>
+        <fileset dir="${build.dir}/build-tools">
+          <include name="*.jar" />
+        </fileset>
+      </classpath>
+    </taskdef>
+
+    <concatschema schemaDirectory="${resource.dir}/schema"
+         toFile="${pdir}/config/upgrade/schema.ldif.${REVISION_NUMBER}" />
+
     <copy todir="${pdir}/config/schema">
       <fileset dir="${resource.dir}/schema" />
     </copy>

--
Gitblit v1.10.0