home *** CD-ROM | disk | FTP | other *** search
- package java.text;
-
- import java.util.Date;
- import java.util.Locale;
-
- public class MessageFormat extends Format {
- private Locale locale = Locale.getDefault();
- private String pattern = "";
- private Format[] formats = new Format[10];
- private int[] offsets = new int[10];
- private int[] argumentNumbers = new int[10];
- private int maxOffset = -1;
- private static final String[] typeList = new String[]{"", "", "number", "", "date", "", "time", "", "choice"};
- private static final String[] modifierList = new String[]{"", "", "currency", "", "percent", "", "integer"};
- private static final String[] dateModifierList = new String[]{"", "", "short", "", "medium", "", "long", "", "full"};
-
- public MessageFormat(String var1) {
- this.applyPattern(var1);
- }
-
- public void setLocale(Locale var1) {
- this.locale = var1;
- }
-
- public Locale getLocale() {
- return this.locale;
- }
-
- public void applyPattern(String var1) {
- StringBuffer[] var2 = new StringBuffer[4];
-
- for(int var3 = 0; var3 < var2.length; ++var3) {
- var2[var3] = new StringBuffer();
- }
-
- int var4 = 0;
- int var5 = 0;
- boolean var6 = false;
- int var7 = 0;
- this.maxOffset = -1;
-
- for(int var8 = 0; var8 < var1.length(); ++var8) {
- char var9 = var1.charAt(var8);
- if (var4 == 0) {
- if (var9 == '\'') {
- if (var8 + 1 < var1.length() && var1.charAt(var8 + 1) == '\'') {
- var2[var4].append(var9);
- ++var8;
- } else {
- var6 = !var6;
- }
- } else if (var9 == '{' && !var6) {
- var4 = 1;
- } else {
- var2[var4].append(var9);
- }
- } else if (var6) {
- var2[var4].append(var9);
- if (var9 == '\'') {
- var6 = false;
- }
- } else {
- switch (var9) {
- case '\'':
- var6 = true;
- default:
- var2[var4].append(var9);
- break;
- case ',':
- if (var4 < 3) {
- ++var4;
- } else {
- var2[var4].append(var9);
- }
- break;
- case '{':
- ++var7;
- var2[var4].append(var9);
- break;
- case '}':
- if (var7 == 0) {
- var4 = 0;
- this.makeFormat(var8, var5, var2);
- ++var5;
- } else {
- --var7;
- var2[var4].append(var9);
- }
- }
- }
- }
-
- this.pattern = var2[0].toString();
- }
-
- public String toPattern() {
- int var1 = 0;
- StringBuffer var2 = new StringBuffer();
-
- for(int var3 = 0; var3 <= this.maxOffset; ++var3) {
- copyAndFixQuotes(this.pattern, var1, this.offsets[var3], var2);
- var1 = this.offsets[var3];
- var2.append('{');
- var2.append(this.argumentNumbers[var3]);
- if (this.formats[var3] != null) {
- if (this.formats[var3] instanceof DecimalFormat) {
- if (this.formats[var3].equals(NumberFormat.getInstance(this.locale))) {
- var2.append(",number");
- } else if (this.formats[var3].equals(NumberFormat.getCurrencyInstance(this.locale))) {
- var2.append(",number,currency");
- } else if (this.formats[var3].equals(NumberFormat.getPercentInstance(this.locale))) {
- var2.append(",number,percent");
- } else if (this.formats[var3].equals(this.getIntegerFormat(this.locale))) {
- var2.append(",number,integer");
- } else {
- var2.append(",number," + ((DecimalFormat)this.formats[var3]).toPattern());
- }
- } else if (this.formats[var3] instanceof SimpleDateFormat) {
- if (this.formats[var3].equals(DateFormat.getDateInstance(2, this.locale))) {
- var2.append(",date");
- } else if (this.formats[var3].equals(DateFormat.getDateInstance(3, this.locale))) {
- var2.append(",date,short");
- } else if (this.formats[var3].equals(DateFormat.getDateInstance(2, this.locale))) {
- var2.append(",date,medium");
- } else if (this.formats[var3].equals(DateFormat.getDateInstance(1, this.locale))) {
- var2.append(",date,long");
- } else if (this.formats[var3].equals(DateFormat.getDateInstance(0, this.locale))) {
- var2.append(",date,full");
- } else if (this.formats[var3].equals(DateFormat.getTimeInstance(2, this.locale))) {
- var2.append(",time");
- } else if (this.formats[var3].equals(DateFormat.getTimeInstance(3, this.locale))) {
- var2.append(",time,short");
- } else if (this.formats[var3].equals(DateFormat.getTimeInstance(2, this.locale))) {
- var2.append(",time,medium");
- } else if (this.formats[var3].equals(DateFormat.getTimeInstance(1, this.locale))) {
- var2.append(",time,long");
- } else if (this.formats[var3].equals(DateFormat.getTimeInstance(0, this.locale))) {
- var2.append(",time,full");
- } else {
- var2.append(",date," + ((SimpleDateFormat)this.formats[var3]).toPattern());
- }
- } else if (this.formats[var3] instanceof ChoiceFormat) {
- var2.append(",choice," + ((ChoiceFormat)this.formats[var3]).toPattern());
- }
- }
-
- var2.append('}');
- }
-
- copyAndFixQuotes(this.pattern, var1, this.pattern.length(), var2);
- return var2.toString();
- }
-
- public void setFormats(Format[] var1) {
- try {
- this.formats = (Format[])var1.clone();
- } catch (Exception var2) {
- }
- }
-
- public void setFormat(int var1, Format var2) {
- this.formats[var1] = var2;
- }
-
- public Format[] getFormats() {
- try {
- return (Format[])this.formats.clone();
- } catch (Exception var1) {
- return this.formats;
- }
- }
-
- public final StringBuffer format(Object[] var1, StringBuffer var2, FieldPosition var3) {
- return this.format(var1, var2, var3, 0);
- }
-
- public static String format(String var0, Object[] var1) {
- MessageFormat var2 = new MessageFormat(var0);
- return ((Format)var2).format(var1);
- }
-
- public final StringBuffer format(Object var1, StringBuffer var2, FieldPosition var3) {
- return this.format(var1, var2, var3, 0);
- }
-
- public Object[] parse(String var1, ParsePosition var2) {
- Object[] var3 = new Object[10];
- int var4 = 0;
- int var5 = var2.index;
- ParsePosition var6 = new ParsePosition(0);
-
- for(int var7 = 0; var7 <= this.maxOffset; ++var7) {
- int var8 = this.offsets[var7] - var4;
- if (var8 != 0 && !this.pattern.regionMatches(var4, var1, var5, var8)) {
- return null;
- }
-
- var5 += var8;
- var4 += var8;
- if (this.formats[var7] == null) {
- int var9 = var7 != this.maxOffset ? this.offsets[var7 + 1] : this.pattern.length();
- int var10;
- if (var4 >= var9) {
- var10 = var1.length();
- } else {
- var10 = var1.indexOf(this.pattern.substring(var4, var9), var5);
- }
-
- if (var10 < 0) {
- return null;
- }
-
- var3[this.argumentNumbers[var7]] = var1.substring(var5, var10);
- var5 = var10;
- } else {
- var6.index = var5;
- var3[this.argumentNumbers[var7]] = this.formats[var7].parseObject(var1, var6);
- if (var6.index == var5) {
- return null;
- }
-
- var5 = var6.index;
- }
- }
-
- int var12 = this.pattern.length() - var4;
- if (var12 != 0 && !this.pattern.regionMatches(var4, var1, var5, var12)) {
- return null;
- } else {
- var2.index = var5 + var12;
- return var3;
- }
- }
-
- public Object[] parse(String var1) throws ParseException {
- ParsePosition var2 = new ParsePosition(0);
- Object[] var3 = this.parse(var1, var2);
- if (var2.index == 0) {
- throw new ParseException("MessageFormat parse error!", 0);
- } else {
- return var3;
- }
- }
-
- public Object parseObject(String var1, ParsePosition var2) {
- return this.parse(var1, var2);
- }
-
- public Object clone() {
- MessageFormat var1 = (MessageFormat)super.clone();
- var1.formats = (Format[])this.formats.clone();
-
- for(int var2 = 0; var2 < this.formats.length; ++var2) {
- if (this.formats[var2] != null) {
- var1.formats[var2] = (Format)this.formats[var2].clone();
- }
- }
-
- var1.offsets = (int[])this.offsets.clone();
- var1.argumentNumbers = (int[])this.argumentNumbers.clone();
- return var1;
- }
-
- public boolean equals(Object var1) {
- if (this == var1) {
- return true;
- } else if (this.getClass() != var1.getClass()) {
- return false;
- } else {
- MessageFormat var2 = (MessageFormat)var1;
- return this.maxOffset == var2.maxOffset && this.pattern.equals(var2.pattern) && Utility.objectEquals(this.locale, var2.locale) && Utility.arrayEquals(this.offsets, var2.offsets) && Utility.arrayEquals(this.argumentNumbers, var2.argumentNumbers) && Utility.arrayEquals(this.formats, var2.formats);
- }
- }
-
- public int hashCode() {
- return this.pattern.hashCode();
- }
-
- private MessageFormat(String var1, Locale var2) {
- this.locale = (Locale)var2.clone();
- this.applyPattern(var1);
- }
-
- private StringBuffer format(Object[] var1, StringBuffer var2, FieldPosition var3, int var4) {
- int var5 = 0;
-
- for(int var6 = 0; var6 <= this.maxOffset; ++var6) {
- var2.append(this.pattern.substring(var5, this.offsets[var6]));
- var5 = this.offsets[var6];
- int var7 = this.argumentNumbers[var6];
- if (var7 >= var1.length) {
- throw new IllegalArgumentException("Argument # > Arg length");
- }
-
- Object var8 = var1[var7];
- boolean var10 = false;
- String var9;
- if (this.formats[var6] != null) {
- var9 = this.formats[var6].format(var8);
- var10 = this.formats[var6] instanceof ChoiceFormat;
- } else if (var8 instanceof Number) {
- var9 = NumberFormat.getInstance(this.locale).format(var8);
- } else if (var8 instanceof Date) {
- var9 = DateFormat.getDateTimeInstance(3, 3, this.locale).format(var8);
- } else if (var8 instanceof String) {
- var9 = (String)var8;
- } else {
- var9 = var8.toString();
- if (var9 == null) {
- var9 = "null";
- }
- }
-
- if (var10 && var9.indexOf(123) >= 0) {
- MessageFormat var11 = new MessageFormat(var9, this.locale);
- var11.format(var1, var2, var3, var4);
- } else {
- var2.append(var9);
- }
- }
-
- var2.append(this.pattern.substring(var5, this.pattern.length()));
- return var2;
- }
-
- private void makeFormat(int var1, int var2, StringBuffer[] var3) {
- try {
- int var4 = Integer.parseInt(var3[1].toString());
- if (var4 < 0 || var4 > 9) {
- throw new NumberFormatException();
- }
-
- this.maxOffset = var2;
- this.offsets[var2] = var3[0].length();
- this.argumentNumbers[var2] = var4;
- } catch (Exception var10) {
- throw new IllegalArgumentException("argument number too large at ");
- }
-
- Object var5;
- var5 = null;
- label61:
- switch (findKeyword(var3[2].toString(), typeList)) {
- case 0:
- break;
- case 1:
- case 2:
- switch (findKeyword(var3[3].toString(), modifierList)) {
- case 0:
- var5 = NumberFormat.getInstance(this.locale);
- break label61;
- case 1:
- case 2:
- var5 = NumberFormat.getCurrencyInstance(this.locale);
- break label61;
- case 3:
- case 4:
- var5 = NumberFormat.getPercentInstance(this.locale);
- break label61;
- case 5:
- case 6:
- var5 = this.getIntegerFormat(this.locale);
- break label61;
- default:
- var5 = NumberFormat.getInstance(this.locale);
-
- try {
- ((DecimalFormat)var5).applyPattern(var3[3].toString());
- break label61;
- } catch (Exception var9) {
- throw new IllegalArgumentException("Pattern incorrect or locale does not support formats, error at ");
- }
- }
- case 3:
- case 4:
- switch (findKeyword(var3[3].toString(), dateModifierList)) {
- case 0:
- var5 = DateFormat.getDateInstance(2, this.locale);
- break label61;
- case 1:
- case 2:
- var5 = DateFormat.getDateInstance(3, this.locale);
- break label61;
- case 3:
- case 4:
- var5 = DateFormat.getDateInstance(2, this.locale);
- break label61;
- case 5:
- case 6:
- var5 = DateFormat.getDateInstance(1, this.locale);
- break label61;
- case 7:
- case 8:
- var5 = DateFormat.getDateInstance(0, this.locale);
- break label61;
- default:
- var5 = DateFormat.getDateInstance(2, this.locale);
-
- try {
- ((SimpleDateFormat)var5).applyPattern(var3[3].toString());
- break label61;
- } catch (Exception var8) {
- throw new IllegalArgumentException("Pattern incorrect or locale does not support formats, error at ");
- }
- }
- case 5:
- case 6:
- switch (findKeyword(var3[3].toString(), dateModifierList)) {
- case 0:
- var5 = DateFormat.getTimeInstance(2, this.locale);
- break label61;
- case 1:
- case 2:
- var5 = DateFormat.getTimeInstance(3, this.locale);
- break label61;
- case 3:
- case 4:
- var5 = DateFormat.getTimeInstance(2, this.locale);
- break label61;
- case 5:
- case 6:
- var5 = DateFormat.getTimeInstance(1, this.locale);
- break label61;
- case 7:
- case 8:
- var5 = DateFormat.getTimeInstance(0, this.locale);
- break label61;
- default:
- var5 = DateFormat.getTimeInstance(2, this.locale);
-
- try {
- ((SimpleDateFormat)var5).applyPattern(var3[3].toString());
- break label61;
- } catch (Exception var7) {
- throw new IllegalArgumentException("Pattern incorrect or locale does not support formats, error at ");
- }
- }
- case 7:
- case 8:
- try {
- var5 = new ChoiceFormat(var3[3].toString());
- break;
- } catch (Exception var6) {
- throw new IllegalArgumentException("Choice Pattern incorrect, error at ");
- }
- default:
- throw new IllegalArgumentException("unknown format type at ");
- }
-
- this.formats[var2] = (Format)var5;
- var3[1].setLength(0);
- var3[2].setLength(0);
- var3[3].setLength(0);
- }
-
- private static final int findKeyword(String var0, String[] var1) {
- var0 = var0.trim().toLowerCase();
-
- for(int var2 = 0; var2 < var1.length; ++var2) {
- if (var0.equals(var1[var2])) {
- return var2;
- }
- }
-
- return -1;
- }
-
- NumberFormat getIntegerFormat(Locale var1) {
- NumberFormat var2 = NumberFormat.getInstance(var1);
- if (var2 instanceof DecimalFormat) {
- DecimalFormat var3 = (DecimalFormat)var2;
- ((NumberFormat)var3).setMaximumFractionDigits(0);
- var3.setDecimalSeparatorAlwaysShown(false);
- ((NumberFormat)var3).setParseIntegerOnly(true);
- }
-
- return var2;
- }
-
- private static final void copyAndFixQuotes(String var0, int var1, int var2, StringBuffer var3) {
- for(int var4 = var1; var4 < var2; ++var4) {
- char var5 = var0.charAt(var4);
- if (var5 == '{') {
- var3.append("'{'");
- } else if (var5 == '\'') {
- var3.append("''");
- } else {
- var3.append(var5);
- }
- }
-
- }
- }
-