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.