From 7ebdf3ce2a518582334a7a167a98555885bcc065 Mon Sep 17 00:00:00 2001
From: ctissot <ctissot@localhost>
Date: Mon, 26 May 2008 12:29:48 +0000
Subject: [PATCH] Fix for 3259: No messages support in example plugin

---
 opendj-sdk/opends/build.xml                                                       |   14 +
 opendj-sdk/opends/src/build-tools/org/opends/build/tools/GenerateMessageFile.java |  181 ++++++++++++++++++++++++-
 opendj-sdk/opends/resource/admin/example-plugin/build.xml                         |   62 ++++++++
 opendj-sdk/opends/src/messages/src/org/opends/messages/Message.java               |    2 
 opendj-sdk/opends/resource/admin/example-plugin/example_plugin_fr.properties      |   53 +++++++
 opendj-sdk/opends/resource/admin/example-plugin/example_plugin.properties         |   53 +++++++
 opendj-sdk/opends/resource/Messages.java.stub                                     |    4 
 opendj-sdk/opends/resource/admin/example-plugin/ExamplePlugin.java                |   24 +-
 8 files changed, 363 insertions(+), 30 deletions(-)

diff --git a/opendj-sdk/opends/build.xml b/opendj-sdk/opends/build.xml
index 113e491..0483bdd 100644
--- a/opendj-sdk/opends/build.xml
+++ b/opendj-sdk/opends/build.xml
@@ -140,10 +140,11 @@
   <property name="configguide.resource.dir" location="resource/admin/config-guide" />
 
   <!-- Properties for generating messages. -->
-  <property name="msg.prop.dir"    location="src/messages/messages" />
-  <property name="msg.javagen.dir" location="src/messages/generated" />
+  <property name="msg.dir"         location="src/messages" />
+  <property name="msg.prop.dir"    location="${msg.dir}/messages" />
+  <property name="msg.javagen.dir" location="${msg.dir}/generated" />
   <property name="msg.package.dir" location="${classes.dir}/messages" />
-  <property name="msg.src.dir"     location="src/messages/src" />
+  <property name="msg.src.dir"     location="${msg.dir}/src" />
 
   <!-- Properties for SNMP extension. -->
   <property name="snmp.mib.dir"      location="src/snmp/resource/mib" />
@@ -2031,6 +2032,8 @@
 
     <mkdir dir="${buildtools.classes.dir}" />
 
+    <copy file="${resource.dir}/Messages.java.stub" todir="${buildtools.classes.dir}/org/opends/build/tools/resource"/>
+
     <javac srcdir="${src.dir}:${msg.src.dir}" destdir="${buildtools.classes.dir}"
            sourcepath=""
            includes="org/opends/messages/Severity.java,
@@ -2221,6 +2224,7 @@
     <mkdir dir="${plugin.temp.dir}/example-plugin/resource/admin" />
     <mkdir dir="${plugin.temp.dir}/example-plugin/resource/config" />
     <mkdir dir="${plugin.temp.dir}/example-plugin/resource/schema" />
+    <mkdir dir="${plugin.temp.dir}/example-plugin/resource/messages" />
     <copy todir="${plugin.temp.dir}/example-plugin/src">
       <fileset dir="${admin.defn.dir}" includes="**/*.xml" />
     </copy>
@@ -2234,7 +2238,9 @@
     <copy todir="${plugin.temp.dir}/example-plugin/src/com/example/opends">
       <fileset dir="${admin.rules.dir}/example-plugin" includes="*.java,*.xml" excludes="build.xml" />
     </copy>
-
+    <copy todir="${plugin.temp.dir}/example-plugin/lib" file="${build.dir}/build-tools/build-tools.jar" />
+    <copy todir="${plugin.temp.dir}/example-plugin/resource/messages/com/example/opends/messages" file="${admin.rules.dir}/example-plugin/example_plugin.properties" />
+    <copy todir="${plugin.temp.dir}/example-plugin/resource/messages/com/example/opends/messages" file="${admin.rules.dir}/example-plugin/example_plugin_fr.properties" />
     <!-- Package up the plugin in the OpenDS package folder. -->
     <zip destfile="${pdir}/example-plugin.zip">
       <zipfileset dir="${plugin.temp.dir}" filemode="644" dirmode="755" />
diff --git a/opendj-sdk/opends/resource/Messages.java.stub b/opendj-sdk/opends/resource/Messages.java.stub
index 61ef73d..9395174 100644
--- a/opendj-sdk/opends/resource/Messages.java.stub
+++ b/opendj-sdk/opends/resource/Messages.java.stub
@@ -44,7 +44,7 @@
 public final class ${CLASS_NAME} {
 
   /** Base property for resource bundle containing messages */
-  private static final String BASE = "${BASE}";
+  private static final String BASE = "messages/${BASE}";
 
   private static ClassLoader webstartClassLoader;
 
@@ -96,7 +96,7 @@
     }
     else
     {
-      cl = null;
+      cl = ${CLASS_NAME}.class.getClassLoader();
     }
     return cl;
   }
diff --git a/opendj-sdk/opends/resource/admin/example-plugin/ExamplePlugin.java b/opendj-sdk/opends/resource/admin/example-plugin/ExamplePlugin.java
index 3923b29..d833628 100644
--- a/opendj-sdk/opends/resource/admin/example-plugin/ExamplePlugin.java
+++ b/opendj-sdk/opends/resource/admin/example-plugin/ExamplePlugin.java
@@ -32,7 +32,7 @@
 import java.util.Set;
 
 import org.opends.server.api.plugin.PluginType;
-import org.opends.server.api.plugin.StartupPluginResult;
+import org.opends.server.api.plugin.PluginResult;
 import org.opends.server.api.plugin.DirectoryServerPlugin;
 import org.opends.server.config.ConfigException;
 import org.opends.server.types.ConfigChangeResult;
@@ -46,6 +46,8 @@
 
 import com.example.opends.server.ExamplePluginCfg;
 
+import static com.example.opends.messages.ExamplePluginMessages.*;
+
 /**
  * The example plugin implementation class. This plugin will output
  * the configured message to the error log during server start up.
@@ -95,8 +97,8 @@
         // This is fine.
         break;
       default:
-        throw new ConfigException(Message.raw("Invalid plugin type " + t
-            + " for the example plugin."));
+        Message message = ERR_INITIALIZE_PLUGIN.get(String.valueOf(t));
+        throw new ConfigException(message);
       }
     }
 
@@ -119,11 +121,11 @@
    * @return  The result of the startup plugin processing.
    */
   @Override
-  public StartupPluginResult doStartup() {
+  public PluginResult.Startup doStartup() {
     // Log the provided message.
-    logError(Message.raw(Category.CONFIG, Severity.NOTICE,
-        "Example plugin message '" + config.getMessage() + "'."));
-    return StartupPluginResult.SUCCESS;
+    Message message = NOTE_DO_STARTUP.get(String.valueOf(config.getMessage()));
+    logError(message);
+    return PluginResult.Startup.continueStartup();
   }
 
 
@@ -143,10 +145,10 @@
     // Log a message to say that the configuration has changed. This
     // isn't necessary, but we'll do it just to show that the change
     // has taken effect.
-    logError(Message.raw(Category.CONFIG, Severity.NOTICE,
-        "Example plugin message has been changed from '"
-            + this.config.getMessage() + "' to '"
-            + config.getMessage() + "'"));
+    Message message = NOTE_APPLY_CONFIGURATION_CHANGE.get(
+                                      String.valueOf(this.config.getMessage()),
+                                      String.valueOf(config.getMessage()));
+    logError(message);
 
     // Update the configuration.
     this.config = config;
diff --git a/opendj-sdk/opends/resource/admin/example-plugin/build.xml b/opendj-sdk/opends/resource/admin/example-plugin/build.xml
index 047acd9..3cd451a 100644
--- a/opendj-sdk/opends/resource/admin/example-plugin/build.xml
+++ b/opendj-sdk/opends/resource/admin/example-plugin/build.xml
@@ -30,6 +30,9 @@
     This is the build script for an OpenDS Directory Server extension.
   </description>
 
+  <!-- Import extra tasks from ant-contrib (for, if-then-else, ...) -->
+  <taskdef resource="net/sf/antcontrib/antlib.xml"/>
+
   <!-- CONFIGURE: The name of the extension's Jar file. -->
   <property name="pkg.name" value="example-plugin" />
 
@@ -43,15 +46,19 @@
   <property name="build.dir" location="build" />
   <property name="src.dir" location="src" />
   <property name="src.gen.dir" location="src-generated" />
+  <!-- alias variable as needed by the ant task that generates messages -->
+  <property name="msg.javagen.dir" location="${src.gen.dir}" />
   <property name="lib.dir" location="lib" />
   <property name="ext.dir" location="ext" />
   <property name="resource.dir" location="resource" />
   <property name="admin.dir" location="${resource.dir}/admin" />
   <property name="config.dir" location="${resource.dir}/config" />
   <property name="schema.dir" location="${resource.dir}/schema" />
+  <property name="msg.dir"    location="${resource.dir}/messages" />
   <property name="classes.dir" location="${build.dir}/classes" />
   <property name="javadoc.dir" location="${build.dir}/javadoc" />
   <property name="package.dir" location="${build.dir}/package" />
+  <property name="message.dir" location="${build.dir}/message" />
   <property name="jar.file" value="${pkg.name}.jar" />
 
   <!-- Location of OpenDS components - should not need changing. -->
@@ -84,7 +91,7 @@
   </target>
 
   <!-- Compile the Directory Server extension source files. -->
-  <target name="compile" depends="init,compileadmin" description="Compile the Directory Server extension source files.">
+  <target name="compile" depends="init,compileadmin,generate-messages" description="Compile the Directory Server extension source files.">
     <mkdir dir="${classes.dir}" />
     <javac srcdir="${src.dir}:${src.gen.dir}" destdir="${classes.dir}" optimize="true" excludes="**/package-info.java" debug="on" debuglevel="lines,source" source="1.5" target="1.5" deprecation="true" fork="true" memoryInitialSize="${MEM}" memoryMaximumSize="${MEM}">
       <compilerarg value="-Xlint:all" />
@@ -251,4 +258,57 @@
       <schema namespace="http://www.opends.org/admin-cli" file="${admin.dir}/admin-cli.xsd" />
     </schemavalidate>
   </target>
+
+  <!-- Generate messages from all .properties files located in the message directory and declared in a package-->
+  <target name="generate-messages" description="Generate messages for extension.">
+    <if>
+      <available file="${msg.dir}" type="dir" property="message.dir.is-present"/>
+      <then>
+        <!-- list of files properties -->
+        <path id="messages.properties">
+          <!-- Note: a package is required and properties file at the root of the
+           !         message directory will be ignored
+           ! -->
+          <fileset dir="${msg.dir}" includes="*/**/*.properties" />
+        </path>
+        <property name="msg.dir.list" refid="messages.properties" />
+
+        <!-- includes lib/*.jar into classpath (actually build-tools.jar) -->
+        <path id="msg.classpath">
+          <fileset dir="${lib.dir}">
+            <include name="*.jar" />
+          </fileset>
+        </path>
+        <property name="build-tools.jar" refid="msg.classpath" />
+
+        <typedef name="genmsg"
+                 classname="org.opends.build.tools.GenerateMessageFile"
+                 classpathref="msg.classpath">
+        </typedef>
+
+        <!-- set property if the list is not empty -->
+        <if>
+          <length string="${msg.dir.list}" when="greater" length="0" />
+          <then>
+            <!-- Generate the message catalogs for all messages located
+             !   in the messages directory
+             ! -->
+            <mkdir dir="${classes.dir}/messages" />
+            <for param="file" delimiter=":" list="${msg.dir.list}">
+              <sequential>
+                <genmsg sourceProps="@{file}" />
+                <copy file="@{file}" todir="${classes.dir}/messages"/>
+              </sequential>
+            </for>
+          </then>
+          <else>
+            <echo message="No messages found: ${message.dir} is empty" />
+          </else>
+        </if>
+      </then>
+      <else>
+        <echo message="No messages found: ${msg.dir} is missing" />
+      </else>
+    </if>
+  </target>
 </project>
diff --git a/opendj-sdk/opends/resource/admin/example-plugin/example_plugin.properties b/opendj-sdk/opends/resource/admin/example-plugin/example_plugin.properties
new file mode 100644
index 0000000..b36d4c5
--- /dev/null
+++ b/opendj-sdk/opends/resource/admin/example-plugin/example_plugin.properties
@@ -0,0 +1,53 @@
+# 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
+#
+#      Copyright 2006-2008 Sun Microsystems, Inc.
+
+
+
+#
+# Global directives
+#
+global.category=USER_DEFINED
+
+#
+# Format string definitions
+#
+# Keys must be formatted as follows:
+#
+# [SEVERITY]_[DESCRIPTION]_[ORDINAL]
+#
+# where:
+#
+# SEVERITY is one of:
+# [INFO, MILD_WARN, SEVERE_WARN, MILD_ERR, SEVERE_ERR, FATAL_ERR, DEBUG, NOTICE]
+#
+# DESCRIPTION is an upper case string providing a hint as to the context of
+# the message in upper case with the underscore ('_') character serving as
+# word separator
+#
+# ORDINAL is an integer unique among other ordinals in this file
+#
+SEVERE_ERR_INITIALIZE_PLUGIN_1="Invalid plugin type %s for the example plugin.
+NOTICE_DO_STARTUP_2=Example plugin message '%s'.
+NOTICE_APPLY_CONFIGURATION_CHANGE_3="Example plugin message has been changed \
+from '%s' to '%s'.
diff --git a/opendj-sdk/opends/resource/admin/example-plugin/example_plugin_fr.properties b/opendj-sdk/opends/resource/admin/example-plugin/example_plugin_fr.properties
new file mode 100644
index 0000000..c19e737
--- /dev/null
+++ b/opendj-sdk/opends/resource/admin/example-plugin/example_plugin_fr.properties
@@ -0,0 +1,53 @@
+# 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
+#
+#      Copyright 2006-2008 Sun Microsystems, Inc.
+
+
+
+#
+# Global directives
+#
+global.category=USER_DEFINED
+
+#
+# Format string definitions
+#
+# Keys must be formatted as follows:
+#
+# [SEVERITY]_[DESCRIPTION]_[ORDINAL]
+#
+# where:
+#
+# SEVERITY is one of:
+# [INFO, MILD_WARN, SEVERE_WARN, MILD_ERR, SEVERE_ERR, FATAL_ERR, DEBUG, NOTICE]
+#
+# DESCRIPTION is an upper case string providing a hint as to the context of
+# the message in upper case with the underscore ('_') character serving as
+# word separator
+#
+# ORDINAL is an integer unique among other ordinals in this file
+#
+SEVERE_ERR_INITIALIZE_PLUGIN_1="Type de plugin invalide %s pour le plugin d'exemple.
+NOTICE_DO_STARTUP_2=Message du plugin d'exemple '%s'.
+NOTICE_APPLY_CONFIGURATION_CHANGE_3="Le message du plugin d'exemple a été modifié \
+de '%s' en '%s'.
diff --git a/opendj-sdk/opends/src/build-tools/org/opends/build/tools/GenerateMessageFile.java b/opendj-sdk/opends/src/build-tools/org/opends/build/tools/GenerateMessageFile.java
index 4217916..dd3371e 100644
--- a/opendj-sdk/opends/src/build-tools/org/opends/build/tools/GenerateMessageFile.java
+++ b/opendj-sdk/opends/src/build-tools/org/opends/build/tools/GenerateMessageFile.java
@@ -39,7 +39,9 @@
 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;
@@ -50,6 +52,7 @@
 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;
@@ -71,8 +74,14 @@
   static private final String MESSAGES_FILE_STUB =
           "resource/Messages.java.stub";
 
-  static private final String REGISTRY_FILE_NAME =
-          "src/messages/generated/org/opends/messages/descriptors.reg";
+  /*
+   * 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.
@@ -155,6 +164,31 @@
             .toString();
   }
 
+  /*
+   * ISO_LANGUAGES contains all official supported languages for i18n
+   */
+  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());
+
+  /*
+   * 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");
 
   /**
    * Representation of a format specifier (for example %s).
@@ -450,6 +484,51 @@
    */
   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);
+
+      }
+    }
   }
 
   /**
@@ -466,6 +545,63 @@
    */
   @Override
   public void execute() throws BuildException {
+
+    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;
+      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.
+       */
+      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
+          return;
+        }
+      }
+
+      matcher = LANGUAGE_MATCHER.matcher(filename);
+      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);
+      // change to src-generated directory keeping package name
+      pathname = pathname.replace(getProject().getProperty("msg.dir"),
+                                  getProject().getProperty("msg.javagen.dir"));
+
+      // 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 == '_' ) {
+          upperCaseNextChar = true;
+          continue;
+        }
+        if ( upperCaseNextChar ) {
+          sb.append(Character.toUpperCase(c));
+          upperCaseNextChar = false;
+        } else {
+          sb.append(c);
+        }
+      }
+      sb.append("Messages.java");
+
+      setDestJava(new File(sb.toString()));
+    }
+
     BufferedReader stubReader = null;
     PrintWriter destWriter = null;
     try {
@@ -492,8 +628,8 @@
         log("Generating " + dest.getName() + " from " + source.getName());
       }
 
-      stubReader = new BufferedReader(new InputStreamReader(
-          new FileInputStream(getStubFile()), "UTF-8"));
+      stubReader = new BufferedReader(new InputStreamReader(getStubFile(),
+                                                            "UTF-8"));
       destWriter = new PrintWriter(dest, "UTF-8");
       String stubLine;
       Properties properties = new Properties();
@@ -700,16 +836,16 @@
 
   private String getBase() {
     String srcPath = unixifyPath(source.getAbsolutePath());
-    String base = srcPath.substring(srcPath.lastIndexOf("messages/"));
-    if (base.endsWith(".properties")) {
-      base = base.substring(0, base.length() - ".properties".length());
-    }
+    String base = srcPath.substring(srcPath.lastIndexOf("/") + 1,
+                                    srcPath.length() - ".properties".length());
     return base;
   }
 
   private String getPackage() {
     String destPath = unixifyPath(dest.getAbsolutePath());
-    String c = destPath.substring(destPath.indexOf("org/opends"));
+    String msgJavaGenDir = unixifyPath(
+                                   getProject().getProperty("msg.javagen.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
@@ -815,8 +951,31 @@
     return path.replace("\\", "/");
   }
 
-  private File getStubFile() {
-    return new File(getProjectBase(), MESSAGES_FILE_STUB);
+  /*
+   * Returns the stub file ("resource/Messages.java.stub") from the appropriate
+   * location: ant or jar file.
+   */
+  private InputStream getStubFile() {
+    InputStream result = null;
+
+    File stub = new File(getProjectBase(), MESSAGES_FILE_STUB);
+    if ( stub.exists() ) {
+      // this is the OpenDS's ant project calling
+      // Stub is located at OPENDS_ROOT/resource/Messages.java.stub
+      try {
+        result = new FileInputStream(stub);
+      } catch (FileNotFoundException e) {
+        // should neven 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);
+    }
+
+    return result;
   }
 
   /**
diff --git a/opendj-sdk/opends/src/messages/src/org/opends/messages/Message.java b/opendj-sdk/opends/src/messages/src/org/opends/messages/Message.java
index 309a48a..4dcfda3 100644
--- a/opendj-sdk/opends/src/messages/src/org/opends/messages/Message.java
+++ b/opendj-sdk/opends/src/messages/src/org/opends/messages/Message.java
@@ -64,7 +64,7 @@
    * Creates an uninternationalized message that will render itself
    * the same way regardless of the locale requested in
    * <code>toString(Locale)</code>.  The message will have a
-   * category of <code>Categore.USER_DEFINED</code> and a severity
+   * category of <code>Category.USER_DEFINED</code> and a severity
    * of <code>Severity.INFORMATION</code>
    *
    * Note that the types for <code>args</code> must be consistent with any

--
Gitblit v1.10.0