OSDN Git Service

* java/text/SimpleDateFormat.java: Re-merged with Classpath.
[pf3gnuchains/gcc-fork.git] / libjava / java / text / DateFormatSymbols.java
1 /* Copyright (C) 1998, 1999, 2000, 2001  Free Software Foundation
2
3    This file is part of libgcj.
4
5 This software is copyrighted work licensed under the terms of the
6 Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
7 details.  */
8
9 package java.text;
10
11 import java.util.Locale;
12 import java.util.MissingResourceException;
13 import java.util.ResourceBundle;
14
15 /**
16  * This class acts as container for locale specific date/time formatting
17  * information such as the days of the week and the months of the year.
18  * @author Per Bothner <bothner@cygnus.com>
19  * @date October 24, 1998.
20  */
21 /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3.
22  * Status:  Believed complete and correct.
23  */
24 public class DateFormatSymbols implements java.io.Serializable, Cloneable
25 {
26   String[] ampms;
27   String[] eras;
28   private String localPatternChars;
29   String[] months;
30   String[] shortMonths;
31   String[] shortWeekdays;
32   String[] weekdays;
33   private String[][] zoneStrings;
34
35   private static final long serialVersionUID = -5987973545549424702L;
36
37   // The order of these prefixes must be the same as in DateFormat
38   private static final String[] formatPrefixes =
39   {
40     "full", "long", "medium", "short"
41   };
42
43   // These are each arrays with a value for SHORT, MEDIUM, LONG, FULL,
44   // and DEFAULT (constants defined in java.text.DateFormat).  While
45   // not part of the official spec, we need a way to get at locale-specific
46   // default formatting patterns.  They are declared package scope so
47   // as to be easily accessible where needed (DateFormat, SimpleDateFormat).
48   transient String[] dateFormats;
49   transient String[] timeFormats;
50
51   private String[] formatsForKey(ResourceBundle res, String key) 
52   {
53     String[] values = new String [formatPrefixes.length];
54     for (int i = 0; i < formatPrefixes.length; i++)
55       {
56         values[i] = res.getString(formatPrefixes[i]+key);
57       }
58     return values;
59   }
60
61   /**
62    * This method initializes a new instance of <code>DateFormatSymbols</code>
63    * by loading the date format information for the specified locale.
64    *
65    * @param locale The locale for which date formatting symbols should
66    *               be loaded. 
67    */
68   public DateFormatSymbols (Locale locale) throws MissingResourceException
69   {
70     ResourceBundle res
71       = ResourceBundle.getBundle("gnu.java.locale.LocaleInformation", locale);
72
73     ampms = res.getStringArray ("ampms");
74     eras = res.getStringArray ("eras");
75     localPatternChars = res.getString ("localPatternChars");
76     months = res.getStringArray ("months");
77     shortMonths = res.getStringArray ("shortMonths");
78     shortWeekdays = res.getStringArray ("shortWeekdays");
79     weekdays = res.getStringArray ("weekdays");
80     zoneStrings = (String[][]) res.getObject ("zoneStrings");
81
82     dateFormats = formatsForKey(res, "DateFormat");
83     timeFormats = formatsForKey(res, "TimeFormat");
84   }
85
86   /**
87    * This method loads the format symbol information for the default
88    * locale.
89    */
90   public DateFormatSymbols () throws MissingResourceException
91   {
92     this (Locale.getDefault());
93   }
94
95   /**
96    * This method returns the list of strings used for displaying AM or PM.
97    * This is a two element <code>String</code> array indexed by
98    * <code>Calendar.AM</code> and <code>Calendar.PM</code>
99    *
100    * @return The list of AM/PM display strings.
101    */
102   public String[] getAmPmStrings()
103   {
104     return ampms;
105   }
106
107   /**
108     * This method returns the list of strings used for displaying eras
109     * (e.g., "BC" and "AD").  This is a two element <code>String</code>
110     * array indexed by <code>Calendar.BC</code> and <code>Calendar.AD</code>.
111     *
112     * @return The list of era disply strings.
113     */
114   public String[] getEras()
115   {
116     return eras;
117   }
118
119   /**
120     * This method returns the pattern character information for this
121     * object.  This is an 18 character string that contains the characters
122     * that are used in creating the date formatting strings in 
123     * <code>SimpleDateFormat</code>.   The following are the character
124     * positions in the string and which format character they correspond
125     * to (the character in parentheses is the default value in the US English
126     * locale):
127     * <p>
128     * <ul>
129     * <li>0 - era (G)
130     * <li>1 - year (y)
131     * <li>2 - month (M)
132     * <li 3 - day of month (d)
133     * <li>4 - hour out of 12, from 1-12 (h)
134     * <li>5 - hour out of 24, from 0-23 (H)
135     * <li>6 - minute (m)
136     * <li>7 - second (s)
137     * <li>8 - millisecond (S)
138     * <li>9 - date of week (E)
139     * <li>10 - date of year (D)
140     * <li>11 - day of week in month, eg. "4th Thur in Nov" (F)
141     * <li>12 - week in year (w)
142     * <li>13 - week in month (W)
143     * <li>14 - am/pm (a)
144     * <li>15 - hour out of 24, from 1-24 (k)
145     * <li>16 - hour out of 12, from 0-11 (K)
146     * <li>17 - time zone (z)
147     * </ul>
148     *
149     * @return The format patter characters
150     */
151   public String getLocalPatternChars()
152   {
153     return localPatternChars;
154   }
155
156   /**
157    * This method returns the list of strings used for displaying month
158    * names (e.g., "January" and "February").  This is a thirteen element
159    * string array indexed by <code>Calendar.JANUARY</code> through
160    * <code>Calendar.UNDECEMBER</code>.  Note that there are thirteen
161    * elements because some calendars have thriteen months.
162    *
163    * @return The list of month display strings.
164    */
165   public String[] getMonths ()
166   {
167     return months;
168   }
169
170   /**
171    * This method returns the list of strings used for displaying abbreviated
172    * month names (e.g., "Jan" and "Feb").  This is a thirteen element
173    * <code>String</code> array indexed by <code>Calendar.JANUARY</code>
174    * through <code>Calendar.UNDECEMBER</code>.  Note that there are thirteen
175    * elements because some calendars have thirteen months.
176    *
177    * @return The list of abbreviated month display strings.
178    */
179   public String[] getShortMonths ()
180   {
181     return shortMonths;
182   }
183
184   /**
185    * This method returns the list of strings used for displaying abbreviated 
186    * weekday names (e.g., "Sun" and "Mon").  This is an eight element
187    * <code>String</code> array indexed by <code>Calendar.SUNDAY</code>
188    * through <code>Calendar.SATURDAY</code>.  Note that the first element
189    * of this array is ignored.
190    *
191    * @return This list of abbreviated weekday display strings.
192    */
193   public String[] getShortWeekdays ()
194   {
195     return shortWeekdays;
196   }
197
198   /**
199    * This method returns the list of strings used for displaying weekday
200    * names (e.g., "Sunday" and "Monday").  This is an eight element
201    * <code>String</code> array indexed by <code>Calendar.SUNDAY</code>
202    * through <code>Calendar.SATURDAY</code>.  Note that the first element
203    * of this array is ignored.
204    *
205    * @return This list of weekday display strings.
206    */
207   public String[] getWeekdays ()
208   {
209     return weekdays;
210   }
211
212   /**
213    * This method returns this list of localized timezone display strings.
214    * This is a two dimensional <code>String</code> array where each row in
215    * the array contains five values:
216    * <P>
217    * <ul>
218    * <li>0 - The non-localized time zone id string.
219    * <li>1 - The long name of the time zone (standard time).
220    * <li>2 - The short name of the time zone (standard time).
221    * <li>3 - The long name of the time zone (daylight savings time).
222    * <li>4 - the short name of the time zone (daylight savings time).
223    *
224    * @return The list of time zone display strings.
225    */
226   public String[] [] getZoneStrings ()
227   {
228     return zoneStrings;
229   }
230
231   /**
232    * This method sets the list of strings used to display AM/PM values to
233    * the specified list.
234    * This is a two element <code>String</code> array indexed by
235    * <code>Calendar.AM</code> and <code>Calendar.PM</code>
236    *
237    * @param ampms The new list of AM/PM display strings.
238    */
239   public void setAmPmStrings (String[] value)
240   {
241     ampms = value;
242   }
243
244   /**
245    * This method sets the list of strings used to display time eras to
246    * to the specified list.
247    * This is a two element <code>String</code>
248    * array indexed by <code>Calendar.BC</code> and <code>Calendar.AD</code>.
249    *
250    * @param eras The new list of era disply strings.
251    */
252   public void setEras (String[] value)
253   {
254     eras = value;
255   }
256
257   /**
258     * This method sets the list of characters used to specific date/time
259     * formatting strings.
260     * This is an 18 character string that contains the characters
261     * that are used in creating the date formatting strings in 
262     * <code>SimpleDateFormat</code>.   The following are the character
263     * positions in the string and which format character they correspond
264     * to (the character in parentheses is the default value in the US English
265     * locale):
266     * <p>
267     * <ul>
268     * <li>0 - era (G)
269     * <li>1 - year (y)
270     * <li>2 - month (M)
271     * <li 3 - day of month (d)
272     * <li>4 - hour out of 12, from 1-12 (h)
273     * <li>5 - hour out of 24, from 0-23 (H)
274     * <li>6 - minute (m)
275     * <li>7 - second (s)
276     * <li>8 - millisecond (S)
277     * <li>9 - date of week (E)
278     * <li>10 - date of year (D)
279     * <li>11 - day of week in month, eg. "4th Thur in Nov" (F)
280     * <li>12 - week in year (w)
281     * <li>13 - week in month (W)
282     * <li>14 - am/pm (a)
283     * <li>15 - hour out of 24, from 1-24 (k)
284     * <li>16 - hour out of 12, from 0-11 (K)
285     * <li>17 - time zone (z)
286     * </ul>
287     *
288     * @param localPatternChars The new format patter characters
289     */
290   public void setLocalPatternChars (String value)
291   {
292     localPatternChars = value;
293   }
294
295   /**
296     * This method sets the list of strings used to display month names.
297     * This is a thirteen element
298     * string array indexed by <code>Calendar.JANUARY</code> through
299     * <code>Calendar.UNDECEMBER</code>.  Note that there are thirteen
300     * elements because some calendars have thriteen months.
301     *
302     * @param months The list of month display strings.
303     */
304   public void setMonths (String[] value)
305   {
306     months = value;
307   }
308
309   /**
310    * This method sets the list of strings used to display abbreviated month
311    * names.
312    * This is a thirteen element
313    * <code>String</code> array indexed by <code>Calendar.JANUARY</code>
314    * through <code>Calendar.UNDECEMBER</code>.  Note that there are thirteen
315    * elements because some calendars have thirteen months.
316    *
317    * @param shortMonths The new list of abbreviated month display strings.
318    */
319   public void setShortMonths (String[] value)
320   {
321     shortMonths = value;
322   }
323
324   /**
325    * This method sets the list of strings used to display abbreviated
326    * weekday names.
327    * This is an eight element
328    * <code>String</code> array indexed by <code>Calendar.SUNDAY</code>
329    * through <code>Calendar.SATURDAY</code>.  Note that the first element
330    * of this array is ignored.
331    *
332    * @param shortWeekdays This list of abbreviated weekday display strings.
333    */
334   public void setShortWeekdays (String[] value)
335   {
336     shortWeekdays = value;
337   }
338
339   /**
340    * This method sets the list of strings used to display weekday names.
341    * This is an eight element
342    * <code>String</code> array indexed by <code>Calendar.SUNDAY</code>
343    * through <code>Calendar.SATURDAY</code>.  Note that the first element
344    * of this array is ignored.
345    *
346    * @param weekdays This list of weekday display strings.
347    */
348   public void setWeekdays (String[] value)
349   {
350     weekdays = value;
351   }
352
353   /**
354    * This method sets the list of display strings for time zones.
355    * This is a two dimensional <code>String</code> array where each row in
356    * the array contains five values:
357    * <P>
358    * <ul>
359    * <li>0 - The non-localized time zone id string.
360    * <li>1 - The long name of the time zone (standard time).
361    * <li>2 - The short name of the time zone (standard time).
362    * <li>3 - The long name of the time zone (daylight savings time).
363    * <li>4 - the short name of the time zone (daylight savings time).
364    *
365    * @return The list of time zone display strings.
366    */
367   public void setZoneStrings (String[][] value)
368   {
369     zoneStrings = value;
370   }
371
372   /* Does a "deep" equality test - recurses into arrays. */
373   private static boolean equals (Object x, Object y)
374   {
375     if (x == y)
376       return true;
377     if (x == null || y == null)
378       return false;
379     if (! (x instanceof Object[]) || ! (y instanceof Object[]))
380       return x.equals(y);
381     Object[] xa = (Object[]) x;
382     Object[] ya = (Object[]) y;
383     if (xa.length != ya.length)
384       return false;
385     for (int i = xa.length;  --i >= 0; )
386       {
387         if (! equals(xa[i], ya[i]))
388           return false;
389       }
390     return true;
391   }
392
393   private static int hashCode (Object x)
394   {
395     if (x == null)
396       return 0;
397     if (! (x instanceof Object[]))
398       return x.hashCode();
399     Object[] xa = (Object[]) x;
400     int hash = 0;
401     for (int i = 0;  i < xa.length;  i++)
402       hash = 37 * hashCode(xa[i]);
403     return hash;
404   }
405
406   /**
407    * This method tests a specified object for equality against this object.
408    * This will be true if and only if the specified object:
409    * <p>
410    * <ul>
411    * <li> Is not <code>null</code>.
412    * <li> Is an instance of <code>DateFormatSymbols</code>.
413    * <li> Contains identical formatting symbols to this object.
414    * </ul>
415    * 
416    * @param obj The <code>Object</code> to test for equality against.
417    *
418    * @return <code>true</code> if the specified object is equal to this one,
419    * </code>false</code> otherwise.
420    */
421   public boolean equals (Object obj)
422   {
423     if (! (obj instanceof DateFormatSymbols))
424       return false;
425     DateFormatSymbols other = (DateFormatSymbols) obj;
426     return (equals(ampms, other.ampms)
427             && equals(eras, other.eras)
428             && equals(localPatternChars, other.localPatternChars)
429             && equals(months, other.months)
430             && equals(shortMonths, other.shortMonths)
431             && equals(shortWeekdays, other.shortWeekdays)
432             && equals(weekdays, other.weekdays)
433             && equals(zoneStrings, other.zoneStrings));
434   }
435
436   /**
437    * Returns a new copy of this object.
438    *
439    * @param A copy of this object
440    */
441   public Object clone ()
442   {
443     try
444       {
445         return super.clone ();
446       } 
447     catch (CloneNotSupportedException e) 
448       {
449         return null;
450       }
451   }
452
453   /**
454    * This method returns a hash value for this object.
455    *
456    * @return A hash value for this object.
457    */
458   public int hashCode ()
459   {
460     return (hashCode(ampms)
461             ^ hashCode(eras)
462             ^ hashCode(localPatternChars)
463             ^ hashCode(months)
464             ^ hashCode(shortMonths)
465             ^ hashCode(shortWeekdays)
466             ^ hashCode(weekdays)
467             ^ hashCode(zoneStrings));
468   }
469 }