OSDN Git Service

2007-04-04 Tania Bento <tbento@redhat.com>
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 5 Apr 2007 00:15:16 +0000 (00:15 +0000)
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 5 Apr 2007 00:15:16 +0000 (00:15 +0000)
* java/text/DecimalFormatSymbols.java: Added the year 2007 to
Copyright information and introduced new variable, currency.
(DecimalFormatSymbols(Locale)): Define currency and intlCurrencySymbol
to "XXX", currencySymbol to "?" and localCurrency appropriately.
(getCurrency): Fixed documentation and return the value of currency.
(setCurrency): Fixed documentation and update the value of currency.
(setInternationalCurrencySymbol): Fixed documentation and update the
value of currency.
* java/util/Currency.java: Introduced two new variables, properties
and fractionDigits. In the static block, a properties object is
created and the currency resource is loaded.
(Currency(Locale)): fractionDigits is defined.
(Currency(String)): New method.
(getDefaultFractionDigits): Return the value of fractionDigits.
(getInstance(String)): Check if String is equal to "XXX".

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@123512 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/classpath/lib/java/text/DecimalFormatSymbols.class
libjava/classpath/lib/java/util/Currency.class
libjava/gnu/java/net/PlainSocketImpl.h
libjava/gnu/java/util/jar/JarUtils.h
libjava/java/lang/VMCompiler.h
libjava/java/text/DecimalFormatSymbols.h
libjava/java/text/DecimalFormatSymbols.java
libjava/java/util/Currency.h
libjava/java/util/Currency.java

index 3d0b9ec..ec79a05 100644 (file)
@@ -1,3 +1,21 @@
+2007-04-04  Tania Bento  <tbento@redhat.com>
+
+       * java/text/DecimalFormatSymbols.java: Added the year 2007 to
+       Copyright information and introduced new variable, currency.
+       (DecimalFormatSymbols(Locale)): Define currency and intlCurrencySymbol
+       to "XXX", currencySymbol to "?" and localCurrency appropriately.
+       (getCurrency): Fixed documentation and return the value of currency.
+       (setCurrency): Fixed documentation and update the value of currency.
+       (setInternationalCurrencySymbol): Fixed documentation and update the
+       value of currency.
+       * java/util/Currency.java: Introduced two new variables, properties
+       and fractionDigits. In the static block, a properties object is
+       created and the currency resource is loaded.
+       (Currency(Locale)): fractionDigits is defined.
+       (Currency(String)): New method.
+       (getDefaultFractionDigits): Return the value of fractionDigits.
+       (getInstance(String)): Check if String is equal to "XXX".
+
 2007-04-04  Kyle Galloway  <kgallowa@redhat.com>
 
        * classpath/gnu/classpath/jdwp/util/VariableTable.java: Change longs
index a88226f..253b14e 100644 (file)
Binary files a/libjava/classpath/lib/java/text/DecimalFormatSymbols.class and b/libjava/classpath/lib/java/text/DecimalFormatSymbols.class differ
index 147415c..b2ca131 100644 (file)
Binary files a/libjava/classpath/lib/java/util/Currency.class and b/libjava/classpath/lib/java/util/Currency.class differ
index 7872ac2..d907871 100644 (file)
@@ -46,8 +46,8 @@ public:
   ::java::lang::Object * getOption(jint);
   void shutdownInput();
   void shutdownOutput();
-public: // actually protected
   void create(jboolean);
+public: // actually protected
   void connect(::java::lang::String *, jint);
   void connect(::java::net::InetAddress *, jint);
   void connect(::java::net::SocketAddress *, jint);
index 4704582..1d12845 100644 (file)
@@ -50,7 +50,6 @@ private:
   static void writeVersionInfo(::java::util::jar::Attributes *, ::java::io::OutputStream *);
   static void writeAttributeEntry(::java::util::Map$Entry *, ::java::io::OutputStream *);
   static void writeHeader(::java::lang::String *, ::java::lang::String *, ::java::io::OutputStream *);
-  static ::java::util::logging::Logger * log;
 public:
   static ::java::lang::String * META_INF;
   static ::java::lang::String * DSA_SUFFIX;
index 9034bd3..e81f694 100644 (file)
@@ -41,7 +41,6 @@ public:
 private:
   VMCompiler();
   static ::java::lang::Class * loadSharedLibrary(::java::lang::ClassLoader *, ::java::lang::String *, ::java::security::ProtectionDomain *, ::java::lang::String *);
-  static ::java::lang::String * bytesToString(JArray< jbyte > *);
 public:
   static ::java::lang::Class * compileClass(::java::lang::ClassLoader *, ::java::lang::String *, JArray< jbyte > *, jint, jint, ::java::security::ProtectionDomain *);
   static jboolean compileClass(::java::lang::Class *);
index 96bd286..b38140c 100644 (file)
@@ -83,6 +83,7 @@ private:
   jint serialVersionOnStream;
   jchar zeroDigit;
   ::java::util::Locale * locale;
+  ::java::util::Currency * currency;
   static const jlong serialVersionUID = 5772796243397350300LL;
 public:
   static ::java::lang::Class class$;
index c58530f..110e45f 100644 (file)
@@ -1,5 +1,5 @@
 /* DecimalFormatSymbols.java -- Format symbols used by DecimalFormat
-   Copyright (C) 1999, 2000, 2001, 2004 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2000, 2001, 2004, 2007 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -121,8 +121,19 @@ public final class DecimalFormatSymbols implements Cloneable, Serializable
   /**
    * This method initializes a new instance of
    * <code>DecimalFormatSymbols</code> for the specified locale.
+   * <strong>Note</strong>: if the locale does not have an associated
+   * <code>Currency</code> instance, the currency symbol and
+   * international currency symbol will be set to the strings "?"
+   * and "XXX" respectively.  This generally happens with language
+   * locales (those with no specified country), such as
+   * <code>Locale.ENGLISH</code>.  This constructor only obtains
+   * instances using the runtime's resources; to also include
+   * {@link java.text.spi.DecimalFormatSymbolsProvider} instances,
+   * call {@link #getInstance(java.util.Locale)} instead.
    *
    * @param loc The local to load symbols for.
+   * @throws NullPointerException if the locale is null.
+   * @see #getInstance(java.util.Locale)
    */
   public DecimalFormatSymbols (Locale loc)
   {
@@ -136,14 +147,26 @@ public final class DecimalFormatSymbols implements Cloneable, Serializable
       {
        res = null;
       }
-    currencySymbol = safeGetString (res, "currencySymbol", "$");
+    currency = Currency.getInstance("XXX");
+    currencySymbol = "?";
+    intlCurrencySymbol = "XXX";
+    try
+      {
+       Currency localeCurrency = Currency.getInstance(loc);
+       if (localeCurrency != null)
+         {
+           setCurrency(localeCurrency);
+         }
+      }
+    catch(IllegalArgumentException exception)
+      {
+       /* Locale has an invalid currency */
+      }
     decimalSeparator = safeGetChar (res, "decimalSeparator", '.');
     digit = safeGetChar (res, "digit", '#');
     exponential = safeGetChar (res, "exponential", 'E');
     groupingSeparator = safeGetChar (res, "groupingSeparator", ',');
     infinity = safeGetString (res, "infinity", "\u221e");
-    // FIXME: default?
-    intlCurrencySymbol = safeGetString (res, "intlCurrencySymbol", "$");
     try
       {
        monetarySeparator = safeGetChar (res, "monetarySeparator", '.');
@@ -200,12 +223,13 @@ public final class DecimalFormatSymbols implements Cloneable, Serializable
    * Returns the currency corresponding to the currency symbol stored
    * in the instance of <code>DecimalFormatSymbols</code>.
    *
-   * @return A new instance of <code>Currency</code> if
-   * the currency code matches a known one.
+   * @return An instance of <code>Currency</code> which matches
+   *         the currency used, or null if there is no corresponding
+   *         instance.
    */
   public Currency getCurrency ()
   {
-    return Currency.getInstance (currencySymbol);
+    return currency;
   }
 
   /**
@@ -368,13 +392,16 @@ public final class DecimalFormatSymbols implements Cloneable, Serializable
   }
 
   /**
-   * This method sets the currency to the specified value.
+   * This method sets the currency symbol and ISO 4217 currency
+   * code to the values obtained from the supplied currency.
    *
-   * @param currency The new currency
+   * @param currency the currency from which to obtain the values.
+   * @throws NullPointerException if the currency is null.
    */
   public void setCurrency (Currency currency)
   {
     setCurrencySymbol (currency.getSymbol());
+    this.currency = currency;
   }
 
   /**
@@ -435,14 +462,31 @@ public final class DecimalFormatSymbols implements Cloneable, Serializable
   }
 
   /**
-   * This method sets the international currency symbols to the
-   * specified value. 
+   * This method sets the international currency symbol to the
+   * specified value. If a valid <code>Currency</code> instance
+   * exists for the international currency code, then this is
+   * used for the currency attribute, and the currency symbol
+   * is set to the corresponding value from this instance.
+   * Otherwise, the currency attribute is set to null and the
+   * symbol is left unmodified. 
    *
-   * @param intlCurrencySymbol The new international currency symbol.
+   * @param currencyCode The new international currency symbol.
    */
-  public void setInternationalCurrencySymbol (String currency)
+  public void setInternationalCurrencySymbol (String currencyCode)
   {
-    intlCurrencySymbol = currency;
+    intlCurrencySymbol = currencyCode;
+    try
+      {
+       currency = Currency.getInstance(currencyCode);
+      }
+    catch (IllegalArgumentException exception)
+      {
+       currency = null;
+      }
+    if (currency != null)
+      {
+        setCurrencySymbol(currency.getSymbol(locale));
+      }
   }
 
   /**
@@ -593,7 +637,17 @@ public final class DecimalFormatSymbols implements Cloneable, Serializable
    * @serial The locale of these currency symbols.
    */
   private Locale locale;
+
+  /**
+   * The currency used for the symbols in this instance.
+   * This is stored temporarily for efficiency reasons,
+   * as well as to ensure that the correct instance
+   * is restored from the currency code.
+   *
+   * @serial Ignored.
+   */
+  private transient Currency currency;
+
   private static final long serialVersionUID = 5772796243397350300L;
 
   private void readObject(ObjectInputStream stream)
index c868cef..ac8878c 100644 (file)
@@ -13,6 +13,7 @@ class java::util::Currency : public ::java::lang::Object
 
   Currency();
   Currency(::java::util::Locale *);
+  Currency(::java::lang::String *);
 public:
   ::java::lang::String * getCurrencyCode();
   jint getDefaultFractionDigits();
@@ -28,7 +29,9 @@ public: // actually package-private
 private:
   ::java::util::Locale * __attribute__((aligned(__alignof__( ::java::lang::Object)))) locale;
   ::java::util::ResourceBundle * res;
+  static ::java::util::Properties * properties;
   ::java::lang::String * currencyCode;
+  jint fractionDigits;
   static ::java::util::Map * cache;
 public:
   static ::java::lang::Class class$;
index e1a28e0..66888fa 100644 (file)
@@ -37,6 +37,7 @@ exception statement from your version. */
 
 package java.util;
 
+import java.io.IOException;
 import java.io.ObjectStreamException;
 import java.io.Serializable;
 import java.text.NumberFormat;
@@ -83,6 +84,16 @@ public final class Currency
   private transient ResourceBundle res;
 
   /**
+   * The set of properties which map a currency to
+   * the currency information such as the ISO 4217
+   * currency code and the number of decimal points.
+   *
+   * @see #getCurrencyCode()
+   * @serial ignored.
+   */
+  private static transient Properties properties;
+
+  /**
    * The ISO 4217 currency code associated with this
    * particular instance.
    *
@@ -92,6 +103,15 @@ public final class Currency
   private String currencyCode;
 
   /**
+   * The number of fraction digits associated with this
+   * particular instance.
+   *
+   * @see #getDefaultFractionDigits()
+   * @serial the number of fraction digits
+   */
+  private transient int fractionDigits;
+
+  /**
    * A cache of <code>Currency</code> instances to
    * ensure the singleton nature of this class.  The key
    * is the locale of the currency.
@@ -108,6 +128,17 @@ public final class Currency
   static
   {
     cache = new HashMap();
+    /* Create the properties object */
+    properties = new Properties();
+    /* Try and load the properties from our iso4217.properties resource */
+    try 
+      {
+        properties.load(Currency.class.getResourceAsStream("iso4217.properties"));
+      }
+    catch (IOException exception)
+      {
+        System.out.println("Failed to load currency resource: " + exception);
+      }
   }
 
   /**
@@ -130,9 +161,24 @@ public final class Currency
    */
   private Currency (Locale loc)
   {
+    String countryCode;
+    String fractionDigitsKey;  
+    /* Retrieve the country code from the locale */
+    countryCode = loc.getCountry();
+
+    /* If there is no country code, return */
+    if (countryCode.equals(""))
+      {
+        throw new
+         IllegalArgumentException("Invalid (empty) country code for locale:"
+                                  + loc);
+      }
+
     this.locale = loc;
     this.res = ResourceBundle.getBundle ("gnu.java.locale.LocaleInformation", 
       locale, ClassLoader.getSystemClassLoader());
+
     /* Retrieve the ISO4217 currency code */
     try
       {
@@ -142,6 +188,25 @@ public final class Currency
       {
        currencyCode = null;
       }
+
+    /* Construct the key for the fraction digits */
+    fractionDigitsKey = countryCode + ".fractionDigits";
+
+    /* Retrieve the fraction digits */
+    fractionDigits = Integer.parseInt(properties.getProperty(fractionDigitsKey));
+  }
+
+  /**
+   * Constructor for the "XXX" special case.  This allows
+   * a Currency to be constructed from an assumed good
+   * currency code.
+   *
+   * @param code the code to use.
+   */  
+  private Currency(String code)
+  {
+    currencyCode = code;
+    fractionDigits = -1; /* Pseudo currency */
   }
 
   /**
@@ -168,9 +233,7 @@ public final class Currency
    */   
   public int getDefaultFractionDigits ()
   {
-    NumberFormat currency = NumberFormat.getCurrencyInstance (locale);
-    
-    return currency.getMaximumFractionDigits();
+    return fractionDigits;
   }
     
   /**
@@ -226,6 +289,10 @@ public final class Currency
   {
     Locale[] allLocales = Locale.getAvailableLocales ();
     
+    /* Nasty special case to allow an erroneous currency... blame Sun */
+    if (currencyCode.equals("XXX"))
+      return new Currency("XXX");
+
     for (int i = 0;i < allLocales.length; i++)
       {
        Currency testCurrency = getInstance (allLocales[i]);