src/share/classes/sun/util/BuddhistCalendar.java

Print this page
rev 5696 : 6336885: RFE: Locale Data Deployment Enhancements
4609153: Provide locale data for Indic locales
5104387: Support for gl_ES locale (galician language)
6337471: desktop/system locale preferences support
7056139: (cal) SPI support for locale-dependent Calendar parameters
7058206: Provide CalendarData SPI for week params and display field value names
7073852: Support multiple scripts for digits and decimal symbols per locale
7079560: [Fmt-Da] Context dependent month names support in SimpleDateFormat
7171324: getAvailableLocales() of locale sensitive services should return the actual availability of locales
7151414: (cal) Support calendar type identification
7168528: LocaleServiceProvider needs to be aware of Locale extensions
7171372: (cal) locale's default Calendar should be created if unknown calendar is specified
Summary: JEP 127: Improve Locale Data Packaging and Adopt Unicode CLDR Data (part 1 w/o packaging changes. by Naoto Sato and Masayoshi Okutsu)

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -25,18 +25,15 @@
 
 package sun.util;
 
 import java.io.IOException;
 import java.io.ObjectInputStream;
-import java.util.Calendar;
 import java.util.GregorianCalendar;
-import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
-import java.util.ResourceBundle;
 import java.util.TimeZone;
-import sun.util.resources.LocaleData;
+import sun.util.locale.provider.CalendarDataUtility;
 
 public class BuddhistCalendar extends GregorianCalendar {
 
 //////////////////
 // Class Variables

@@ -89,32 +86,43 @@
 /////////////////
 // Public methods
 /////////////////
 
     /**
+     * Returns {@code "buddhist"} as the calendar type of this Calendar.
+     */
+    @Override
+    public String getCalendarType() {
+        return "buddhist";
+    }
+
+    /**
      * Compares this BuddhistCalendar to an object reference.
      * @param obj the object reference with which to compare
      * @return true if this object is equal to <code>obj</code>; false otherwise
      */
+    @Override
     public boolean equals(Object obj) {
         return obj instanceof BuddhistCalendar
             && super.equals(obj);
     }
 
     /**
      * Override hashCode.
      * Generates the hash code for the BuddhistCalendar object
      */
+    @Override
     public int hashCode() {
         return super.hashCode() ^ BUDDHIST_YEAR_OFFSET;
     }
 
     /**
      * Gets the value for a given time field.
      * @param field the given time field.
      * @return the value for the given time field.
      */
+    @Override
     public int get(int field)
     {
         if (field == YEAR) {
             return super.get(field) + yearOffset;
         }

@@ -124,10 +132,11 @@
     /**
      * Sets the time field with the given value.
      * @param field the given time field.
      * @param value the value to be set for the given time field.
      */
+    @Override
     public void set(int field, int value)
     {
         if (field == YEAR) {
             super.set(field, value - yearOffset);
         } else {

@@ -138,10 +147,11 @@
     /**
      * Adds the specified (signed) amount of time to the given time field.
      * @param field the time field.
      * @param amount the amount of date or time to be added to the field.
      */
+    @Override
     public void add(int field, int amount)
     {
         int savedYearOffset = yearOffset;
         // To let the superclass calculate date-time values correctly,
         // temporarily make this GregorianCalendar.

@@ -158,10 +168,11 @@
      * A negative roll amount means to subtract from field without changing
      * larger fields.
      * @param field the time field.
      * @param amount the signed amount to add to <code>field</code>.
      */
+    @Override
     public void roll(int field, int amount)
     {
         int savedYearOffset = yearOffset;
         // To let the superclass calculate date-time values correctly,
         // temporarily make this GregorianCalendar.

@@ -171,87 +182,37 @@
         } finally {
             yearOffset = savedYearOffset;
         }
     }
 
+    @Override
     public String getDisplayName(int field, int style, Locale locale) {
         if (field != ERA) {
             return super.getDisplayName(field, style, locale);
         }
 
-        // Handle Thai BuddhistCalendar specific era names
-        if (field < 0 || field >= fields.length ||
-            style < SHORT || style > LONG) {
-            throw new IllegalArgumentException();
+        return CalendarDataUtility.retrieveFieldValueName("buddhist", field, get(field), style, locale);
         }
-        if (locale == null) {
-            throw new NullPointerException();
-        }
-        ResourceBundle rb = LocaleData.getDateFormatData(locale);
-        String[] eras = rb.getStringArray(getKey(style));
-        return eras[get(field)];
-    }
 
+    @Override
     public Map<String,Integer> getDisplayNames(int field, int style, Locale locale) {
         if (field != ERA) {
             return super.getDisplayNames(field, style, locale);
         }
-
-        // Handle Thai BuddhistCalendar specific era names
-        if (field < 0 || field >= fields.length ||
-            style < ALL_STYLES || style > LONG) {
-            throw new IllegalArgumentException();
+        return CalendarDataUtility.retrieveFieldValueNames("buddhist", field, style, locale);
         }
-        if (locale == null) {
-            throw new NullPointerException();
-        }
-        // ALL_STYLES
-        if (style == ALL_STYLES) {
-            Map<String,Integer> shortNames = getDisplayNamesImpl(field, SHORT, locale);
-            Map<String,Integer> longNames = getDisplayNamesImpl(field, LONG, locale);
-            if (shortNames == null) {
-                return longNames;
-            }
-            if (longNames != null) {
-                shortNames.putAll(longNames);
-            }
-            return shortNames;
-        }
 
-        // SHORT or LONG
-        return getDisplayNamesImpl(field, style, locale);
-    }
-
-    private Map<String,Integer> getDisplayNamesImpl(int field, int style, Locale locale) {
-        ResourceBundle rb = LocaleData.getDateFormatData(locale);
-        String[] eras = rb.getStringArray(getKey(style));
-        Map<String,Integer> map = new HashMap<String,Integer>(4);
-        for (int i = 0; i < eras.length; i++) {
-            map.put(eras[i], i);
-        }
-        return map;
-    }
-
-    private String getKey(int style) {
-        StringBuilder key = new StringBuilder();
-        key.append(BuddhistCalendar.class.getName());
-        if (style == SHORT) {
-            key.append(".short");
-        }
-        key.append(".Eras");
-        return key.toString();
-    }
-
     /**
      * Returns the maximum value that this field could have, given the
      * current date.  For example, with the date "Feb 3, 2540" and the
      * <code>DAY_OF_MONTH</code> field, the actual maximum is 28; for
      * "Feb 3, 2539" it is 29.
      *
      * @param field the field to determine the maximum of
      * @return the maximum of the given field for the current date of this Calendar
      */
+    @Override
     public int getActualMaximum(int field) {
         int savedYearOffset = yearOffset;
         // To let the superclass calculate date-time values correctly,
         // temporarily make this GregorianCalendar.
         yearOffset = 0;

@@ -260,10 +221,12 @@
         } finally {
             yearOffset = savedYearOffset;
         }
     }
 
+    @Override
+    @SuppressWarnings("empty-statement")
     public String toString() {
         // The super class produces a String with the Gregorian year
         // value (or '?')
         String s = super.toString();
         // If the YEAR field is UNSET, then return the Gregorian string.