blob: a87f66b0f434bfd3733e5c7ec86cace4b28d95bd [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package java.text;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Locale;
/**
* Encapsulates localizable date-time formatting data, such as the names of the
* months, the names of the days of the week, and the time zone data.
* {@code DateFormat} and {@code SimpleDateFormat} both use
* {@code DateFormatSymbols} to encapsulate this information.
* <p>
* Typically you shouldn't use {@code DateFormatSymbols} directly. Rather, you
* are encouraged to create a date/time formatter with the {@code DateFormat}
* class's factory methods: {@code getTimeInstance}, {@code getDateInstance},
* or {@code getDateTimeInstance}. These methods automatically create a
* {@code DateFormatSymbols} for the formatter so that you don't have to. After
* the formatter is created, you may modify its format pattern using the
* {@code setPattern} method. For more information about creating formatters
* using {@code DateFormat}'s factory methods, see {@link DateFormat}.
* <p>
* If you decide to create a date/time formatter with a specific format pattern
* for a specific locale, you can do so with:
* <blockquote>
*
* <pre>
* new SimpleDateFormat(aPattern, new DateFormatSymbols(aLocale)).
* </pre>
*
* </blockquote>
* <p>
* {@code DateFormatSymbols} objects can be cloned. When you obtain a
* {@code DateFormatSymbols} object, feel free to modify the date/time
* formatting data. For instance, you can replace the localized date/time format
* pattern characters with the ones that you feel easy to remember or you can
* change the representative cities to your favorite ones.
* <p>
* New {@code DateFormatSymbols} subclasses may be added to support
* {@code SimpleDateFormat} for date/time formatting for additional locales.
*
* @see DateFormat
* @see SimpleDateFormat
*/
public class DateFormatSymbols implements Serializable, Cloneable {
private static final long serialVersionUID = -5987973545549424702L;
private String localPatternChars;
String[] ampms, eras, months, shortMonths, shortWeekdays, weekdays;
String[][] zoneStrings;
transient private com.ibm.icu.text.DateFormatSymbols icuSymbols;
/**
* Constructs a new {@code DateFormatSymbols} instance containing the
* symbols for the default locale.
*/
public DateFormatSymbols() {
this(Locale.getDefault());
}
/**
* Constructs a new {@code DateFormatSymbols} instance containing the
* symbols for the specified locale.
*
* @param locale
* the locale.
*/
public DateFormatSymbols(Locale locale) {
this(locale, new com.ibm.icu.text.DateFormatSymbols(locale));
}
private void writeObject(ObjectOutputStream oos) throws IOException {
if (zoneStrings == null) {
zoneStrings = icuSymbols.getZoneStrings();
}
oos.defaultWriteObject();
}
DateFormatSymbols(Locale locale,
com.ibm.icu.text.DateFormatSymbols icuSymbols) {
this.icuSymbols = icuSymbols;
localPatternChars = icuSymbols.getLocalPatternChars();
ampms = icuSymbols.getAmPmStrings();
eras = icuSymbols.getEras();
months = icuSymbols.getMonths();
shortMonths = icuSymbols.getShortMonths();
shortWeekdays = icuSymbols.getShortWeekdays();
weekdays = icuSymbols.getWeekdays();
}
@Override
public Object clone() {
if (zoneStrings == null) {
zoneStrings = icuSymbols.getZoneStrings();
}
try {
DateFormatSymbols symbols = (DateFormatSymbols) super.clone();
symbols.ampms = ampms.clone();
symbols.eras = eras.clone();
symbols.months = months.clone();
symbols.shortMonths = shortMonths.clone();
symbols.shortWeekdays = shortWeekdays.clone();
symbols.weekdays = weekdays.clone();
symbols.zoneStrings = new String[zoneStrings.length][];
for (int i = 0; i < zoneStrings.length; i++) {
symbols.zoneStrings[i] = zoneStrings[i].clone();
}
return symbols;
} catch (CloneNotSupportedException e) {
return null;
}
}
/**
* Compares this object with the specified object and indicates if they are
* equal.
*
* @param object
* the object to compare with this object.
* @return {@code true} if {@code object} is an instance of
* {@code DateFormatSymbols} and has the same symbols as this
* object, {@code false} otherwise.
* @see #hashCode
*/
@Override
public boolean equals(Object object) {
if (this == object) {
return true;
}
if (!(object instanceof DateFormatSymbols)) {
return false;
}
if (zoneStrings == null) {
zoneStrings = icuSymbols.getZoneStrings();
}
DateFormatSymbols obj = (DateFormatSymbols) object;
if (obj.zoneStrings == null) {
obj.zoneStrings = obj.icuSymbols.getZoneStrings();
}
if (!localPatternChars.equals(obj.localPatternChars)) {
return false;
}
if (!Arrays.equals(ampms, obj.ampms)) {
return false;
}
if (!Arrays.equals(eras, obj.eras)) {
return false;
}
if (!Arrays.equals(months, obj.months)) {
return false;
}
if (!Arrays.equals(shortMonths, obj.shortMonths)) {
return false;
}
if (!Arrays.equals(shortWeekdays, obj.shortWeekdays)) {
return false;
}
if (!Arrays.equals(weekdays, obj.weekdays)) {
return false;
}
if (zoneStrings.length != obj.zoneStrings.length) {
return false;
}
for (String[] element : zoneStrings) {
if (element.length != element.length) {
return false;
}
for (int j = 0; j < element.length; j++) {
if (element[j] != element[j]
&& !(element[j].equals(element[j]))) {
return false;
}
}
}
return true;
}
/**
* Returns the array of strings which represent AM and PM. Use the
* {@link java.util.Calendar} constants {@code Calendar.AM} and
* {@code Calendar.PM} as indices for the array.
*
* @return an array of strings.
*/
public String[] getAmPmStrings() {
return ampms.clone();
}
/**
* Returns the array of strings which represent BC and AD. Use the
* {@link java.util.Calendar} constants {@code GregorianCalendar.BC} and
* {@code GregorianCalendar.AD} as indices for the array.
*
* @return an array of strings.
*/
public String[] getEras() {
return eras.clone();
}
/**
* Returns the pattern characters used by {@link SimpleDateFormat} to
* specify date and time fields.
*
* @return a string containing the pattern characters.
*/
public String getLocalPatternChars() {
return localPatternChars;
}
/**
* Returns the array of strings containing the full names of the months. Use
* the {@link java.util.Calendar} constants {@code Calendar.JANUARY} etc. as
* indices for the array.
*
* @return an array of strings.
*/
public String[] getMonths() {
return months.clone();
}
/**
* Returns the array of strings containing the abbreviated names of the
* months. Use the {@link java.util.Calendar} constants
* {@code Calendar.JANUARY} etc. as indices for the array.
*
* @return an array of strings.
*/
public String[] getShortMonths() {
return shortMonths.clone();
}
/**
* Returns the array of strings containing the abbreviated names of the days
* of the week. Use the {@link java.util.Calendar} constants
* {@code Calendar.SUNDAY} etc. as indices for the array.
*
* @return an array of strings.
*/
public String[] getShortWeekdays() {
return shortWeekdays.clone();
}
/**
* Returns the array of strings containing the full names of the days of the
* week. Use the {@link java.util.Calendar} constants
* {@code Calendar.SUNDAY} etc. as indices for the array.
*
* @return an array of strings.
*/
public String[] getWeekdays() {
return weekdays.clone();
}
/**
* Returns the two-dimensional array of strings containing the names of the
* time zones. Each element in the array is an array of five strings, the
* first is a TimeZone ID, the second and third are the full and abbreviated
* time zone names for standard time, and the fourth and fifth are the full
* and abbreviated names for daylight time.
*
* @return a two-dimensional array of strings.
*/
public String[][] getZoneStrings() {
if (zoneStrings == null) {
zoneStrings = icuSymbols.getZoneStrings();
}
String[][] clone = new String[zoneStrings.length][];
for (int i = zoneStrings.length; --i >= 0;) {
clone[i] = zoneStrings[i].clone();
}
return clone;
}
@Override
public int hashCode() {
if (zoneStrings == null) {
zoneStrings = icuSymbols.getZoneStrings();
}
int hashCode;
hashCode = localPatternChars.hashCode();
for (String element : ampms) {
hashCode += element.hashCode();
}
for (String element : eras) {
hashCode += element.hashCode();
}
for (String element : months) {
hashCode += element.hashCode();
}
for (String element : shortMonths) {
hashCode += element.hashCode();
}
for (String element : shortWeekdays) {
hashCode += element.hashCode();
}
for (String element : weekdays) {
hashCode += element.hashCode();
}
for (String[] element : zoneStrings) {
for (int j = 0; j < element.length; j++) {
if (element[j] != null) {
hashCode += element[j].hashCode();
}
}
}
return hashCode;
}
/**
* Sets the array of strings which represent AM and PM. Use the
* {@link java.util.Calendar} constants {@code Calendar.AM} and
* {@code Calendar.PM} as indices for the array.
*
* @param data
* the array of strings for AM and PM.
*/
public void setAmPmStrings(String[] data) {
ampms = data.clone();
}
/**
* Sets the array of Strings which represent BC and AD. Use the
* {@link java.util.Calendar} constants {@code GregorianCalendar.BC} and
* {@code GregorianCalendar.AD} as indices for the array.
*
* @param data
* the array of strings for BC and AD.
*/
public void setEras(String[] data) {
eras = data.clone();
}
/**
* Sets the pattern characters used by {@link SimpleDateFormat} to specify
* date and time fields.
*
* @param data
* the string containing the pattern characters.
* @throws NullPointerException
* if {@code data} is null
*/
public void setLocalPatternChars(String data) {
if (data == null) {
throw new NullPointerException();
}
localPatternChars = data;
}
/**
* Sets the array of strings containing the full names of the months. Use
* the {@link java.util.Calendar} constants {@code Calendar.JANUARY} etc. as
* indices for the array.
*
* @param data
* the array of strings.
*/
public void setMonths(String[] data) {
months = data.clone();
}
/**
* Sets the array of strings containing the abbreviated names of the months.
* Use the {@link java.util.Calendar} constants {@code Calendar.JANUARY}
* etc. as indices for the array.
*
* @param data
* the array of strings.
*/
public void setShortMonths(String[] data) {
shortMonths = data.clone();
}
/**
* Sets the array of strings containing the abbreviated names of the days of
* the week. Use the {@link java.util.Calendar} constants
* {@code Calendar.SUNDAY} etc. as indices for the array.
*
* @param data
* the array of strings.
*/
public void setShortWeekdays(String[] data) {
shortWeekdays = data.clone();
}
/**
* Sets the array of strings containing the full names of the days of the
* week. Use the {@link java.util.Calendar} constants
* {@code Calendar.SUNDAY} etc. as indices for the array.
*
* @param data
* the array of strings.
*/
public void setWeekdays(String[] data) {
weekdays = data.clone();
}
/**
* Sets the two-dimensional array of strings containing the names of the
* time zones. Each element in the array is an array of five strings, the
* first is a TimeZone ID, and second and third are the full and abbreviated
* time zone names for standard time, and the fourth and fifth are the full
* and abbreviated names for daylight time.
*
* @param data
* the two-dimensional array of strings.
*/
public void setZoneStrings(String[][] data) {
zoneStrings = data.clone();
}
}