OSDN Git Service

252f9fa7743c8724afefcf0ddce99d6524f5ce26
[pf3gnuchains/gcc-fork.git] / libjava / java / text / DateFormatSymbols.java
1 /* Copyright (C) 1998, 1999, 2000  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  * @author Per Bothner <bothner@cygnus.com>
17  * @date October 24, 1998.
18  */
19
20 /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3.
21  * Status:  Believed complete and correct.
22  */
23
24 public class DateFormatSymbols extends Object
25   implements java.io.Serializable, Cloneable
26 {
27   String[] ampms;
28   String[] eras;
29   private String localPatternChars;
30   String[] months;
31   String[] shortMonths;
32   String[] shortWeekdays;
33   String[] weekdays;
34   private String[][] zoneStrings;
35
36   private static final long serialVersionUID = -5987973545549424702L;
37
38   // The order of these prefixes must be the same as in DateFormat
39   // FIXME: XXX: Note that this differs from the Classpath implemention
40   // in that there is no "default" entry; that is due to differing
41   // implementations where DateFormat.DEFAULT is MEDIUM here but 4 in
42   // Classpath (the JCL says it should be MEDIUM).  That will need to be 
43   // resolved in the merge.
44   private static final String[] formatPrefixes = { "full", "long", "medium", "short" };
45
46   private static final String[] ampmsDefault = {"AM", "PM" };
47   private static final String[] erasDefault = {"BC", "AD" };
48   // localPatternCharsDefault is used by SimpleDateFormat.
49   private static final String localPatternCharsDefault
50     = "GyMdkHmsSEDFwWahKz";
51   private static final String[] monthsDefault = {
52     "January", "February", "March", "April", "May", "June",
53     "July", "August", "September", "October", "November", "December", ""
54   };
55   private static final String[] shortMonthsDefault = {
56     "Jan", "Feb", "Mar", "Apr", "May", "Jun",
57     "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ""
58   };
59   private static final String[] shortWeekdaysDefault = {
60     "", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
61   };
62   private static final String[] weekdaysDefault = {
63     "", "Sunday", "Monday", "Tuesday",
64     "Wednesday", "Thursday", "Friday", "Saturday"
65   };
66
67   private static String[][] zoneStringsDefault = {
68     { "GMT", "Greenwich Mean Time", "GMT",
69       /**/   "Greenwich Mean Time", "GMT", "GMT" },
70     { "PST", "Pacific Standard Time", "PST",
71       /**/   "Pacific Daylight Time", "PDT", "San Francisco" },
72     { "MST", "Mountain Standard Time", "MST",
73       /**/   "Mountain Daylight Time", "MDT", "Denver" },
74     { "PNT", "Mountain Standard Time", "MST",
75       /**/   "Mountain Standard Time", "MST", "Phoenix" },
76     { "CST", "Central Standard Time", "CST",
77       /**/   "Central Daylight Time", "CDT", "Chicago" },
78     { "EST", "Eastern Standard Time", "EST",
79       /**/   "Eastern Daylight Time", "EDT", "Boston" },
80     { "IET", "Eastern Standard Time", "EST",
81       /**/   "Eastern Standard Time", "EST", "Indianapolis" },
82     { "PRT", "Atlantic Standard Time", "AST",
83       /**/   "Atlantic Daylight Time", "ADT", "Halifax" },
84     { "CNT", "Newfoundland Standard Time", "NST",
85       /**/   "Newfoundland Daylight Time", "NDT", "St. Johns" },
86     { "ECT", "Central European Standard Time", "CET",
87       /**/   "Central European Daylight Time", "CEST", "Paris" },
88     { "CTT", "China Standard Time", "CST",
89       /**/   "China Standard Time", "CST", "Shanghai" },
90     { "JST", "Japan Standard Time", "JST",
91       /**/   "Japan Standard Time", "JST", "Tokyo" },
92     { "HST", "Hawaii Standard Time", "HST",
93       /**/   "Hawaii Standard Time", "HST", "Honolulu" },
94     { "AST", "Alaska Standard Time", "AKST",
95       /**/   "Alaska Daylight Time", "AKDT", "Anchorage" }
96   };
97
98   // These are each arrays with a value for SHORT, MEDIUM, LONG, FULL,
99   // and DEFAULT (constants defined in java.text.DateFormat).  While
100   // not part of the official spec, we need a way to get at locale-specific
101   // default formatting patterns.  They are declared package scope so
102   // as to be easily accessible where needed (DateFormat, SimpleDateFormat).
103   transient String[] dateFormats;
104   transient String[] timeFormats;
105
106   private String[] formatsForKey(ResourceBundle res, String key) 
107   {
108     String[] values = new String [formatPrefixes.length];
109     for (int i = 0; i < formatPrefixes.length; i++)
110       {
111         values[i] = res.getString(formatPrefixes[i]+key);
112       }
113     return values;
114   }
115
116   private final Object safeGetResource (ResourceBundle res,
117                                         String key, Object def)
118   {
119     if (res != null)
120       {
121         try
122           {
123             return res.getObject(key);
124           }
125         catch (MissingResourceException x)
126           {
127           }
128       }
129     return def;
130   }
131
132   public DateFormatSymbols (Locale locale)
133   {
134     ResourceBundle res;
135     try
136       {
137         res = ResourceBundle.getBundle("gnu.gcj.text.LocaleData", locale);
138       }
139     catch (MissingResourceException x)
140       {
141         res = null;
142       }
143     ampms = (String[]) safeGetResource (res, "ampm", ampmsDefault);
144     eras = (String[]) safeGetResource (res, "eras", erasDefault);
145     localPatternChars = (String) safeGetResource (res, "datePatternChars",
146                                                   localPatternCharsDefault);
147     months = (String[]) safeGetResource (res, "months", monthsDefault);
148     shortMonths = (String[]) safeGetResource (res, "shortMonths",
149                                               shortMonthsDefault);
150     shortWeekdays = (String[]) safeGetResource (res, "shortWeekdays",
151                                                 shortWeekdaysDefault);
152     weekdays = (String[]) safeGetResource (res, "weekdays", weekdaysDefault);
153     zoneStrings = (String[][]) safeGetResource (res, "zoneStrings",
154                                                 zoneStringsDefault);
155
156     dateFormats = formatsForKey(res, "DateFormat");
157     timeFormats = formatsForKey(res, "TimeFormat");
158   }
159
160   public DateFormatSymbols ()
161   {
162     this (Locale.getDefault());
163   }
164
165   // Copy constructor.
166   private DateFormatSymbols (DateFormatSymbols old)
167   {
168     ampms = old.ampms;
169     eras = old.eras;
170     localPatternChars = old.localPatternChars;
171     months = old.months;
172     shortMonths = old.shortMonths;
173     shortWeekdays = old.shortWeekdays;
174     weekdays = old.weekdays;
175     zoneStrings = old.zoneStrings;
176     dateFormats = old.dateFormats;
177     timeFormats = old.timeFormats;
178   }
179
180   public String[] getAmPmStrings()
181   {
182     return ampms;
183   }
184
185   public String[] getEras()
186   {
187     return eras;
188   }
189
190
191   public String getLocalPatternChars()
192   {
193     return localPatternChars;
194   }
195
196   public String[] getMonths ()
197   {
198     return months;
199   }
200
201   public String[] getShortMonths ()
202   {
203     return shortMonths;
204   }
205
206   public String[] getShortWeekdays ()
207   {
208     return shortWeekdays;
209   }
210
211   public String[] getWeekdays ()
212   {
213     return weekdays;
214   }
215
216   public String[] [] getZoneStrings ()
217   {
218     return zoneStrings;
219   }
220
221   public void setAmPmStrings (String[] value)
222   {
223     ampms = value;
224   }
225
226   public void setEras (String[] value)
227   {
228     eras = value;
229   }
230
231   public void setLocalPatternChars (String value)
232   {
233     localPatternChars = value;
234   }
235
236   public void setMonths (String[] value)
237   {
238     months = value;
239   }
240
241   public void setShortMonths (String[] value)
242   {
243     shortMonths = value;
244   }
245
246   public void setShortWeekdays (String[] value)
247   {
248     shortWeekdays = value;
249   }
250
251   public void setWeekdays (String[] value)
252   {
253     weekdays = value;
254   }
255
256   public void setZoneStrings (String[][] value)
257   {
258     zoneStrings = value;
259   }
260
261   /* Does a "deep" equality test - recurses into arrays. */
262   private static boolean equals (Object x, Object y)
263   {
264     if (x == y)
265       return true;
266     if (x == null || y == null)
267       return false;
268     if (! (x instanceof Object[]) || ! (y instanceof Object[]))
269       return x.equals(y);
270     Object[] xa = (Object[]) x;
271     Object[] ya = (Object[]) y;
272     if (xa.length != ya.length)
273       return false;
274     for (int i = xa.length;  --i >= 0; )
275       {
276         if (! equals(xa[i], ya[i]))
277           return false;
278       }
279     return true;
280   }
281
282   private static int hashCode (Object x)
283   {
284     if (x == null)
285       return 0;
286     if (! (x instanceof Object[]))
287       return x.hashCode();
288     Object[] xa = (Object[]) x;
289     int hash = 0;
290     for (int i = 0;  i < xa.length;  i++)
291       hash = 37 * hashCode(xa[i]);
292     return hash;
293   }
294
295   public boolean equals (Object obj)
296   {
297     if (obj == null || ! (obj instanceof DateFormatSymbols))
298       return false;
299     DateFormatSymbols other = (DateFormatSymbols) obj;
300     return (equals(ampms, other.ampms)
301             && equals(eras, other.eras)
302             && equals(localPatternChars, other.localPatternChars)
303             && equals(months, other.months)
304             && equals(shortMonths, other.shortMonths)
305             && equals(shortWeekdays, other.shortWeekdays)
306             && equals(weekdays, other.weekdays)
307             && equals(zoneStrings, other.zoneStrings));
308   }
309
310   public Object clone ()
311   {
312     return new DateFormatSymbols (this);
313   }
314
315   public int hashCode ()
316   {
317     return (hashCode(ampms)
318             ^ hashCode(eras)
319             ^ hashCode(localPatternChars)
320             ^ hashCode(months)
321             ^ hashCode(shortMonths)
322             ^ hashCode(shortWeekdays)
323             ^ hashCode(weekdays)
324             ^ hashCode(zoneStrings));
325   }
326 }