From e4a401abbf1801a2310fbe216e2df712d42a9c20 Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Thu, 03 Dec 2009 18:04:49 +0000
Subject: [PATCH] Split SDK from server code and add build/packaging infrastructure.

---
 opendj-sdk/sdk/build-tools/org/opends/build/tools/GenerateMessageFile.java | 1000 +++++++++++++++++++++++++++-------------------------------
 1 files changed, 464 insertions(+), 536 deletions(-)

diff --git a/opendj-sdk/sdk/build-tools/org/opends/build/tools/GenerateMessageFile.java b/opendj-sdk/sdk/build-tools/org/opends/build/tools/GenerateMessageFile.java
index dd3371e..602dc30 100644
--- a/opendj-sdk/sdk/build-tools/org/opends/build/tools/GenerateMessageFile.java
+++ b/opendj-sdk/sdk/build-tools/org/opends/build/tools/GenerateMessageFile.java
@@ -26,230 +26,194 @@
  */
 package org.opends.build.tools;
 
-import org.apache.tools.ant.Task;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.Location;
-import static org.opends.build.tools.Utilities.*;
-import org.opends.messages.Category;
-import org.opends.messages.Severity;
-import org.opends.messages.MessageDescriptor;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileReader;
-import java.io.BufferedReader;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.util.Properties;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.UnknownFormatConversionException;
-import java.util.Calendar;
-import java.util.Arrays;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.EnumSet;
+
+import static org.opends.build.tools.Utilities.*;
+
+import java.io.*;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Location;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+
+
+
 /**
- * Generates a Java class containing representations of messages
- * found in a properties file.
+ * Generates a Java class containing representations of messages found
+ * in a properties file.
  */
-public class GenerateMessageFile extends Task {
+public class GenerateMessageFile extends Task
+{
+  /**
+   * The maximum number of arguments that can be handled by a specific
+   * subclass. If you define more subclasses be sure to increment this
+   * number appropriately.
+   */
+  static public final int DESCRIPTOR_MAX_ARG_HANDLER = 11;
+
+  /**
+   * The base name of the specific argument handling subclasses defined
+   * below. The class names consist of the base name followed by a
+   * number indicating the number of arguments that they handle when
+   * creating messages or the letter "N" meaning any number of
+   * arguments.
+   */
+  public static final String DESCRIPTOR_CLASS_BASE_NAME = "Arg";
 
   private File source;
+
   private File dest;
+
   private boolean overwrite;
 
-  static private final String MESSAGES_FILE_STUB =
-          "resource/Messages.java.stub";
-
-  /*
-   * The registry filename is the result of the concatenation of the
-   * location of where the source are generated, the package name and the
-   * DESCRIPTORS_REG value.
-   */
-  static private String REGISTRY_FILE_NAME;
-
-  static private final String DESCRIPTORS_REG = "descriptors.reg";
-
-  /**
-   * Used to set a category for all messages in the property file.
-   * If set, the category for each message need not be encoded in
-   * the message's property file key.
-   */
-  static private final String GLOBAL_CATEGORY = "global.category";
-
-  /**
-   * Used to set a severity for all messages in the property file.
-   * If set, the severity for each message need not be encoded in
-   * the message's property file key.
-   */
-  static private final String GLOBAL_SEVERITY = "global.severity";
-
-  /**
-   * Used to set a category mask for all messages in the property
-   * file.  If set, the category will automatically be assigned
-   * USER_DEFINED and the value of <code>GLOBAL_CATEGORY</code>
-   * will be ignored.
-   */
-  static private final String GLOBAL_CATEGORY_MASK = "global.mask";
+  static private final String MESSAGES_FILE_STUB = "resource/Messages.java.stub";
 
   /**
    * When true generates messages that have no ordinals.
    */
   static private final String GLOBAL_ORDINAL = "global.ordinal";
 
-  /**
-   * When true and if the Java Web Start property is set use the class loader of
-   * the jar where the MessageDescriptor is contained to retrieve the
-   * ResourceBundle.
-   */
-  static private final String GLOBAL_USE_MESSAGE_JAR_IF_WEBSTART =
-    "global.use.message.jar.if.webstart";
-
   static private final Set<String> DIRECTIVE_PROPERTIES = new HashSet<String>();
-  static {
-    DIRECTIVE_PROPERTIES.add(GLOBAL_CATEGORY);
-    DIRECTIVE_PROPERTIES.add(GLOBAL_CATEGORY_MASK);
-    DIRECTIVE_PROPERTIES.add(GLOBAL_SEVERITY);
+  static
+  {
     DIRECTIVE_PROPERTIES.add(GLOBAL_ORDINAL);
-    DIRECTIVE_PROPERTIES.add(GLOBAL_USE_MESSAGE_JAR_IF_WEBSTART);
   }
 
-  static private final String SPECIFIER_REGEX =
-          "%(\\d+\\$)?([-#+ 0,(\\<]*)?(\\d+)?(\\.\\d+)?([tT])?([a-zA-Z%])";
+  static private final String SPECIFIER_REGEX = "%(\\d+\\$)?([-#+ 0,(\\<]*)?(\\d+)?(\\.\\d+)?([tT])?([a-zA-Z%])";
 
-  private final Pattern SPECIFIER_PATTERN = Pattern.compile(SPECIFIER_REGEX);
+  private final Pattern SPECIFIER_PATTERN = Pattern
+      .compile(SPECIFIER_REGEX);
 
   /**
    * Message giving formatting rules for string keys.
    */
   static public String KEY_FORM_MSG;
 
-  static {
-    KEY_FORM_MSG = new StringBuilder()
-            .append(".\n\nOpenDS message property keys must be of the form\n\n")
-            .append("\t\'[CATEGORY]_[SEVERITY]_[DESCRIPTION]_[ORDINAL]\'\n\n")
-            .append("where\n\n")
-            .append("CATEGORY is one of ")
-            .append(EnumSet.allOf(Category.class))
-            .append("\n\nSEVERITY is one of ")
-            .append(Severity.getPropertyKeyFormSet().toString())
-            .append("\n\nDESCRIPTION is a descriptive string composed ")
-            .append("of uppercase character, digits and underscores ")
-            .append("describing the purpose of the message ")
-            .append("\n\nORDINAL is an integer between 0 and 65535 that is ")
-            .append("unique to other messages defined in this file.\n\n")
-            .append("You can relax the mandate for including the CATEGORY, ")
-            .append("SEVERITY, and/or ORDINAL by including one or more ")
-            .append("of the following respective property directives in your ")
-            .append("properties file:  ")
-            .append(GLOBAL_CATEGORY)
-            .append(", ")
-            .append(GLOBAL_SEVERITY)
-            .append(", ")
-            .append(GLOBAL_ORDINAL)
-            .append("and setting their value appropriately.")
-            .toString();
+  static
+  {
+    KEY_FORM_MSG = new StringBuilder().append(
+        ".\n\nOpenDS message property keys must be of the form\n\n")
+        .append("\t\'[DESCRIPTION]_[ORDINAL]\'\n\n")
+        .append("where\n\n").append(
+            "\n\nDESCRIPTION is a descriptive string composed ")
+        .append("of uppercase character, digits and underscores ")
+        .append("describing the purpose of the message ").append(
+            "\n\nORDINAL is an integer between 0 and 65535 that is ")
+        .append("unique to other messages defined in this file.\n\n")
+        .toString();
   }
 
   /*
    * ISO_LANGUAGES contains all official supported languages for i18n
    */
-  private static final List<String> ISO_LANGUAGES =
-                                        Arrays.asList(Locale.getISOLanguages());
+  private static final List<String> ISO_LANGUAGES = Arrays
+      .asList(Locale.getISOLanguages());
+
   /*
    * ISO_COUNTRIES contains all official supported countries for i18n
    */
-  private static final List<String> ISO_COUNTRIES =
-                                        Arrays.asList(Locale.getISOCountries());
+  private static final List<String> ISO_COUNTRIES = Arrays
+      .asList(Locale.getISOCountries());
 
   /*
-   * A Pattern instance that matches "<label>_<language>_<country>.properties"
-   * where <label> can be anything including '_'
-   *       <language> a two characters code contained in the ISO_LANGUAGES list
-   *       <country> a two characters code contained in the ISO_COUNTRIES list
-   */  
-  private static final Pattern LANGUAGE_COUNTRY_MATCHER =
-                       Pattern.compile("(.*)_([a-z]{2})_([A-Z]{2}).properties");
+   * A Pattern instance that matches
+   * "<label>_<language>_<country>.properties" where <label> can be
+   * anything including '_' <language> a two characters code contained
+   * in the ISO_LANGUAGES list <country> a two characters code contained
+   * in the ISO_COUNTRIES list
+   */
+  private static final Pattern LANGUAGE_COUNTRY_MATCHER = Pattern
+      .compile("(.*)_([a-z]{2})_([A-Z]{2}).properties");
+
   /*
    * A Pattern instance that matches "<label>_<language>.properties"
    * where <label> and <language> have same definition as above.
    */
-  private static final Pattern LANGUAGE_MATCHER =
-                       Pattern.compile("(.*)_([a-z]{2}).properties");
+  private static final Pattern LANGUAGE_MATCHER = Pattern
+      .compile("(.*)_([a-z]{2}).properties");
+
+
 
   /**
    * Representation of a format specifier (for example %s).
    */
-  private class FormatSpecifier {
+  private class FormatSpecifier
+  {
 
     private String[] sa;
 
+
+
     /**
      * Creates a new specifier.
-     * @param sa specifier components
+     *
+     * @param sa
+     *          specifier components
      */
-    FormatSpecifier(String[] sa) {
+    FormatSpecifier(String[] sa)
+    {
       this.sa = sa;
     }
 
+
+
     /**
-     * Indicates whether or not the specifier uses arguement
-     * indexes (for example 2$).
+     * Indicates whether or not the specifier uses arguement indexes
+     * (for example 2$).
+     *
      * @return boolean true if this specifier uses indexing
      */
-    public boolean specifiesArgumentIndex() {
+    public boolean specifiesArgumentIndex()
+    {
       return this.sa[0] != null;
     }
 
+
+
     /**
-     * Returns a java class associated with a particular formatter
-     * based on the conversion type of the specifier.
-     * @return Class for representing the type of arguement used
-     *         as a replacement for this specifier.
+     * Returns a java class associated with a particular formatter based
+     * on the conversion type of the specifier.
+     *
+     * @return Class for representing the type of arguement used as a
+     *         replacement for this specifier.
      */
-    public Class getSimpleConversionClass() {
-      Class c = null;
+    public Class<?> getSimpleConversionClass()
+    {
+      Class<?> c = null;
       String sa4 = sa[4] != null ? sa[4].toLowerCase() : null;
       String sa5 = sa[5] != null ? sa[5].toLowerCase() : null;
-      if ("t".equals(sa4)) {
+      if ("t".equals(sa4))
+      {
         c = Calendar.class;
-      } else if (
-              "b".equals(sa5)) {
+      }
+      else if ("b".equals(sa5))
+      {
         c = Boolean.class;
-      } else if (
-              "h".equals(sa5)) {
+      }
+      else if ("h".equals(sa5))
+      {
         c = Integer.class;
-      } else if (
-              "s".equals(sa5)) {
+      }
+      else if ("s".equals(sa5))
+      {
         c = CharSequence.class;
-      } else if (
-              "c".equals(sa5)) {
+      }
+      else if ("c".equals(sa5))
+      {
         c = Character.class;
-      } else if (
-              "d".equals(sa5) ||
-              "o".equals(sa5) ||
-              "x".equals(sa5) ||
-              "e".equals(sa5) ||
-              "f".equals(sa5) ||
-              "g".equals(sa5) ||
-              "a".equals(sa5)) {
+      }
+      else if ("d".equals(sa5) || "o".equals(sa5) || "x".equals(sa5)
+          || "e".equals(sa5) || "f".equals(sa5) || "g".equals(sa5)
+          || "a".equals(sa5))
+      {
         c = Number.class;
-      } else if (
-              "n".equals(sa5) ||
-              "%".equals(sa5)) {
+      }
+      else if ("n".equals(sa5) || "%".equals(sa5))
+      {
         // ignore literals
       }
       return c;
@@ -257,73 +221,103 @@
 
   }
 
+
+
   /**
    * Represents a message to be written into the messages files.
    */
-  private class MessageDescriptorDeclaration {
+  private class MessageDescriptorDeclaration
+  {
 
     private MessagePropertyKey key;
+
     private String formatString;
+
     private List<FormatSpecifier> specifiers;
-    private List<Class> classTypes;
+
+    private List<Class<?>> classTypes;
+
     private String[] constructorArgs;
 
+
+
     /**
      * Creates a parameterized instance.
-     * @param key of the message
-     * @param formatString of the message
+     *
+     * @param key
+     *          of the message
+     * @param formatString
+     *          of the message
      */
     public MessageDescriptorDeclaration(MessagePropertyKey key,
-                                     String formatString) {
+        String formatString)
+    {
       this.key = key;
       this.formatString = formatString;
       this.specifiers = parse(formatString);
-      this.classTypes = new ArrayList<Class>();
-      for (FormatSpecifier f : specifiers) {
-        Class c = f.getSimpleConversionClass();
-        if (c != null) {
+      this.classTypes = new ArrayList<Class<?>>();
+      for (FormatSpecifier f : specifiers)
+      {
+        Class<?> c = f.getSimpleConversionClass();
+        if (c != null)
+        {
           classTypes.add(c);
         }
       }
     }
 
+
+
     /**
      * Gets the name of the Java class that will be used to represent
      * this message's type.
+     *
      * @return String representing the Java class name
      */
-    public String getDescriptorClassDeclaration() {
+    public String getDescriptorClassDeclaration()
+    {
       StringBuilder sb = new StringBuilder();
-      if (useGenericMessageTypeClass()) {
-        sb.append(getShortClassName(MessageDescriptor.class));
+      if (useGenericMessageTypeClass())
+      {
+        sb.append("MessageDescriptor");
         sb.append(".");
-        sb.append(MessageDescriptor.DESCRIPTOR_CLASS_BASE_NAME);
+        sb.append(DESCRIPTOR_CLASS_BASE_NAME);
         sb.append("N");
-      } else {
-        sb.append(getShortClassName(MessageDescriptor.class));
+      }
+      else
+      {
+        sb.append("MessageDescriptor");
         sb.append(".");
-        sb.append(MessageDescriptor.DESCRIPTOR_CLASS_BASE_NAME);
+        sb.append(DESCRIPTOR_CLASS_BASE_NAME);
         sb.append(classTypes.size());
         sb.append(getClassTypeVariables());
       }
       return sb.toString();
     }
 
+
+
     /**
      * Gets a string representing the message type class' variable
-     * information (for example '<String,Integer>') that is based on
-     * the type of arguments specified  by the specifiers in this message.
+     * information (for example '<String,Integer>') that is based on the
+     * type of arguments specified by the specifiers in this message.
+     *
      * @return String representing the message type class parameters
      */
-    public String getClassTypeVariables() {
+    public String getClassTypeVariables()
+    {
       StringBuilder sb = new StringBuilder();
-      if (classTypes.size() > 0) {
+      if (classTypes.size() > 0)
+      {
         sb.append("<");
-        for (int i = 0; i < classTypes.size(); i++) {
-          Class c = classTypes.get(i);
-          if (c != null) {
+        for (int i = 0; i < classTypes.size(); i++)
+        {
+          Class<?> c = classTypes.get(i);
+          if (c != null)
+          {
             sb.append(getShortClassName(c));
-            if (i < classTypes.size() - 1) {
+            if (i < classTypes.size() - 1)
+            {
               sb.append(",");
             }
           }
@@ -333,12 +327,16 @@
       return sb.toString();
     }
 
+
+
     /**
-     * Gets the javadoc comments that will appear above the messages declaration
-     * in the messages file.
+     * Gets the javadoc comments that will appear above the messages
+     * declaration in the messages file.
+     *
      * @return String comment
      */
-    public String getComment() {
+    public String getComment()
+    {
       StringBuilder sb = new StringBuilder();
       sb.append(indent(1)).append("/**").append(EOL);
 
@@ -347,27 +345,36 @@
       String ws = formatString; // wrapText(formatString, 70);
 
       String[] sa = ws.split(EOL);
-      for (String s : sa) {
+      for (String s : sa)
+      {
         sb.append(indent(1)).append(" * ").append(s).append(EOL);
       }
       sb.append(indent(1)).append(" */").append(EOL);
       return sb.toString();
     }
 
+
+
     /**
-     * Sets the arguments that will be supplied in the declaration
-     * of the message.
-     * @param s array of string arguments that will be passed
-     *        in the constructor
+     * Sets the arguments that will be supplied in the declaration of
+     * the message.
+     *
+     * @param s
+     *          array of string arguments that will be passed in the
+     *          constructor
      */
-    public void setConstructorArguments(String... s) {
+    public void setConstructorArguments(String... s)
+    {
       this.constructorArgs = s;
     }
 
+
+
     /**
      * {@inheritDoc}
      */
-    public String toString() {
+    public String toString()
+    {
       StringBuilder sb = new StringBuilder();
       sb.append(getComment());
       sb.append(indent(1));
@@ -381,10 +388,13 @@
       sb.append("new ");
       sb.append(getDescriptorClassDeclaration());
       sb.append("(");
-      if (constructorArgs != null) {
-        for (int i = 0; i < constructorArgs.length; i++) {
+      if (constructorArgs != null)
+      {
+        for (int i = 0; i < constructorArgs.length; i++)
+        {
           sb.append(constructorArgs[i]);
-          if (i < constructorArgs.length - 1) {
+          if (i < constructorArgs.length - 1)
+          {
             sb.append(",");
           }
         }
@@ -395,20 +405,29 @@
       return sb.toString();
     }
 
+
+
     /**
-     * Indicates whether the generic message type class should
-     * be used.  In general this is when a format specifier is
-     * more complicated than we support or when the number of
-     * arguments exceeeds the number of specific message type
-     * classes (MessageType0, MessageType1 ...) that are defined.
+     * Indicates whether the generic message type class should be used.
+     * In general this is when a format specifier is more complicated
+     * than we support or when the number of arguments exceeeds the
+     * number of specific message type classes (MessageType0,
+     * MessageType1 ...) that are defined.
+     *
      * @return boolean indicating
      */
-    private boolean useGenericMessageTypeClass() {
-      if (specifiers.size() > MessageDescriptor.DESCRIPTOR_MAX_ARG_HANDLER) {
+    private boolean useGenericMessageTypeClass()
+    {
+      if (specifiers.size() > DESCRIPTOR_MAX_ARG_HANDLER)
+      {
         return true;
-      } else if (specifiers != null) {
-        for (FormatSpecifier s : specifiers) {
-          if (s.specifiesArgumentIndex()) {
+      }
+      else if (specifiers != null)
+      {
+        for (FormatSpecifier s : specifiers)
+        {
+          if (s.specifiesArgumentIndex())
+          {
             return true;
           }
         }
@@ -416,51 +435,66 @@
       return false;
     }
 
+
+
     /**
      * Look for format specifiers in the format string.
-     * @param s format string
+     *
+     * @param s
+     *          format string
      * @return list of format specifiers
      */
-    private List<FormatSpecifier> parse(String s) {
+    private List<FormatSpecifier> parse(String s)
+    {
       List<FormatSpecifier> sl = new ArrayList<FormatSpecifier>();
       Matcher m = SPECIFIER_PATTERN.matcher(s);
       int i = 0;
-      while (i < s.length()) {
-        if (m.find(i)) {
+      while (i < s.length())
+      {
+        if (m.find(i))
+        {
           // Anything between the start of the string and the beginning
           // of the format specifier is either fixed text or contains
           // an invalid format string.
-          if (m.start() != i) {
+          if (m.start() != i)
+          {
             // Make sure we didn't miss any invalid format specifiers
             checkText(s.substring(i, m.start()));
             // Assume previous characters were fixed text
-            //al.add(new FixedString(s.substring(i, m.start())));
+            // al.add(new FixedString(s.substring(i, m.start())));
           }
 
           // Expect 6 groups in regular expression
           String[] sa = new String[6];
-          for (int j = 0; j < m.groupCount(); j++) {
+          for (int j = 0; j < m.groupCount(); j++)
+          {
             sa[j] = m.group(j + 1);
           }
           sl.add(new FormatSpecifier(sa));
           i = m.end();
-        } else {
-          // No more valid format specifiers.  Check for possible invalid
+        }
+        else
+        {
+          // No more valid format specifiers. Check for possible invalid
           // format specifiers.
           checkText(s.substring(i));
           // The rest of the string is fixed text
-          //al.add(new FixedString(s.substring(i)));
+          // al.add(new FixedString(s.substring(i)));
           break;
         }
       }
       return sl;
     }
 
-    private void checkText(String s) {
+
+
+    private void checkText(String s)
+    {
       int idx;
       // If there are any '%' in the given string, we got a bad format
       // specifier.
-      if ((idx = s.indexOf('%')) != -1) {
+      if ((idx = s.indexOf('%')) != -1)
+      {
         char c = (idx > s.length() - 2 ? '%' : s.charAt(idx + 1));
         throw new UnknownFormatConversionException(String.valueOf(c));
       }
@@ -468,132 +502,116 @@
 
   }
 
+
+
   /**
    * Sets the source of the messages.
-   * @param source File representing the properties
-   *        file containing messages
+   *
+   * @param source
+   *          File representing the properties file containing messages
    */
-  public void setSourceProps(File source) {
+  public void setSourceProps(File source)
+  {
     this.source = source;
   }
 
+
+
   /**
-   * Sets the file that will be generated containing
-   * declarations of messages from <code>source</code>.
-   * @param dest File destination
+   * Sets the file that will be generated containing declarations of
+   * messages from <code>source</code>.
+   *
+   * @param dest
+   *          File destination
    */
-  public void setDestJava(File dest) {
+  public void setDestJava(File dest)
+  {
     this.dest = dest;
-
-    /*
-     * Set the descriptors.reg pathname to the same directory as the one used
-     * to generate files and ensure all messages are generated in one place.
-     */
-    String projectBase = null;
-    try {
-      projectBase = getProject().getBaseDir().getCanonicalPath();
-    } catch( java.io.IOException e) {
-      throw new BuildException("Error processing " + dest +
-            ": unable to retrieve project's directory of ant's project (" +
-            e + ")");
-    }
-
-    String registry = dest.getAbsolutePath();
-    // strip project directory prefix and replace properties filename with
-    // $DESCRIPTORS_REG
-    registry = registry.substring(projectBase.length()+1,
-                                 registry.lastIndexOf(File.separator)+1)
-                       .concat(DESCRIPTORS_REG);
-
-    if ( REGISTRY_FILE_NAME == null ) {
-      REGISTRY_FILE_NAME = registry;
-    } else {
-      if ( ! REGISTRY_FILE_NAME.equals(registry) ) {
-        // multiple messages are generated in several packages
-        StringBuilder sb = new StringBuilder();
-        // full pathname of $REGISTRY_FILE_NAME
-        sb.append(projectBase)
-          .append(File.separator)
-          .append(REGISTRY_FILE_NAME);
-        // change from generated directory to properties files directory
-        sb.replace(0,
-                   getProject().getProperty("msg.javagen.dir").length(),
-                   getProject().getProperty("msg.dir"));
-        // replace properties filename with source filename
-        sb.replace(sb.lastIndexOf(File.separator)+1,
-                   sb.length(),
-                   source.getName());
-        throw new BuildException("Error processing " + dest +
-              ": all messages must be located in the same package thus " +
-              "name of the source file should be " + sb);
-
-      }
-    }
   }
 
+
+
   /**
-   * Indicates when true that an existing destination
-   * file will be overwritten.
-   * @param o boolean where true means overwrite
+   * Indicates when true that an existing destination file will be
+   * overwritten.
+   *
+   * @param o
+   *          boolean where true means overwrite
    */
-  public void setOverwrite(boolean o) {
+  public void setOverwrite(boolean o)
+  {
     this.overwrite = o;
   }
 
+
+
   /**
    * {@inheritDoc}
    */
   @Override
-  public void execute() throws BuildException {
+  public void execute() throws BuildException
+  {
 
-    if ( this.dest == null ) {
+    if (this.dest == null)
+    {
       // this is an example-plugin call:
       // - check the source file is not a localization
       // - guess the destination filename from source filename
       String sourcefilename = source.getAbsolutePath();
-      int filenameIndex = sourcefilename.lastIndexOf(File.separator)+1;
+      int filenameIndex = sourcefilename.lastIndexOf(File.separator) + 1;
       String pathname = sourcefilename.substring(0, filenameIndex);
       String filename = sourcefilename.substring(filenameIndex);
 
       /*
-       * Make sure only <label>.properties are generated thus avoiding to
-       * generate messages for localized properties files.
+       * Make sure only <label>.properties are generated thus avoiding
+       * to generate messages for localized properties files.
        */
       Matcher matcher = LANGUAGE_COUNTRY_MATCHER.matcher(filename);
-      if ( matcher.find() ) {
-        if ( ISO_LANGUAGES.contains(matcher.group(2))
-          && ISO_COUNTRIES.contains(matcher.group(3)) ) {
-          // do not generate message for <label>_<language>_<country>.properties
+      if (matcher.find())
+      {
+        if (ISO_LANGUAGES.contains(matcher.group(2))
+            && ISO_COUNTRIES.contains(matcher.group(3)))
+        {
+          // do not generate message for
+          // <label>_<language>_<country>.properties
           return;
         }
       }
 
       matcher = LANGUAGE_MATCHER.matcher(filename);
-      if ( matcher.find() ) {
-        if ( ISO_LANGUAGES.contains(matcher.group(2)) ) {
+      if (matcher.find())
+      {
+        if (ISO_LANGUAGES.contains(matcher.group(2)))
+        {
           // do not generate message for <label>_<language>.properties
           return;
         }
       }
       // filename without ".properties"
-      filename = filename.substring(0, filename.length()-11);
+      filename = filename.substring(0, filename.length() - 11);
       // change to src-generated directory keeping package name
-      pathname = pathname.replace(getProject().getProperty("msg.dir"),
-                                  getProject().getProperty("msg.javagen.dir"));
+      pathname = pathname.replace(getProject().getProperty("src.dir"),
+          getProject().getProperty("srcgen.dir"));
 
-      // append characters from filename to pathname starting with an uppercase
-      // letter, ignoring '_' and uppering all characters prefixed with "_" 
+      // append characters from filename to pathname starting with an
+      // uppercase letter, ignoring '_' and uppering all characters
+      // prefixed with "_"
       StringBuilder sb = new StringBuilder(pathname);
       boolean upperCaseNextChar = true;
-      for(char c : filename.toCharArray()) {
-        if ( c == '_' ) {
+      for (char c : filename.toCharArray())
+      {
+        if (c == '_')
+        {
           upperCaseNextChar = true;
           continue;
         }
-        if ( upperCaseNextChar ) {
+        if (upperCaseNextChar)
+        {
           sb.append(Character.toUpperCase(c));
           upperCaseNextChar = false;
-        } else {
+        }
+        else
+        {
           sb.append(c);
         }
       }
@@ -604,372 +622,296 @@
 
     BufferedReader stubReader = null;
     PrintWriter destWriter = null;
-    try {
+    try
+    {
 
       // Decide whether to generate messages based on modification
       // times and print status messages.
-      if (!source.exists()) {
-        throw new BuildException("file " + source.getName() +
-                " does not exist");
+      if (!source.exists())
+      {
+        throw new BuildException("file " + source.getName()
+            + " does not exist");
       }
-      if (dest.exists()) {
-        if (this.overwrite || source.lastModified() > dest.lastModified()) {
+      if (dest.exists())
+      {
+        if (this.overwrite
+            || source.lastModified() > dest.lastModified())
+        {
           dest.delete();
-          log("Regenerating " + dest.getName() + " from " + source.getName());
-        } else {
+          log("Regenerating " + dest.getName() + " from "
+              + source.getName());
+        }
+        else
+        {
           log(dest.getName() + " is up to date");
           return;
         }
-      } else {
+      }
+      else
+      {
         File javaGenDir = dest.getParentFile();
-        if (!javaGenDir.exists()) {
+        if (!javaGenDir.exists())
+        {
           javaGenDir.mkdirs();
         }
-        log("Generating " + dest.getName() + " from " + source.getName());
+        log("Generating " + dest.getName() + " from "
+            + source.getName());
       }
 
-      stubReader = new BufferedReader(new InputStreamReader(getStubFile(),
-                                                            "UTF-8"));
+      stubReader = new BufferedReader(new InputStreamReader(
+          getStubFile(), "UTF-8"));
       destWriter = new PrintWriter(dest, "UTF-8");
       String stubLine;
       Properties properties = new Properties();
       properties.load(new FileInputStream(source));
-      while (null != (stubLine = stubReader.readLine())) {
-        if (stubLine.contains("${MESSAGES}")) {
+      while (null != (stubLine = stubReader.readLine()))
+      {
+        if (stubLine.contains("${MESSAGES}"))
+        {
           Integer globalOrdinal = null;
           String go = properties.getProperty(GLOBAL_ORDINAL);
-          if (go != null) {
+          if (go != null)
+          {
             globalOrdinal = new Integer(go);
           }
 
-          // Determine the value of the global category/mask if set
-          Integer  globalMask = null;
-          Category globalCategory = null;
-          String gms = properties.getProperty(GLOBAL_CATEGORY_MASK);
-          if (gms != null) {
-            globalMask = Integer.parseInt(gms);
-            globalCategory = Category.USER_DEFINED;
-          } else {
-            String gcs = properties.getProperty(GLOBAL_CATEGORY);
-            if (gcs != null) {
-              globalCategory = Category.valueOf(gcs);
-            }
-          }
+          Map<MessagePropertyKey, String> keyMap = new TreeMap<MessagePropertyKey, String>();
 
-          // Determine the value of the global severity
-          Severity globalSeverity = null;
-          String gss = properties.getProperty(GLOBAL_SEVERITY);
-          if (gss != null) {
-            globalSeverity = Severity.parseString(gss);
-          }
-
-          Map<MessagePropertyKey,String> keyMap =
-                  new TreeMap<MessagePropertyKey,String>();
-
-          for (Object propO : properties.keySet()) {
+          for (Object propO : properties.keySet())
+          {
             String propKey = propO.toString();
-            try {
-              if (!DIRECTIVE_PROPERTIES.contains(propKey)) {
-                MessagePropertyKey key =
-                        MessagePropertyKey.parseString(
-                                propKey,
-                                globalCategory == null,
-                                globalSeverity == null,
-                                globalOrdinal == null);
+            try
+            {
+              if (!DIRECTIVE_PROPERTIES.contains(propKey))
+              {
+                MessagePropertyKey key = MessagePropertyKey
+                    .parseString(propKey, globalOrdinal == null);
                 String formatString = properties.getProperty(propKey);
                 keyMap.put(key, formatString);
               }
-            } catch (IllegalArgumentException iae) {
-              throw new BuildException(
-                      "ERROR: invalid property key " + propKey +
-                      ": " + iae.getMessage() +
-                      KEY_FORM_MSG);
+            }
+            catch (IllegalArgumentException iae)
+            {
+              throw new BuildException("ERROR: invalid property key "
+                  + propKey + ": " + iae.getMessage() + KEY_FORM_MSG);
             }
           }
 
           int usesOfGenericDescriptor = 0;
 
-          Category firstCategory = null;
           Set<Integer> usedOrdinals = new HashSet<Integer>();
-          for (MessagePropertyKey key : keyMap.keySet()) {
+          for (MessagePropertyKey key : keyMap.keySet())
+          {
             String formatString = keyMap.get(key);
-            MessageDescriptorDeclaration message =
-                    new MessageDescriptorDeclaration(key, formatString);
+            MessageDescriptorDeclaration message = new MessageDescriptorDeclaration(
+                key, formatString);
 
-            Category c = (globalCategory != null ?
-                    globalCategory : key.getCategory());
-
-            // Check that this category is the same as all the
-            // others in this file.  Maybe this should be an error?
-            if (firstCategory != null) {
-              if (!firstCategory.equals(c)) {
-                log("WARNING: multiple categories defined in " + source);
-              }
-            } else {
-              firstCategory = c;
-            }
-
-            Severity s = (globalSeverity != null ?
-                    globalSeverity : key.getSeverity());
-
-            if (c == null) {
-              throw new BuildException(
-                      "No category could be assigned to message " +
-                              key + ".  The category " +
-                              "must either be encoded in the property key or " +
-                              "or must be set by including the property " +
-                              GLOBAL_CATEGORY + " in the properties file" +
-                              KEY_FORM_MSG);
-            }
-
-            if (c == null) {
-              throw new BuildException(
-                      "No severity could be assigned to message " +
-                              key + ".  The severity " +
-                              "must either be encoded in the property key or " +
-                              "or must be set by including the property " +
-                              GLOBAL_SEVERITY + " in the properties file" +
-                              KEY_FORM_MSG);
-            }
-
-            if (globalOrdinal == null) {
+            if (globalOrdinal == null)
+            {
               Integer ordinal = key.getOrdinal();
-              if (usedOrdinals.contains(ordinal)) {
-                throw new BuildException(
-                        "The ordinal value \'" + ordinal + "\' in key " +
-                                key + " has been previously defined in " +
-                                source + KEY_FORM_MSG);
-              } else {
+              if (usedOrdinals.contains(ordinal))
+              {
+                throw new BuildException("The ordinal value \'"
+                    + ordinal + "\' in key " + key
+                    + " has been previously defined in " + source
+                    + KEY_FORM_MSG);
+              }
+              else
+              {
                 usedOrdinals.add(ordinal);
               }
             }
 
-            message.setConstructorArguments(
-                    "BASE",
-                    quote(key.toString()),
-                    globalMask != null ? globalMask.toString() : c.name(),
-                    s.name(),
-                    globalOrdinal != null ?
-                            globalOrdinal.toString() :
-                            key.getOrdinal().toString()
-            );
+            message.setConstructorArguments("BASE", quote(key
+                .toString()), globalOrdinal != null ? globalOrdinal
+                .toString() : key.getOrdinal().toString());
             destWriter.println(message.toString());
             destWriter.println();
 
             // Keep track of when we use the generic descriptor
             // so that we can report it later
-            if (message.useGenericMessageTypeClass()) {
+            if (message.useGenericMessageTypeClass())
+            {
               usesOfGenericDescriptor++;
             }
           }
 
-          log("  Message Generated:" + keyMap.size(), Project.MSG_VERBOSE);
+          log("  Message Generated:" + keyMap.size(),
+              Project.MSG_VERBOSE);
           log("  MessageDescriptor.ArgN:" + usesOfGenericDescriptor,
-                  Project.MSG_VERBOSE);
+              Project.MSG_VERBOSE);
 
-        } else {
+        }
+        else
+        {
           stubLine = stubLine.replace("${PACKAGE}", getPackage());
-          stubLine = stubLine.replace("${CLASS_NAME}",
-                  dest.getName().substring(0, dest.getName().length() -
-                          ".java".length()));
+          stubLine = stubLine
+              .replace("${CLASS_NAME}", dest.getName().substring(0,
+                  dest.getName().length() - ".java".length()));
           stubLine = stubLine.replace("${BASE}", getBase());
-
-          String useMessageJarIfWebstart =
-            properties.getProperty(GLOBAL_USE_MESSAGE_JAR_IF_WEBSTART);
-          if ((useMessageJarIfWebstart != null) &&
-              ("true".equalsIgnoreCase(useMessageJarIfWebstart) ||
-              "on".equalsIgnoreCase(useMessageJarIfWebstart) ||
-              "true".equalsIgnoreCase(useMessageJarIfWebstart)))
-          {
-            useMessageJarIfWebstart = "true";
-          }
-          else
-          {
-            useMessageJarIfWebstart = "false";
-          }
-          stubLine = stubLine.replace("${USE_MESSAGE_JAR_IF_WEBSTART}",
-              useMessageJarIfWebstart);
           destWriter.println(stubLine);
         }
       }
 
-      registerMessageDescriptor(getMessageDescriptorFullClassName());
-
       stubReader.close();
       destWriter.close();
-
-    } catch (Exception e) {
+    }
+    catch (Exception e)
+    {
       // Don't leave a malformed file laying around. Delete
       // it so it will be forced to be regenerated.
-      if (dest.exists()) {
+      if (dest.exists())
+      {
         dest.deleteOnExit();
       }
       e.printStackTrace();
-      throw new BuildException("Error processing " + source +
-              ":  " + e.getMessage());
-    } finally {
-      if (stubReader != null) {
-        try {
+      throw new BuildException("Error processing " + source + ":  "
+          + e.getMessage());
+    }
+    finally
+    {
+      if (stubReader != null)
+      {
+        try
+        {
           stubReader.close();
-        } catch (Exception e){
+        }
+        catch (Exception e)
+        {
           // ignore
         }
       }
-      if (destWriter != null) {
-        try {
+      if (destWriter != null)
+      {
+        try
+        {
           destWriter.close();
-        } catch (Exception e){
+        }
+        catch (Exception e)
+        {
           // ignore
         }
       }
     }
   }
 
-  private String getMessageDescriptorFullClassName() {
-    return getPackage() + "." + getMessageDescriptorClassName();
-  }
 
-  private String getMessageDescriptorClassName() {
-    return dest.getName().substring(
-            0, dest.getName().length() - ".java".length());
-  }
 
-  private String getBase() {
+  private String getBase()
+  {
     String srcPath = unixifyPath(source.getAbsolutePath());
     String base = srcPath.substring(srcPath.lastIndexOf("/") + 1,
-                                    srcPath.length() - ".properties".length());
+        srcPath.length() - ".properties".length());
     return base;
   }
 
-  private String getPackage() {
+
+
+  private String getPackage()
+  {
     String destPath = unixifyPath(dest.getAbsolutePath());
-    String msgJavaGenDir = unixifyPath(
-                                   getProject().getProperty("msg.javagen.dir"));
-    String c = destPath.substring(msgJavaGenDir.length()+1);
+    String msgJavaGenDir = unixifyPath(getProject().getProperty(
+        "srcgen.dir"));
+    String c = destPath.substring(msgJavaGenDir.length() + 1);
     c = c.replace('/', '.');
     c = c.substring(0, c.lastIndexOf(".")); // strip .java
     c = c.substring(0, c.lastIndexOf(".")); // strip class name
     return c;
   }
 
-  static private String indent(int indent) {
+
+
+  static private String indent(int indent)
+  {
     char[] blankArray = new char[2 * indent];
     Arrays.fill(blankArray, ' ');
     return new String(blankArray);
   }
 
-  static private String quote(String s) {
-    return new StringBuilder()
-            .append("\"")
-            .append(s)
-            .append("\"")
-            .toString();
+
+
+  static private String quote(String s)
+  {
+    return new StringBuilder().append("\"").append(s).append("\"")
+        .toString();
   }
 
-  static private String getShortClassName(Class c) {
+
+
+  static private String getShortClassName(Class<?> c)
+  {
     String name;
     String fqName = c.getName();
     int i = fqName.lastIndexOf('.');
-    if (i > 0) {
+    if (i > 0)
+    {
       name = fqName.substring(i + 1);
-    } else {
+    }
+    else
+    {
       name = fqName;
     }
     return name;
   }
 
-  /**
-   * Writes a record in the messages registry for the specifed
-   * class name.
-   * @param descClassName name of the message descriptor class
-   * @return true if the class was acutally added to the registry;
-   *         false indicates that the class was already present.
-   * @throws IOException if there is a problem with the file I/O
-   */
-  private boolean registerMessageDescriptor(String descClassName)
-          throws IOException
+
+
+  private File getProjectBase()
   {
-    boolean classAdded = false;
-    File registry = getRegistryFile();
-    if (!isDescriptorRegistered(descClassName)) {
-      FileOutputStream file = new FileOutputStream(registry,true);
-      DataOutputStream out   = new DataOutputStream(file);
-      out.writeBytes(descClassName);
-      out.writeBytes("\n");
-      out.flush();
-      out.close();
-    }
-    return classAdded;
-  }
-
-  private boolean isDescriptorRegistered(String descClassName)
-          throws IOException
-  {
-    boolean isRegistered = false;
-    BufferedReader reader = new BufferedReader(
-            new FileReader(getRegistryFile()));
-    String line;
-    while(null != (line = reader.readLine())) {
-      if (line.trim().equals(descClassName.trim())) {
-        isRegistered = true;
-        break;
-      }
-    }
-    return isRegistered;
-  }
-
-  private File getRegistryFile() throws IOException {
-    File registry = new File(getProjectBase(), REGISTRY_FILE_NAME);
-    if (!registry.exists()) {
-      File parent = registry.getParentFile();
-      if (!parent.exists()) {
-        parent.mkdirs();
-      }
-      registry.createNewFile();
-    }
-    return registry;
-  }
-
-  private File getProjectBase() {
     File projectBase;
 
     // Get the path to build.xml and return the parent
     // directory else just return the working directory.
     Location l = getLocation();
     String fileName = l.getFileName();
-    if (fileName != null) {
+    if (fileName != null)
+    {
       File f = new File(fileName);
       projectBase = f.getParentFile();
-    } else {
+    }
+    else
+    {
       projectBase = new File(System.getProperty("user.dir"));
     }
 
     return projectBase;
   }
 
-  private String unixifyPath(String path) {
+
+
+  private String unixifyPath(String path)
+  {
     return path.replace("\\", "/");
   }
 
+
+
   /*
-   * Returns the stub file ("resource/Messages.java.stub") from the appropriate
-   * location: ant or jar file.
+   * Returns the stub file ("resource/Messages.java.stub") from the
+   * appropriate location: ant or jar file.
    */
-  private InputStream getStubFile() {
+  private InputStream getStubFile()
+  {
     InputStream result = null;
 
     File stub = new File(getProjectBase(), MESSAGES_FILE_STUB);
-    if ( stub.exists() ) {
+    if (stub.exists())
+    {
       // this is the OpenDS's ant project calling
       // Stub is located at OPENDS_ROOT/resource/Messages.java.stub
-      try {
+      try
+      {
         result = new FileInputStream(stub);
-      } catch (FileNotFoundException e) {
-        // should neven happen
-        throw new BuildException("Unable to load template " +
-              MESSAGES_FILE_STUB + ":  " + e.getMessage());
       }
-    } else {
+      catch (FileNotFoundException e)
+      {
+        // should never happen
+        throw new BuildException("Unable to load template "
+            + MESSAGES_FILE_STUB + ":  " + e.getMessage());
+      }
+    }
+    else
+    {
       // this is the example plugin's ant project calling
       // Stub is located at build-tools.jar:resource/Messages.java.stub
       result = getClass().getResourceAsStream(MESSAGES_FILE_STUB);
@@ -978,18 +920,4 @@
     return result;
   }
 
-  /**
-   * For testing.
-   * @param args from command line
-   */
-  public static void main(String[] args) {
-    File source = new File("src/messages/messages/tools.properties");
-    File dest = new File("/tmp/org/opends/XXX.java");
-    GenerateMessageFile gmf = new GenerateMessageFile();
-    gmf.setOverwrite(true);
-    gmf.setDestJava(dest);
-    gmf.setSourceProps(source);
-    gmf.execute();
-  }
-
 }

--
Gitblit v1.10.0