19 |
public class JavaGenerator |
public class JavaGenerator |
20 |
{ |
{ |
21 |
private static final int JAVA_HEXLENGTH = 4; |
private static final int JAVA_HEXLENGTH = 4; |
|
|
|
22 |
private final Collection analyzers; |
private final Collection analyzers; |
23 |
private final String locale; |
private final String locale; |
24 |
private final String inPackage; |
private final String inPackage; |
25 |
private ArrayList localeContents = new ArrayList(); |
private ArrayList localeContents = new ArrayList(); |
26 |
|
private static final String[] classpathDateFormats = { "shortDateFormat", |
27 |
private static final String[] classpathDateFormats = |
"mediumDateFormat", |
28 |
{ |
"longDateFormat", |
29 |
"shortDateFormat", "mediumDateFormat", "longDateFormat", "fullDateFormat" |
"fullDateFormat" }; |
30 |
}; |
private static final String[] classpathTimeFormats = { "shortTimeFormat", |
31 |
|
"mediumTimeFormat", |
32 |
private static final String[] classpathTimeFormats = |
"longTimeFormat", |
33 |
{ |
"fullTimeFormat" }; |
34 |
"shortTimeFormat", "mediumTimeFormat", "longTimeFormat", "fullTimeFormat" |
private static final String[] classpathZoneOrder = { "zone.short.standard", |
35 |
}; |
"zone.long.standard", |
36 |
|
"zone.short.daylight", |
37 |
private static final String[] classpathZoneOrder = |
"zone.long.daylight" }; |
|
{ |
|
|
"zone.short.standard", "zone.long.standard", "zone.short.daylight", "zone.long.daylight" |
|
|
}; |
|
|
|
|
38 |
private static final String collatorIdentifiers = "<=,;@&!"; |
private static final String collatorIdentifiers = "<=,;@&!"; |
39 |
|
|
40 |
/* |
/* |
43 |
interface JavaContent |
interface JavaContent |
44 |
{ |
{ |
45 |
String getName(); |
String getName(); |
46 |
|
|
47 |
String getData(); |
String getData(); |
48 |
|
|
49 |
boolean isPackage(); |
boolean isPackage(); |
50 |
|
|
51 |
void generateContent(PrintWriter o); |
void generateContent(PrintWriter o); |
52 |
} |
} |
53 |
|
|
58 |
{ |
{ |
59 |
if (s == null) |
if (s == null) |
60 |
return "null"; |
return "null"; |
|
|
|
61 |
StringBuffer buf = new StringBuffer(); |
StringBuffer buf = new StringBuffer(); |
|
|
|
62 |
for (int i = 0; i < s.length(); i++) |
for (int i = 0; i < s.length(); i++) |
63 |
{ |
{ |
64 |
char c = s.charAt(i); |
char c = s.charAt(i); |
65 |
// Transform non-ASCII character into an escaped unicode character. |
// Transform non-ASCII character into an escaped unicode character. |
66 |
if (c > 127) |
if (c > 127) |
67 |
{ |
{ |
68 |
buf.append("\\u"); |
buf.append("\\u"); |
69 |
String hexString = Integer.toHexString((int)c); |
String hexString = Integer.toHexString((int) c); |
70 |
for (int j = 0; j < JAVA_HEXLENGTH-hexString.length(); j++) |
for (int j = 0; j < JAVA_HEXLENGTH - hexString.length(); j++) |
71 |
buf.append('0'); |
buf.append('0'); |
72 |
buf.append(hexString); |
buf.append(hexString); |
73 |
} |
} |
74 |
else if (c == '"') |
else if (c == '"') |
75 |
{ |
{ |
76 |
buf.append("\\\""); |
buf.append("\\\""); |
77 |
} |
} |
78 |
else if (c == '\\') |
else if (c == '\\') |
79 |
{ |
{ |
80 |
buf.append("\\\\"); |
buf.append("\\\\"); |
81 |
} |
} |
82 |
else |
else |
83 |
buf.append(c); |
buf.append(c); |
84 |
} |
} |
85 |
return buf.toString(); |
return buf.toString(); |
86 |
} |
} |
87 |
|
|
88 |
/* |
/* |
89 |
* This class implements JavaContent for simple string locale data. |
* This class implements JavaContent for simple string locale data. The entry |
90 |
* The entry has the name "name" and contains the data specified by "data". |
* has the name "name" and contains the data specified by "data". |
91 |
*/ |
*/ |
92 |
class StringContent implements JavaContent |
class StringContent implements JavaContent |
93 |
{ |
{ |
94 |
private String name; |
private String name; |
114 |
{ |
{ |
115 |
return data; |
return data; |
116 |
} |
} |
117 |
|
|
118 |
public void generateContent(PrintWriter o) |
public void generateContent(PrintWriter o) |
119 |
{ |
{ |
120 |
} |
} |
121 |
} |
} |
122 |
|
|
123 |
/* |
/* |
124 |
* This class implements JavaContent for big string locale data. |
* This class implements JavaContent for big string locale data. The entry has |
125 |
* The entry has the name "name" and contains the data specified by "data". |
* the name "name" and contains the data specified by "data". |
126 |
*/ |
*/ |
127 |
class BigStringContent implements JavaContent |
class BigStringContent implements JavaContent |
128 |
{ |
{ |
129 |
private String name; |
private String name; |
149 |
{ |
{ |
150 |
return null; |
return null; |
151 |
} |
} |
152 |
|
|
153 |
public void generateContent(PrintWriter o) |
public void generateContent(PrintWriter o) |
154 |
{ |
{ |
155 |
int pos = 0; |
int pos = 0; |
156 |
int charOnLine = 0; |
int charOnLine = 0; |
|
|
|
157 |
o.println(" private static final String " + name + " = "); |
o.println(" private static final String " + name + " = "); |
158 |
o.print("\t\""); |
o.print("\t\""); |
159 |
while (pos < data.length()) |
while (pos < data.length()) |
160 |
{ |
{ |
161 |
if (charOnLine >= 60) |
if (charOnLine >= 60) |
162 |
{ |
{ |
163 |
o.println("\" +"); |
o.println("\" +"); |
164 |
o.print("\t\""); |
o.print("\t\""); |
165 |
charOnLine = 0; |
charOnLine = 0; |
166 |
} |
} |
167 |
if (data.charAt(pos) == '\\' && charOnLine >= 54) |
if (data.charAt(pos) == '\\' && charOnLine >= 54) |
168 |
{ |
{ |
169 |
charOnLine = 60; |
charOnLine = 60; |
170 |
continue; |
continue; |
171 |
} |
} |
172 |
|
o.print(data.charAt(pos)); |
173 |
o.print(data.charAt(pos)); |
pos++; |
174 |
pos++; |
charOnLine++; |
175 |
charOnLine++; |
} |
|
} |
|
|
|
|
176 |
o.println("\";"); |
o.println("\";"); |
177 |
} |
} |
178 |
} |
} |
179 |
|
|
180 |
/* |
/* |
181 |
* This class implements JavaContent for simple ordered list. |
* This class implements JavaContent for simple ordered list. The lists are |
182 |
* The lists are ordered according to their index in the array. |
* ordered according to their index in the array. The class builds an external |
183 |
* The class builds an external array of Object to store the list |
* array of Object to store the list and use the identifier name for both the |
184 |
* and use the identifier name for both the locale id name and the java |
* locale id name and the java object name. |
|
* object name. |
|
185 |
*/ |
*/ |
186 |
class ManualListContent implements JavaContent |
class ManualListContent implements JavaContent |
187 |
{ |
{ |
208 |
{ |
{ |
209 |
return null; |
return null; |
210 |
} |
} |
211 |
|
|
212 |
public void generateContent(PrintWriter o) |
public void generateContent(PrintWriter o) |
213 |
{ |
{ |
214 |
o.println(" private static final String[] " + name + " = {"); |
o.println(" private static final String[] " + name + " = {"); |
|
|
|
215 |
for (int i = 0; i < data.length; i++) |
for (int i = 0; i < data.length; i++) |
216 |
{ |
{ |
217 |
o.print(" \"" + convertToJavaString(data[i].toString()) + "\""); |
o.print(" \"" + convertToJavaString(data[i].toString()) + "\""); |
218 |
o.println(","); |
o.println(","); |
219 |
} |
} |
|
|
|
220 |
o.println(" };"); |
o.println(" };"); |
221 |
} |
} |
222 |
} |
} |
223 |
|
|
224 |
/* |
/* |
225 |
* This class implements JavaContent for string ordered list. |
* This class implements JavaContent for string ordered list. The constructor |
226 |
* The constructor accepts a hashtable and an array of strings to specify |
* accepts a hashtable and an array of strings to specify the order. It can |
227 |
* the order. It can also optionally adds some "null" entries at the beginning |
* also optionally adds some "null" entries at the beginning of the array with |
228 |
* of the array with addNull. |
* addNull. |
229 |
*/ |
*/ |
230 |
class OrderedListContent implements JavaContent |
class OrderedListContent implements JavaContent |
231 |
{ |
{ |
235 |
private int prependNull; |
private int prependNull; |
236 |
private int appendNull; |
private int appendNull; |
237 |
|
|
238 |
public OrderedListContent(String name, Hashtable data, String[] order, int prependNull, int appendNull) |
public OrderedListContent(String name, Hashtable data, String[] order, |
239 |
|
int prependNull, int appendNull) |
240 |
{ |
{ |
241 |
this.name = name; |
this.name = name; |
242 |
this.data = data; |
this.data = data; |
259 |
{ |
{ |
260 |
return null; |
return null; |
261 |
} |
} |
262 |
|
|
263 |
public void generateContent(PrintWriter o) |
public void generateContent(PrintWriter o) |
264 |
{ |
{ |
265 |
o.println(" private static final String[] " + name + " = {"); |
o.println(" private static final String[] " + name + " = {"); |
|
|
|
266 |
for (int i = 0; i < prependNull; i++) |
for (int i = 0; i < prependNull; i++) |
267 |
o.println(" null,"); |
o.println(" null,"); |
|
|
|
268 |
for (int i = 0; i < order.length; i++) |
for (int i = 0; i < order.length; i++) |
269 |
{ |
{ |
270 |
Object contentElement = data.get(order[i]); |
Object contentElement = data.get(order[i]); |
271 |
|
if (contentElement == null) |
272 |
if (contentElement == null) |
o.print(" null"); |
273 |
o.print(" null"); |
else |
274 |
else |
o.print(" \"" + convertToJavaString(contentElement.toString()) |
275 |
o.print(" \"" + convertToJavaString(contentElement.toString()) + "\""); |
+ "\""); |
276 |
o.println(","); |
o.println(","); |
277 |
} |
} |
|
|
|
278 |
for (int i = 0; i < appendNull; i++) |
for (int i = 0; i < appendNull; i++) |
279 |
o.println(" null,"); |
o.println(" null,"); |
|
|
|
280 |
o.println(" };"); |
o.println(" };"); |
281 |
} |
} |
282 |
} |
} |
304 |
{ |
{ |
305 |
return null; |
return null; |
306 |
} |
} |
307 |
|
|
308 |
public void generateContent(PrintWriter o) |
public void generateContent(PrintWriter o) |
309 |
{ |
{ |
310 |
Enumeration keys = listElt.listData.keys(); |
Enumeration keys = listElt.listData.keys(); |
|
|
|
311 |
o.println(" private static final String[][] zoneStrings ="); |
o.println(" private static final String[][] zoneStrings ="); |
312 |
o.println(" {"); |
o.println(" {"); |
|
|
|
313 |
while (keys.hasMoreElements()) |
while (keys.hasMoreElements()) |
314 |
{ |
{ |
315 |
String zoneName = (String)keys.nextElement(); |
String zoneName = (String) keys.nextElement(); |
316 |
Hashtable zoneTable; |
Hashtable zoneTable; |
317 |
Iterator allValues; |
Iterator allValues; |
318 |
DataElement zoneData; |
DataElement zoneData; |
319 |
|
o.print(" { "); |
320 |
o.print(" { "); |
zoneTable = listElt.flattenLeaf(zoneName); |
321 |
|
for (int j = 0; j < classpathZoneOrder.length; j++) |
322 |
zoneTable = listElt.flattenLeaf(zoneName); |
{ |
323 |
for (int j = 0; j < classpathZoneOrder.length; j++) |
zoneData = (DataElement) zoneTable.get(classpathZoneOrder[j]); |
324 |
{ |
if (zoneData != null) |
325 |
zoneData = (DataElement)zoneTable.get(classpathZoneOrder[j]); |
o.print("\"" + convertToJavaString(zoneData.data) + "\", "); |
326 |
if (zoneData != null) |
else |
327 |
o.print("\"" + convertToJavaString(zoneData.data) + "\", "); |
/* TODO: Emit a warning here "Insufficient data" */ |
328 |
else |
o.print("\"\", "); |
329 |
/* TODO: Emit a warning here "Insufficient data" */ |
} |
330 |
o.print("\"\", "); |
o.println(" \"" + zoneName + "\" },"); |
331 |
} |
} |
|
|
|
|
o.println(" \"" + zoneName + "\" },"); |
|
|
} |
|
332 |
o.println(" };"); |
o.println(" };"); |
333 |
} |
} |
334 |
} |
} |
337 |
{ |
{ |
338 |
private String name; |
private String name; |
339 |
private Hashtable table; |
private Hashtable table; |
340 |
|
|
341 |
public HashtableContent(String name, Hashtable table) |
public HashtableContent(String name, Hashtable table) |
342 |
{ |
{ |
343 |
this.name = name; |
this.name = name; |
365 |
Enumeration keys = table.keys(); |
Enumeration keys = table.keys(); |
366 |
boolean more = keys.hasMoreElements(); |
boolean more = keys.hasMoreElements(); |
367 |
while (more) |
while (more) |
368 |
{ |
{ |
369 |
String key = (String) keys.nextElement(); |
String key = (String) keys.nextElement(); |
370 |
if (key.indexOf("|") != -1) |
if (key.indexOf("|") != -1) |
371 |
{ |
{ |
372 |
System.err.println(name + " key: '" + key + "' contains |"); |
System.err.println(name + " key: '" + key + "' contains |"); |
373 |
System.exit(-1); |
System.exit(-1); |
374 |
} |
} |
375 |
o.print(key); |
o.print(key); |
376 |
more = keys.hasMoreElements(); |
more = keys.hasMoreElements(); |
377 |
if (more) |
if (more) |
378 |
o.print('|'); |
o.print('|'); |
379 |
} |
} |
380 |
o.println("\";"); |
o.println("\";"); |
381 |
o.println(); |
o.println(); |
|
|
|
382 |
o.print(" private static final String " + name + "Values = \""); |
o.print(" private static final String " + name + "Values = \""); |
383 |
keys = table.keys(); |
keys = table.keys(); |
384 |
more = keys.hasMoreElements(); |
more = keys.hasMoreElements(); |
385 |
while (more) |
while (more) |
386 |
{ |
{ |
387 |
String key = (String) keys.nextElement(); |
String key = (String) keys.nextElement(); |
388 |
String value = (String) table.get(key); |
String value = (String) table.get(key); |
389 |
value = convertToJavaString(value); |
value = convertToJavaString(value); |
390 |
if (value.indexOf("|") != -1) |
if (value.indexOf("|") != -1) |
391 |
{ |
{ |
392 |
System.err.println(name + " value: '" + value + "' contains |"); |
System.err.println(name + " value: '" + value + "' contains |"); |
393 |
System.exit(-1); |
System.exit(-1); |
394 |
} |
} |
395 |
o.print(value); |
o.print(value); |
396 |
more = keys.hasMoreElements(); |
more = keys.hasMoreElements(); |
397 |
if (more) |
if (more) |
398 |
o.print('|'); |
o.print('|'); |
399 |
} |
} |
400 |
o.println("\";"); |
o.println("\";"); |
401 |
o.println(); |
o.println(); |
|
|
|
402 |
o.println(" private static final Hashtable " + name + ";"); |
o.println(" private static final Hashtable " + name + ";"); |
403 |
o.println(" static"); |
o.println(" static"); |
404 |
o.println(" {"); |
o.println(" {"); |
405 |
o.println(" " + name + " = new Hashtable();"); |
o.println(" " + name + " = new Hashtable();"); |
406 |
o.println(" Enumeration keys = new StringTokenizer(" + name |
o.println(" Enumeration keys = new StringTokenizer(" + name |
407 |
+ "Keys, \"|\");"); |
+ "Keys, \"|\");"); |
408 |
o.println(" Enumeration values = new StringTokenizer(" + name |
o.println(" Enumeration values = new StringTokenizer(" + name |
409 |
+ "Values, \"|\");"); |
+ "Values, \"|\");"); |
410 |
o.println(" while (keys.hasMoreElements())"); |
o.println(" while (keys.hasMoreElements())"); |
411 |
o.println(" {"); |
o.println(" {"); |
412 |
o.println(" String key = (String) keys.nextElement();"); |
o.println(" String key = (String) keys.nextElement();"); |
420 |
/* |
/* |
421 |
* Main body of the Java Locale generator. |
* Main body of the Java Locale generator. |
422 |
*/ |
*/ |
|
|
|
423 |
public JavaGenerator(String inPackage, Collection analyzers, String locale) |
public JavaGenerator(String inPackage, Collection analyzers, String locale) |
424 |
{ |
{ |
425 |
this.analyzers = analyzers; |
this.analyzers = analyzers; |
429 |
|
|
430 |
public void addStringContent(Hashtable tree, String ref, String name) |
public void addStringContent(Hashtable tree, String ref, String name) |
431 |
{ |
{ |
432 |
DataElement data_elt = (DataElement)tree.get(ref); |
DataElement data_elt = (DataElement) tree.get(ref); |
|
|
|
433 |
if (data_elt == null) |
if (data_elt == null) |
434 |
return; |
return; |
|
|
|
435 |
localeContents.add(new StringContent(name, data_elt.data)); |
localeContents.add(new StringContent(name, data_elt.data)); |
436 |
} |
} |
437 |
|
|
438 |
public void addOrderedListContent(Hashtable tree, String ref, String name, String[] order, |
public void addOrderedListContent(Hashtable tree, String ref, String name, |
439 |
int prependNull, int appendNull) |
String[] order, int prependNull, |
440 |
|
int appendNull) |
441 |
{ |
{ |
442 |
ListDataElement data_elt = (ListDataElement)tree.get(ref); |
ListDataElement data_elt = (ListDataElement) tree.get(ref); |
|
|
|
443 |
if (data_elt == null) |
if (data_elt == null) |
444 |
return; |
return; |
445 |
|
localeContents.add(new OrderedListContent(name, data_elt.listData, order, |
446 |
localeContents.add(new OrderedListContent(name, data_elt.listData, order, prependNull, appendNull)); |
prependNull, appendNull)); |
447 |
} |
} |
448 |
|
|
449 |
private void computeCalendar(Hashtable flattree) |
private void computeCalendar(Hashtable flattree) |
450 |
{ |
{ |
451 |
ListDataElement calendarElement; |
ListDataElement calendarElement; |
452 |
|
calendarElement = (ListDataElement) flattree.get("ldml.dates.calendars"); |
|
calendarElement = (ListDataElement)flattree.get("ldml.dates.calendars"); |
|
453 |
if (calendarElement != null) |
if (calendarElement != null) |
454 |
{ |
{ |
455 |
// GNU Classpath only supports gregorian calendar ATM. We will upgrade the code |
// GNU Classpath only supports gregorian calendar ATM. We will upgrade |
456 |
// once it has been done in GNU Classpath. |
// the code |
457 |
Hashtable calendarLeaf = calendarElement.flattenLeaf("gregorian"); |
// once it has been done in GNU Classpath. |
458 |
int i = 0; |
Hashtable calendarLeaf = calendarElement.flattenLeaf("gregorian"); |
459 |
|
int i = 0; |
460 |
if (calendarLeaf == null) |
if (calendarLeaf == null) |
461 |
return; |
return; |
462 |
|
addOrderedListContent( |
463 |
addOrderedListContent(calendarLeaf, |
calendarLeaf, |
464 |
"calendar.months.monthContext.monthWidth.abbreviated", "shortMonths", |
"calendar.months.monthContext.monthWidth.abbreviated", |
465 |
gnu.ldml.Constants.monthsOrder[i], 0, 1); |
"shortMonths", gnu.ldml.Constants.monthsOrder[i], |
466 |
addOrderedListContent(calendarLeaf, "calendar.months.monthContext.monthWidth.wide", "months", |
0, 1); |
467 |
gnu.ldml.Constants.monthsOrder[i], 0, 1); |
addOrderedListContent(calendarLeaf, |
468 |
|
"calendar.months.monthContext.monthWidth.wide", |
469 |
addOrderedListContent(calendarLeaf, "calendar.days.dayContext.dayWidth.abbreviated", "shortWeekdays", |
"months", gnu.ldml.Constants.monthsOrder[i], 0, 1); |
470 |
gnu.ldml.Constants.daysOrder, 1, 0); |
addOrderedListContent(calendarLeaf, |
471 |
addOrderedListContent(calendarLeaf, "calendar.days.dayContext.dayWidth.wide", "weekdays", |
"calendar.days.dayContext.dayWidth.abbreviated", |
472 |
gnu.ldml.Constants.daysOrder, 1, 0); |
"shortWeekdays", gnu.ldml.Constants.daysOrder, 1, |
473 |
|
0); |
474 |
/* ERAS */ |
addOrderedListContent(calendarLeaf, |
475 |
ListDataElement eraElement = (ListDataElement)calendarLeaf.get("calendar.eras.eraAbbr"); |
"calendar.days.dayContext.dayWidth.wide", |
476 |
if (eraElement != null) |
"weekdays", gnu.ldml.Constants.daysOrder, 1, 0); |
477 |
{ |
/* ERAS */ |
478 |
String ac = (String)eraElement.listData.get("0"); |
ListDataElement eraElement = (ListDataElement) calendarLeaf |
479 |
String bc = (String)eraElement.listData.get("1"); |
.get("calendar.eras.eraAbbr"); |
480 |
|
if (eraElement != null) |
481 |
if (ac != null && bc != null) |
{ |
482 |
localeContents.add(new ManualListContent("eras", new Object[] { ac, bc })); |
String ac = (String) eraElement.listData.get("0"); |
483 |
} |
String bc = (String) eraElement.listData.get("1"); |
484 |
|
if (ac != null && bc != null) |
485 |
DataElement amElement, pmElement; |
localeContents |
486 |
|
.add(new ManualListContent("eras", new Object[] { ac, bc })); |
487 |
/* AM-PM */ |
} |
488 |
amElement = (DataElement)calendarLeaf.get("calendar.am"); |
DataElement amElement, pmElement; |
489 |
pmElement = (DataElement)calendarLeaf.get("calendar.pm"); |
/* AM-PM */ |
490 |
if (amElement != null && pmElement != null) |
amElement = (DataElement) calendarLeaf.get("calendar.am"); |
491 |
{ |
pmElement = (DataElement) calendarLeaf.get("calendar.pm"); |
492 |
localeContents.add(new ManualListContent("ampms", |
if (amElement != null && pmElement != null) |
493 |
new Object[] { |
{ |
494 |
amElement.data, pmElement.data |
localeContents |
495 |
})); |
.add(new ManualListContent("ampms", |
496 |
} |
new Object[] { amElement.data, |
497 |
|
pmElement.data })); |
498 |
/* Compute all date formats */ |
} |
499 |
ListDataElement dateFormats = (ListDataElement)calendarLeaf.get("calendar.dateFormats"); |
/* Compute all date formats */ |
500 |
if (dateFormats != null) |
ListDataElement dateFormats = (ListDataElement) calendarLeaf |
501 |
{ |
.get("calendar.dateFormats"); |
502 |
for (int j = 0; j < gnu.ldml.Constants.dateFormats.length; j++) |
if (dateFormats != null) |
503 |
{ |
{ |
504 |
Hashtable dateFormat = dateFormats.flattenLeaf(gnu.ldml.Constants.dateFormats[j]); |
for (int j = 0; j < gnu.ldml.Constants.dateFormats.length; j++) |
505 |
|
{ |
506 |
if (dateFormat == null) |
Hashtable dateFormat = dateFormats |
507 |
continue; |
.flattenLeaf(gnu.ldml.Constants.dateFormats[j]); |
508 |
|
if (dateFormat == null) |
509 |
addStringContent(dateFormat, "dateFormatLength.dateFormat.pattern", classpathDateFormats[j]); |
continue; |
510 |
} |
addStringContent(dateFormat, |
511 |
} |
"dateFormatLength.dateFormat.pattern", |
512 |
|
classpathDateFormats[j]); |
513 |
/* Compute all time formats */ |
} |
514 |
ListDataElement timeFormats = (ListDataElement)calendarLeaf.get("calendar.timeFormats"); |
} |
515 |
if (timeFormats != null) |
/* Compute all time formats */ |
516 |
{ |
ListDataElement timeFormats = (ListDataElement) calendarLeaf |
517 |
for (int j = 0; j < gnu.ldml.Constants.timeFormats.length; j++) |
.get("calendar.timeFormats"); |
518 |
{ |
if (timeFormats != null) |
519 |
Hashtable timeFormat = timeFormats.flattenLeaf(gnu.ldml.Constants.timeFormats[j]); |
{ |
520 |
|
for (int j = 0; j < gnu.ldml.Constants.timeFormats.length; j++) |
521 |
if (timeFormat == null) |
{ |
522 |
continue; |
Hashtable timeFormat = timeFormats |
523 |
|
.flattenLeaf(gnu.ldml.Constants.timeFormats[j]); |
524 |
addStringContent(timeFormat, "timeFormatLength.timeFormat.pattern", classpathTimeFormats[j]); |
if (timeFormat == null) |
525 |
} |
continue; |
526 |
} |
addStringContent(timeFormat, |
527 |
|
"timeFormatLength.timeFormat.pattern", |
528 |
|
classpathTimeFormats[j]); |
529 |
|
} |
530 |
|
} |
531 |
} |
} |
532 |
} |
} |
533 |
|
|
534 |
private void computeCollations(Hashtable flattree) |
private void computeCollations(Hashtable flattree) |
535 |
{ |
{ |
536 |
ListDataElement collations = (ListDataElement)flattree.get("ldml.collations"); |
ListDataElement collations = (ListDataElement) flattree |
537 |
|
.get("ldml.collations"); |
538 |
if (collations == null) |
if (collations == null) |
539 |
return; |
return; |
|
|
|
540 |
Hashtable table = collations.flattenLeaf("standard"); |
Hashtable table = collations.flattenLeaf("standard"); |
541 |
if (table == null) |
if (table == null) |
542 |
return; |
return; |
|
|
|
543 |
System.err.println("Found UCA table for collation rules"); |
System.err.println("Found UCA table for collation rules"); |
544 |
|
OrderedListElement listElt = (OrderedListElement) table |
545 |
OrderedListElement listElt = (OrderedListElement)table.get("collation.rules"); |
.get("collation.rules"); |
546 |
if (listElt == null) |
if (listElt == null) |
547 |
return; |
return; |
|
|
|
548 |
System.err.println("Found rules"); |
System.err.println("Found rules"); |
|
|
|
549 |
CollationInterpreter interp = new CollationInterpreter(listElt.listData); |
CollationInterpreter interp = new CollationInterpreter(listElt.listData); |
|
|
|
550 |
interp.compute(); |
interp.compute(); |
551 |
|
localeContents.add(new BigStringContent("collation_rules", interp |
552 |
localeContents.add(new BigStringContent("collation_rules", interp.toCollationRule())); |
.toCollationRule())); |
553 |
} |
} |
554 |
|
|
555 |
private void computeHashtable(String name, Hashtable table) |
private void computeHashtable(String name, Hashtable table) |
559 |
|
|
560 |
private void computeTimeZones(Hashtable flattree) |
private void computeTimeZones(Hashtable flattree) |
561 |
{ |
{ |
562 |
Element elt = (Element)flattree.get("ldml.dates.timeZoneNames"); |
Element elt = (Element) flattree.get("ldml.dates.timeZoneNames"); |
|
|
|
563 |
if (elt != null) |
if (elt != null) |
564 |
localeContents.add(new TimeZoneContent((ListDataElement)elt)); |
localeContents.add(new TimeZoneContent((ListDataElement) elt)); |
565 |
} |
} |
566 |
|
|
567 |
private void computeLocalNames(Hashtable flattree) |
private void computeLocalNames(Hashtable flattree) |
568 |
{ |
{ |
569 |
ListDataElement elt = (ListDataElement)flattree.get("ldml.localeDisplayNames.territories"); |
ListDataElement elt = (ListDataElement) flattree |
570 |
|
.get("ldml.localeDisplayNames.territories"); |
571 |
if (elt != null) |
if (elt != null) |
572 |
localeContents.add(new HashtableContent("territories", elt.listData)); |
localeContents.add(new HashtableContent("territories", elt.listData)); |
573 |
|
elt = (ListDataElement) flattree.get("ldml.localeDisplayNames.languages"); |
|
elt = (ListDataElement)flattree.get("ldml.localeDisplayNames.languages"); |
|
|
|
|
574 |
if (elt != null) |
if (elt != null) |
575 |
localeContents.add(new HashtableContent("languages", elt.listData)); |
localeContents.add(new HashtableContent("languages", elt.listData)); |
576 |
|
elt = (ListDataElement) flattree.get("ldml.localeDisplayNames.variants"); |
|
elt = (ListDataElement)flattree.get("ldml.localeDisplayNames.variants"); |
|
|
|
|
577 |
if (elt != null) |
if (elt != null) |
578 |
localeContents.add(new HashtableContent("variants", elt.listData)); |
localeContents.add(new HashtableContent("variants", elt.listData)); |
579 |
} |
} |
580 |
|
|
581 |
private void computeCurrencies(Hashtable flattree) |
private void computeCurrencies(Hashtable flattree) |
582 |
{ |
{ |
583 |
ListDataElement elt = (ListDataElement)flattree.get("ldml.numbers.currencies"); |
ListDataElement elt = (ListDataElement) flattree |
584 |
|
.get("ldml.numbers.currencies"); |
|
|
|
585 |
if (elt == null) |
if (elt == null) |
586 |
return; |
return; |
|
|
|
587 |
Enumeration currencyKeys = elt.listData.keys(); |
Enumeration currencyKeys = elt.listData.keys(); |
588 |
Hashtable currencyName = new Hashtable(); |
Hashtable currencyName = new Hashtable(); |
589 |
Hashtable currencySymbol = new Hashtable(); |
Hashtable currencySymbol = new Hashtable(); |
|
|
|
590 |
while (currencyKeys.hasMoreElements()) |
while (currencyKeys.hasMoreElements()) |
591 |
{ |
{ |
592 |
String code = (String)currencyKeys.nextElement(); |
String code = (String) currencyKeys.nextElement(); |
593 |
Hashtable currencyTable = elt.flattenLeaf(code); |
Hashtable currencyTable = elt.flattenLeaf(code); |
594 |
DataElement displayName = (DataElement)currencyTable.get("currency.displayName"); |
DataElement displayName = (DataElement) currencyTable |
595 |
DataElement symbol = (DataElement)currencyTable.get("currency.symbol"); |
.get("currency.displayName"); |
596 |
|
DataElement symbol = (DataElement) currencyTable.get("currency.symbol"); |
597 |
if (displayName != null) |
if (displayName != null) |
598 |
currencyName.put(code, displayName.data); |
currencyName.put(code, displayName.data); |
599 |
|
if (symbol != null) |
600 |
if (symbol != null) |
currencySymbol.put(code, symbol.data); |
601 |
currencySymbol.put(code, symbol.data); |
} |
602 |
} |
localeContents.add(new HashtableContent("currenciesDisplayName", |
603 |
|
currencyName)); |
604 |
localeContents.add(new HashtableContent("currenciesDisplayName", currencyName)); |
localeContents |
605 |
localeContents.add(new HashtableContent("currenciesSymbol", currencySymbol)); |
.add(new HashtableContent("currenciesSymbol", currencySymbol)); |
606 |
} |
} |
607 |
|
|
608 |
private void computeContents() |
private void computeContents() |
609 |
{ |
{ |
610 |
for (Iterator i = analyzers.iterator(); i.hasNext(); ) |
for (Iterator i = analyzers.iterator(); i.hasNext();) |
611 |
{ |
{ |
612 |
Analyzer analyzer = (Analyzer) i.next(); |
Analyzer analyzer = (Analyzer) i.next(); |
613 |
Hashtable flattree = analyzer.flattenTree(); |
Hashtable flattree = analyzer.flattenTree(); |
614 |
|
addStringContent(flattree, "ldml.numbers.symbols.percentSign", |
615 |
addStringContent(flattree, "ldml.numbers.symbols.percentSign", "percent"); |
"percent"); |
616 |
addStringContent(flattree, "ldml.numbers.symbols.perMille", "perMill"); |
addStringContent(flattree, "ldml.numbers.symbols.perMille", "perMill"); |
617 |
addStringContent(flattree, "ldml.numbers.symbols.exponential", "exponential"); |
addStringContent(flattree, "ldml.numbers.symbols.exponential", |
618 |
|
"exponential"); |
619 |
addStringContent(flattree, "ldml.numbers.symbols.infinity", "infinity"); |
addStringContent(flattree, "ldml.numbers.symbols.infinity", "infinity"); |
620 |
addStringContent(flattree, "ldml.numbers.symbols.nan", "NaN"); |
addStringContent(flattree, "ldml.numbers.symbols.nan", "NaN"); |
621 |
addStringContent(flattree, "ldml.numbers.symbols.minusSign", "minusSign"); |
addStringContent(flattree, "ldml.numbers.symbols.minusSign", |
622 |
addStringContent(flattree, "ldml.numbers.symbols.nativeZeroDigit", "zeroDigit"); |
"minusSign"); |
623 |
addStringContent(flattree, "ldml.numbers.symbols.decimal", "decimalSeparator"); |
addStringContent(flattree, "ldml.numbers.symbols.nativeZeroDigit", |
624 |
addStringContent(flattree, "ldml.numbers.symbols.group", "groupingSeparator"); |
"zeroDigit"); |
625 |
|
addStringContent(flattree, "ldml.numbers.symbols.decimal", |
626 |
|
"decimalSeparator"); |
627 |
|
addStringContent(flattree, "ldml.numbers.symbols.group", |
628 |
|
"groupingSeparator"); |
629 |
addStringContent(flattree, "ldml.numbers.symbols.patternDigit", "digit"); |
addStringContent(flattree, "ldml.numbers.symbols.patternDigit", "digit"); |
630 |
addStringContent(flattree, "ldml.numbers.percentFormats.percentFormatLength.percentFormat.pattern", "percentFormat"); |
addStringContent( |
631 |
addStringContent(flattree, "ldml.numbers.currencyFormats.currencyFormatLength.currencyFormat.pattern", "currencyFormat"); |
flattree, |
632 |
addStringContent(flattree, "ldml.dates.localizedPatternChars", "localPatternChars"); |
"ldml.numbers.percentFormats.percentFormatLength.percentFormat.pattern", |
633 |
|
"percentFormat"); |
634 |
computeCurrencies(flattree); |
addStringContent( |
635 |
|
flattree, |
636 |
|
"ldml.numbers.currencyFormats.currencyFormatLength.currencyFormat.pattern", |
637 |
|
"currencyFormat"); |
638 |
|
addStringContent(flattree, "ldml.dates.localizedPatternChars", |
639 |
|
"localPatternChars"); |
640 |
|
computeCurrencies(flattree); |
641 |
computeCalendar(flattree); |
computeCalendar(flattree); |
642 |
computeCollations(flattree); |
computeCollations(flattree); |
643 |
computeTimeZones(flattree); |
computeTimeZones(flattree); |
648 |
public void generateJavaHeader(PrintWriter o) |
public void generateJavaHeader(PrintWriter o) |
649 |
{ |
{ |
650 |
String suffix = ("root".equals(locale)) ? "" : "_" + locale; |
String suffix = ("root".equals(locale)) ? "" : "_" + locale; |
|
|
|
651 |
o.println("/* LocaleInformation" + suffix + ".java --"); |
o.println("/* LocaleInformation" + suffix + ".java --"); |
652 |
o.println(" Copyright (C) 2004 Free Software Foundation, Inc."); |
o.println(" Copyright (C) 2004 Free Software Foundation, Inc."); |
653 |
o.println(); |
o.println(); |
654 |
o.println("This file is part of GNU Classpath."); |
o.println("This file is part of GNU Classpath."); |
655 |
o.println(); |
o.println(); |
656 |
o.println("GNU Classpath is free software; you can redistribute it and/or modify"); |
o |
657 |
o.println("it under the terms of the GNU General Public License as published by"); |
.println("GNU Classpath is free software; you can redistribute it and/or modify"); |
658 |
o.println("the Free Software Foundation; either version 2, or (at your option)"); |
o |
659 |
|
.println("it under the terms of the GNU General Public License as published by"); |
660 |
|
o |
661 |
|
.println("the Free Software Foundation; either version 2, or (at your option)"); |
662 |
o.println("any later version."); |
o.println("any later version."); |
663 |
o.println(); |
o.println(); |
664 |
o.println("GNU Classpath is distributed in the hope that it will be useful, but"); |
o |
665 |
|
.println("GNU Classpath is distributed in the hope that it will be useful, but"); |
666 |
o.println("WITHOUT ANY WARRANTY; without even the implied warranty of"); |
o.println("WITHOUT ANY WARRANTY; without even the implied warranty of"); |
667 |
o.println("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU"); |
o |
668 |
|
.println("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU"); |
669 |
o.println("General Public License for more details."); |
o.println("General Public License for more details."); |
670 |
o.println(); |
o.println(); |
671 |
o.println("You should have received a copy of the GNU General Public License"); |
o |
672 |
o.println("along with GNU Classpath; see the file COPYING. If not, write to the"); |
.println("You should have received a copy of the GNU General Public License"); |
673 |
o.println("Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA"); |
o |
674 |
|
.println("along with GNU Classpath; see the file COPYING. If not, write to the"); |
675 |
|
o |
676 |
|
.println("Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA"); |
677 |
o.println("02111-1307 USA."); |
o.println("02111-1307 USA."); |
678 |
o.println(); |
o.println(); |
679 |
o.println("Linking this library statically or dynamically with other modules is"); |
o |
680 |
o.println("making a combined work based on this library. Thus, the terms and"); |
.println("Linking this library statically or dynamically with other modules is"); |
681 |
|
o |
682 |
|
.println("making a combined work based on this library. Thus, the terms and"); |
683 |
o.println("conditions of the GNU General Public License cover the whole"); |
o.println("conditions of the GNU General Public License cover the whole"); |
684 |
o.println("combination."); |
o.println("combination."); |
685 |
o.println(); |
o.println(); |
686 |
o.println("As a special exception, the copyright holders of this library give you"); |
o |
687 |
o.println("permission to link this library with independent modules to produce an"); |
.println("As a special exception, the copyright holders of this library give you"); |
688 |
o.println("executable, regardless of the license terms of these independent"); |
o |
689 |
o.println("modules, and to copy and distribute the resulting executable under"); |
.println("permission to link this library with independent modules to produce an"); |
690 |
o.println("terms of your choice, provided that you also meet, for each linked"); |
o |
691 |
o.println("independent module, the terms and conditions of the license of that"); |
.println("executable, regardless of the license terms of these independent"); |
692 |
o.println("module. An independent module is a module which is not derived from"); |
o |
693 |
o.println("or based on this library. If you modify this library, you may extend"); |
.println("modules, and to copy and distribute the resulting executable under"); |
694 |
|
o |
695 |
|
.println("terms of your choice, provided that you also meet, for each linked"); |
696 |
|
o |
697 |
|
.println("independent module, the terms and conditions of the license of that"); |
698 |
|
o |
699 |
|
.println("module. An independent module is a module which is not derived from"); |
700 |
|
o |
701 |
|
.println("or based on this library. If you modify this library, you may extend"); |
702 |
o.println("this exception to your version of the library, but you are not"); |
o.println("this exception to your version of the library, but you are not"); |
703 |
o.println("obligated to do so. If you do not wish to do so, delete this"); |
o.println("obligated to do so. If you do not wish to do so, delete this"); |
704 |
o.println("exception statement from your version. */"); |
o.println("exception statement from your version. */"); |
705 |
o.println(); |
o.println(); |
706 |
o.println(); |
o.println(); |
707 |
o.println("// This file was automatically generated by gnu.localegen from LDML"); |
o |
708 |
|
.println("// This file was automatically generated by gnu.localegen from LDML"); |
709 |
o.println(); |
o.println(); |
710 |
o.println("package " + inPackage + ';'); |
o.println("package " + inPackage + ';'); |
711 |
o.println(); |
o.println(); |
720 |
{ |
{ |
721 |
o.println(" private static final Object[][] contents ="); |
o.println(" private static final Object[][] contents ="); |
722 |
o.println(" {"); |
o.println(" {"); |
723 |
|
for (int i = 0; i < localeContents.size(); i++) |
|
for (int i=0;i<localeContents.size();i++) |
|
724 |
{ |
{ |
725 |
JavaContent content = (JavaContent)localeContents.get(i); |
JavaContent content = (JavaContent) localeContents.get(i); |
726 |
|
if (content.isPackage()) |
727 |
if (content.isPackage()) |
o.print(" { \"" + content.getName() + "\", " + content.getName() |
728 |
o.print(" { \"" + content.getName() + "\", " + content.getName() + " }"); |
+ " }"); |
729 |
else |
else |
730 |
o.print(" { \"" + content.getName() + "\", \"" + convertToJavaString(content.getData()) + "\" }"); |
o.print(" { \"" + content.getName() + "\", \"" |
731 |
|
+ convertToJavaString(content.getData()) + "\" }"); |
732 |
o.println(","); |
o.println(","); |
733 |
} |
} |
|
|
|
734 |
o.println(" };"); |
o.println(" };"); |
735 |
o.println(); |
o.println(); |
736 |
o.println(" public Object[][] getContents() { return contents; }"); |
o.println(" public Object[][] getContents() { return contents; }"); |
739 |
public void generateJavaClass(PrintWriter o) |
public void generateJavaClass(PrintWriter o) |
740 |
{ |
{ |
741 |
String suffix = ("root".equals(locale)) ? "" : "_" + locale; |
String suffix = ("root".equals(locale)) ? "" : "_" + locale; |
742 |
o.println("public class LocaleInformation" + suffix + " extends ListResourceBundle"); |
o.println("public class LocaleInformation" + suffix |
743 |
|
+ " extends ListResourceBundle"); |
744 |
o.println("{"); |
o.println("{"); |
745 |
|
for (int i = 0; i < localeContents.size(); i++) |
|
for (int i=0;i<localeContents.size();i++) |
|
746 |
{ |
{ |
747 |
JavaContent content = (JavaContent)localeContents.get(i); |
JavaContent content = (JavaContent) localeContents.get(i); |
748 |
|
if (content.isPackage()) |
749 |
if (content.isPackage()) |
{ |
750 |
{ |
content.generateContent(o); |
751 |
content.generateContent(o); |
o.println(); |
752 |
o.println(); |
} |
|
} |
|
753 |
} |
} |
|
|
|
754 |
generateContents(o); |
generateContents(o); |
|
|
|
755 |
o.println("}"); |
o.println("}"); |
|
|
|
756 |
} |
} |
757 |
|
|
758 |
public void generate(String path) throws IOException |
public void generate(String path) throws IOException |
759 |
{ |
{ |
760 |
if (path == null) |
if (path == null) |
761 |
path = "."; |
path = "."; |
|
|
|
762 |
String relativePackagePath = inPackage.replace('.', File.separatorChar); |
String relativePackagePath = inPackage.replace('.', File.separatorChar); |
|
|
|
763 |
File javaDir = new File(path, relativePackagePath); |
File javaDir = new File(path, relativePackagePath); |
|
|
|
764 |
javaDir.mkdirs(); |
javaDir.mkdirs(); |
|
|
|
765 |
String suffix = ("root".equals(locale)) ? "" : "_" + locale; |
String suffix = ("root".equals(locale)) ? "" : "_" + locale; |
766 |
File javaFile = new File(javaDir, "LocaleInformation" + suffix + ".java"); |
File javaFile = new File(javaDir, "LocaleInformation" + suffix + ".java"); |
|
|
|
767 |
computeContents(); |
computeContents(); |
|
|
|
768 |
if (localeContents.size() == 0) |
if (localeContents.size() == 0) |
769 |
{ |
{ |
770 |
if (javaFile.exists()) |
if (javaFile.exists()) |
771 |
javaFile.delete(); |
javaFile.delete(); |
772 |
return; |
return; |
773 |
} |
} |
|
|
|
774 |
FileWriter output = new FileWriter(javaFile); |
FileWriter output = new FileWriter(javaFile); |
775 |
PrintWriter java_output = new PrintWriter(new BufferedWriter(output), true); |
PrintWriter java_output = new PrintWriter(new BufferedWriter(output), true); |
|
|
|
776 |
generateJavaHeader(java_output); |
generateJavaHeader(java_output); |
777 |
generateJavaClass(java_output); |
generateJavaClass(java_output); |
778 |
} |
} |
779 |
} |
} |