From 3da3689e0ed13c19dd80d3a382bb18a7da702d19 Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Wed, 02 Apr 2008 09:08:17 +0000
Subject: [PATCH] Workaround for 3077 (Investigate possible issues with message formatting in AIX) 

---
 opends/src/messages/src/org/opends/messages/Message.java |   68 +++++++++++++++++++++++++++++++++
 1 files changed, 67 insertions(+), 1 deletions(-)

diff --git a/opends/src/messages/src/org/opends/messages/Message.java b/opends/src/messages/src/org/opends/messages/Message.java
index 4824cdb..309a48a 100644
--- a/opends/src/messages/src/org/opends/messages/Message.java
+++ b/opends/src/messages/src/org/opends/messages/Message.java
@@ -56,6 +56,10 @@
   /** Represents an empty message string. */
   public static final Message EMPTY = Message.raw("");
 
+  // Variable used to workaround a bug in AIX Java 1.6
+  // TODO: remove this code once the JDK issue referenced in 3077 is closed.
+  private final boolean isAIXPost5 = isAIXPost5();
+
   /**
    * Creates an uninternationalized message that will render itself
    * the same way regardless of the locale requested in
@@ -180,7 +184,46 @@
     String fmt = descriptor.getFormatString(locale);
     if (descriptor.requiresFormatter()) {
       try {
-        s = new Formatter(locale).format(locale, fmt, args).toString();
+        // TODO: remove this code once the JDK issue referenced in 3077 is
+        // closed.
+        if (isAIXPost5)
+        {
+          // Java 6 in AIX Formatter does not handle properly Formattable
+          // arguments; this code is a workaround for the problem.
+          boolean changeType = false;
+          for (Object o : args)
+          {
+            if (o instanceof Formattable)
+            {
+              changeType = true;
+              break;
+            }
+          }
+          if (changeType)
+          {
+            Object[] newArgs = new Object[args.length];
+            for (int i=0; i<args.length; i++)
+            {
+              if (args[i] instanceof Formattable)
+              {
+                newArgs[i] = args[i].toString();
+              }
+              else
+              {
+                newArgs[i] = args[i];
+              }
+            }
+            s = new Formatter(locale).format(locale, fmt, newArgs).toString();
+          }
+          else
+          {
+            s = new Formatter(locale).format(locale, fmt, args).toString();
+          }
+        }
+        else
+        {
+          s = new Formatter(locale).format(locale, fmt, args).toString();
+        }
       } catch (IllegalFormatException e) {
         // This should not happend with any of our internal messages.
         // However, this may happen for raw messages that have a
@@ -431,4 +474,27 @@
     return result;
   }
 
+
+  // TODO: remove this code once the JDK issue referenced in 3077 is closed.
+  /**
+   * Returns whether we are running post 1.5 on AIX or not.
+   * @return <CODE>true</CODE> if we are running post 1.5 on AIX and
+   * <CODE>false</CODE> otherwise.
+   */
+  private boolean isAIXPost5()
+  {
+    boolean isJDK15 = false;
+    try
+    {
+      String javaRelease = System.getProperty ("java.version");
+      isJDK15 = javaRelease.startsWith("1.5");
+    }
+    catch (Throwable t)
+    {
+      System.err.println("Cannot get the java version: " + t);
+    }
+    boolean isAIX = "aix".equalsIgnoreCase(System.getProperty("os.name"));
+    return !isJDK15 && isAIX;
+  }
+
 }

--
Gitblit v1.10.0