home *** CD-ROM | disk | FTP | other *** search
/ S283 Planetary Science &n…he Search for Life DVD 2 / DVD-ROM.iso / install / jre1_3 / lib / rt.jar / java / text / MessageFormat.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  8.7 KB  |  548 lines

  1. package java.text;
  2.  
  3. import java.io.IOException;
  4. import java.io.InvalidObjectException;
  5. import java.io.ObjectInputStream;
  6. import java.util.Date;
  7. import java.util.Locale;
  8.  
  9. public class MessageFormat extends Format {
  10.    private Locale locale = Locale.getDefault();
  11.    private String pattern = "";
  12.    private static final int MAX_ARGUMENTS = 10;
  13.    private Format[] formats = new Format[10];
  14.    private int[] offsets = new int[10];
  15.    private int[] argumentNumbers = new int[10];
  16.    private int maxOffset = -1;
  17.    private static final String[] typeList = new String[]{"", "", "number", "", "date", "", "time", "", "choice"};
  18.    private static final String[] modifierList = new String[]{"", "", "currency", "", "percent", "", "integer"};
  19.    private static final String[] dateModifierList = new String[]{"", "", "short", "", "medium", "", "long", "", "full"};
  20.  
  21.    public MessageFormat(String var1) {
  22.       this.applyPattern(var1);
  23.    }
  24.  
  25.    public void setLocale(Locale var1) {
  26.       this.locale = var1;
  27.    }
  28.  
  29.    public Locale getLocale() {
  30.       return this.locale;
  31.    }
  32.  
  33.    public void applyPattern(String var1) {
  34.       StringBuffer[] var2 = new StringBuffer[4];
  35.  
  36.       for(int var3 = 0; var3 < var2.length; ++var3) {
  37.          var2[var3] = new StringBuffer();
  38.       }
  39.  
  40.       int var4 = 0;
  41.       int var5 = 0;
  42.       boolean var6 = false;
  43.       int var7 = 0;
  44.       this.maxOffset = -1;
  45.  
  46.       for(int var8 = 0; var8 < var1.length(); ++var8) {
  47.          char var9 = var1.charAt(var8);
  48.          if (var4 == 0) {
  49.             if (var9 == '\'') {
  50.                if (var8 + 1 < var1.length() && var1.charAt(var8 + 1) == '\'') {
  51.                   var2[var4].append(var9);
  52.                   ++var8;
  53.                } else {
  54.                   var6 = !var6;
  55.                }
  56.             } else if (var9 == '{' && !var6) {
  57.                var4 = 1;
  58.             } else {
  59.                var2[var4].append(var9);
  60.             }
  61.          } else if (var6) {
  62.             var2[var4].append(var9);
  63.             if (var9 == '\'') {
  64.                var6 = false;
  65.             }
  66.          } else {
  67.             switch (var9) {
  68.                case '\'':
  69.                   var6 = true;
  70.                default:
  71.                   var2[var4].append(var9);
  72.                   break;
  73.                case ',':
  74.                   if (var4 < 3) {
  75.                      ++var4;
  76.                   } else {
  77.                      var2[var4].append(var9);
  78.                   }
  79.                   break;
  80.                case '{':
  81.                   ++var7;
  82.                   var2[var4].append(var9);
  83.                   break;
  84.                case '}':
  85.                   if (var7 == 0) {
  86.                      var4 = 0;
  87.                      this.makeFormat(var8, var5, var2);
  88.                      ++var5;
  89.                   } else {
  90.                      --var7;
  91.                      var2[var4].append(var9);
  92.                   }
  93.             }
  94.          }
  95.       }
  96.  
  97.       if (var7 == 0 && var4 != 0) {
  98.          this.maxOffset = -1;
  99.          throw new IllegalArgumentException("Unmatched braces in the pattern.");
  100.       } else {
  101.          this.pattern = var2[0].toString();
  102.       }
  103.    }
  104.  
  105.    public String toPattern() {
  106.       int var1 = 0;
  107.       StringBuffer var2 = new StringBuffer();
  108.  
  109.       for(int var3 = 0; var3 <= this.maxOffset; ++var3) {
  110.          copyAndFixQuotes(this.pattern, var1, this.offsets[var3], var2);
  111.          var1 = this.offsets[var3];
  112.          var2.append('{');
  113.          var2.append(this.argumentNumbers[var3]);
  114.          if (this.formats[var3] != null) {
  115.             if (this.formats[var3] instanceof DecimalFormat) {
  116.                if (this.formats[var3].equals(NumberFormat.getInstance(this.locale))) {
  117.                   var2.append(",number");
  118.                } else if (this.formats[var3].equals(NumberFormat.getCurrencyInstance(this.locale))) {
  119.                   var2.append(",number,currency");
  120.                } else if (this.formats[var3].equals(NumberFormat.getPercentInstance(this.locale))) {
  121.                   var2.append(",number,percent");
  122.                } else if (this.formats[var3].equals(this.getIntegerFormat(this.locale))) {
  123.                   var2.append(",number,integer");
  124.                } else {
  125.                   var2.append(",number," + ((DecimalFormat)this.formats[var3]).toPattern());
  126.                }
  127.             } else if (this.formats[var3] instanceof SimpleDateFormat) {
  128.                if (this.formats[var3].equals(DateFormat.getDateInstance(2, this.locale))) {
  129.                   var2.append(",date");
  130.                } else if (this.formats[var3].equals(DateFormat.getDateInstance(3, this.locale))) {
  131.                   var2.append(",date,short");
  132.                } else if (this.formats[var3].equals(DateFormat.getDateInstance(2, this.locale))) {
  133.                   var2.append(",date,medium");
  134.                } else if (this.formats[var3].equals(DateFormat.getDateInstance(1, this.locale))) {
  135.                   var2.append(",date,long");
  136.                } else if (this.formats[var3].equals(DateFormat.getDateInstance(0, this.locale))) {
  137.                   var2.append(",date,full");
  138.                } else if (this.formats[var3].equals(DateFormat.getTimeInstance(2, this.locale))) {
  139.                   var2.append(",time");
  140.                } else if (this.formats[var3].equals(DateFormat.getTimeInstance(3, this.locale))) {
  141.                   var2.append(",time,short");
  142.                } else if (this.formats[var3].equals(DateFormat.getTimeInstance(2, this.locale))) {
  143.                   var2.append(",time,medium");
  144.                } else if (this.formats[var3].equals(DateFormat.getTimeInstance(1, this.locale))) {
  145.                   var2.append(",time,long");
  146.                } else if (this.formats[var3].equals(DateFormat.getTimeInstance(0, this.locale))) {
  147.                   var2.append(",time,full");
  148.                } else {
  149.                   var2.append(",date," + ((SimpleDateFormat)this.formats[var3]).toPattern());
  150.                }
  151.             } else if (this.formats[var3] instanceof ChoiceFormat) {
  152.                var2.append(",choice," + ((ChoiceFormat)this.formats[var3]).toPattern());
  153.             }
  154.          }
  155.  
  156.          var2.append('}');
  157.       }
  158.  
  159.       copyAndFixQuotes(this.pattern, var1, this.pattern.length(), var2);
  160.       return var2.toString();
  161.    }
  162.  
  163.    public void setFormats(Format[] var1) {
  164.       try {
  165.          this.formats = (Format[])var1.clone();
  166.       } catch (Exception var3) {
  167.       }
  168.    }
  169.  
  170.    public void setFormat(int var1, Format var2) {
  171.       this.formats[var1] = var2;
  172.    }
  173.  
  174.    public Format[] getFormats() {
  175.       try {
  176.          return (Format[])this.formats.clone();
  177.       } catch (Exception var2) {
  178.          return this.formats;
  179.       }
  180.    }
  181.  
  182.    public final StringBuffer format(Object[] var1, StringBuffer var2, FieldPosition var3) {
  183.       return this.format(var1, var2, var3, 0);
  184.    }
  185.  
  186.    public static String format(String var0, Object[] var1) {
  187.       MessageFormat var2 = new MessageFormat(var0);
  188.       return ((Format)var2).format(var1);
  189.    }
  190.  
  191.    public final StringBuffer format(Object var1, StringBuffer var2, FieldPosition var3) {
  192.       return this.format(var1, var2, var3, 0);
  193.    }
  194.  
  195.    public Object[] parse(String var1, ParsePosition var2) {
  196.       Object[] var3 = new Object[0];
  197.       if (var1 == null) {
  198.          return var3;
  199.       } else {
  200.          Object[] var4 = new Object[10];
  201.          int var5 = 0;
  202.          int var6 = var2.index;
  203.          ParsePosition var7 = new ParsePosition(0);
  204.  
  205.          for(int var8 = 0; var8 <= this.maxOffset; ++var8) {
  206.             int var9 = this.offsets[var8] - var5;
  207.             if (var9 != 0 && !this.pattern.regionMatches(var5, var1, var6, var9)) {
  208.                var2.errorIndex = var6;
  209.                return null;
  210.             }
  211.  
  212.             var6 += var9;
  213.             var5 += var9;
  214.             if (this.formats[var8] == null) {
  215.                int var10 = var8 != this.maxOffset ? this.offsets[var8 + 1] : this.pattern.length();
  216.                int var11;
  217.                if (var5 >= var10) {
  218.                   var11 = var1.length();
  219.                } else {
  220.                   var11 = var1.indexOf(this.pattern.substring(var5, var10), var6);
  221.                }
  222.  
  223.                if (var11 < 0) {
  224.                   var2.errorIndex = var6;
  225.                   return null;
  226.                }
  227.  
  228.                String var12 = var1.substring(var6, var11);
  229.                if (!var12.equals("{" + this.argumentNumbers[var8] + "}")) {
  230.                   var4[this.argumentNumbers[var8]] = var1.substring(var6, var11);
  231.                }
  232.  
  233.                var6 = var11;
  234.             } else {
  235.                var7.index = var6;
  236.                var4[this.argumentNumbers[var8]] = this.formats[var8].parseObject(var1, var7);
  237.                if (var7.index == var6) {
  238.                   var2.errorIndex = var6;
  239.                   return null;
  240.                }
  241.  
  242.                var6 = var7.index;
  243.             }
  244.          }
  245.  
  246.          int var14 = this.pattern.length() - var5;
  247.          if (var14 != 0 && !this.pattern.regionMatches(var5, var1, var6, var14)) {
  248.             var2.errorIndex = var6;
  249.             return null;
  250.          } else {
  251.             var2.index = var6 + var14;
  252.             return var4;
  253.          }
  254.       }
  255.    }
  256.  
  257.    public Object[] parse(String var1) throws ParseException {
  258.       ParsePosition var2 = new ParsePosition(0);
  259.       Object[] var3 = this.parse(var1, var2);
  260.       if (var2.index == 0) {
  261.          throw new ParseException("MessageFormat parse error!", var2.errorIndex);
  262.       } else {
  263.          return var3;
  264.       }
  265.    }
  266.  
  267.    public Object parseObject(String var1, ParsePosition var2) {
  268.       return this.parse(var1, var2);
  269.    }
  270.  
  271.    public Object clone() {
  272.       MessageFormat var1 = (MessageFormat)super.clone();
  273.       var1.formats = (Format[])this.formats.clone();
  274.  
  275.       for(int var2 = 0; var2 < this.formats.length; ++var2) {
  276.          if (this.formats[var2] != null) {
  277.             var1.formats[var2] = (Format)this.formats[var2].clone();
  278.          }
  279.       }
  280.  
  281.       var1.offsets = (int[])this.offsets.clone();
  282.       var1.argumentNumbers = (int[])this.argumentNumbers.clone();
  283.       return var1;
  284.    }
  285.  
  286.    public boolean equals(Object var1) {
  287.       if (this == var1) {
  288.          return true;
  289.       } else if (var1 != null && this.getClass() == var1.getClass()) {
  290.          MessageFormat var2 = (MessageFormat)var1;
  291.          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);
  292.       } else {
  293.          return false;
  294.       }
  295.    }
  296.  
  297.    public int hashCode() {
  298.       return this.pattern.hashCode();
  299.    }
  300.  
  301.    private MessageFormat(String var1, Locale var2) {
  302.       this.locale = (Locale)var2.clone();
  303.       this.applyPattern(var1);
  304.    }
  305.  
  306.    private StringBuffer format(Object[] var1, StringBuffer var2, FieldPosition var3, int var4) {
  307.       int var5 = 0;
  308.  
  309.       for(int var6 = 0; var6 <= this.maxOffset; ++var6) {
  310.          var2.append(this.pattern.substring(var5, this.offsets[var6]));
  311.          var5 = this.offsets[var6];
  312.          int var7 = this.argumentNumbers[var6];
  313.          if (var1 != null && var7 < var1.length) {
  314.             Object var8 = var1[var7];
  315.             boolean var10 = false;
  316.             String var9;
  317.             if (var8 == null) {
  318.                var9 = "null";
  319.             } else if (this.formats[var6] != null) {
  320.                var9 = this.formats[var6].format(var8);
  321.                var10 = this.formats[var6] instanceof ChoiceFormat;
  322.             } else if (var8 instanceof Number) {
  323.                var9 = NumberFormat.getInstance(this.locale).format(var8);
  324.             } else if (var8 instanceof Date) {
  325.                var9 = DateFormat.getDateTimeInstance(3, 3, this.locale).format(var8);
  326.             } else if (var8 instanceof String) {
  327.                var9 = (String)var8;
  328.             } else {
  329.                var9 = var8.toString();
  330.                if (var9 == null) {
  331.                   var9 = "null";
  332.                }
  333.             }
  334.  
  335.             if (var10 && var9.indexOf(123) >= 0) {
  336.                MessageFormat var11 = new MessageFormat(var9, this.locale);
  337.                var11.format(var1, var2, var3, var4);
  338.             } else {
  339.                var2.append(var9);
  340.             }
  341.          } else {
  342.             var2.append("{" + var7 + "}");
  343.          }
  344.       }
  345.  
  346.       var2.append(this.pattern.substring(var5, this.pattern.length()));
  347.       return var2;
  348.    }
  349.  
  350.    private void makeFormat(int var1, int var2, StringBuffer[] var3) {
  351.       int var5 = this.maxOffset;
  352.  
  353.       try {
  354.          int var4 = Integer.parseInt(var3[1].toString());
  355.          if (var4 < 0 || var4 > 9) {
  356.             throw new NumberFormatException();
  357.          }
  358.  
  359.          this.maxOffset = var2;
  360.          this.offsets[var2] = var3[0].length();
  361.          this.argumentNumbers[var2] = var4;
  362.       } catch (Exception var12) {
  363.          throw new IllegalArgumentException("argument number too large at ");
  364.       }
  365.  
  366.       Object var6;
  367.       var6 = null;
  368.       label63:
  369.       switch (findKeyword(var3[2].toString(), typeList)) {
  370.          case 0:
  371.             break;
  372.          case 1:
  373.          case 2:
  374.             switch (findKeyword(var3[3].toString(), modifierList)) {
  375.                case 0:
  376.                   var6 = NumberFormat.getInstance(this.locale);
  377.                   break label63;
  378.                case 1:
  379.                case 2:
  380.                   var6 = NumberFormat.getCurrencyInstance(this.locale);
  381.                   break label63;
  382.                case 3:
  383.                case 4:
  384.                   var6 = NumberFormat.getPercentInstance(this.locale);
  385.                   break label63;
  386.                case 5:
  387.                case 6:
  388.                   var6 = this.getIntegerFormat(this.locale);
  389.                   break label63;
  390.                default:
  391.                   var6 = NumberFormat.getInstance(this.locale);
  392.  
  393.                   try {
  394.                      ((DecimalFormat)var6).applyPattern(var3[3].toString());
  395.                      break label63;
  396.                   } catch (Exception var11) {
  397.                      this.maxOffset = var5;
  398.                      throw new IllegalArgumentException("Pattern incorrect or locale does not support formats, error at ");
  399.                   }
  400.             }
  401.          case 3:
  402.          case 4:
  403.             switch (findKeyword(var3[3].toString(), dateModifierList)) {
  404.                case 0:
  405.                   var6 = DateFormat.getDateInstance(2, this.locale);
  406.                   break label63;
  407.                case 1:
  408.                case 2:
  409.                   var6 = DateFormat.getDateInstance(3, this.locale);
  410.                   break label63;
  411.                case 3:
  412.                case 4:
  413.                   var6 = DateFormat.getDateInstance(2, this.locale);
  414.                   break label63;
  415.                case 5:
  416.                case 6:
  417.                   var6 = DateFormat.getDateInstance(1, this.locale);
  418.                   break label63;
  419.                case 7:
  420.                case 8:
  421.                   var6 = DateFormat.getDateInstance(0, this.locale);
  422.                   break label63;
  423.                default:
  424.                   var6 = DateFormat.getDateInstance(2, this.locale);
  425.  
  426.                   try {
  427.                      ((SimpleDateFormat)var6).applyPattern(var3[3].toString());
  428.                      break label63;
  429.                   } catch (Exception var10) {
  430.                      this.maxOffset = var5;
  431.                      throw new IllegalArgumentException("Pattern incorrect or locale does not support formats, error at ");
  432.                   }
  433.             }
  434.          case 5:
  435.          case 6:
  436.             switch (findKeyword(var3[3].toString(), dateModifierList)) {
  437.                case 0:
  438.                   var6 = DateFormat.getTimeInstance(2, this.locale);
  439.                   break label63;
  440.                case 1:
  441.                case 2:
  442.                   var6 = DateFormat.getTimeInstance(3, this.locale);
  443.                   break label63;
  444.                case 3:
  445.                case 4:
  446.                   var6 = DateFormat.getTimeInstance(2, this.locale);
  447.                   break label63;
  448.                case 5:
  449.                case 6:
  450.                   var6 = DateFormat.getTimeInstance(1, this.locale);
  451.                   break label63;
  452.                case 7:
  453.                case 8:
  454.                   var6 = DateFormat.getTimeInstance(0, this.locale);
  455.                   break label63;
  456.                default:
  457.                   var6 = DateFormat.getTimeInstance(2, this.locale);
  458.  
  459.                   try {
  460.                      ((SimpleDateFormat)var6).applyPattern(var3[3].toString());
  461.                      break label63;
  462.                   } catch (Exception var9) {
  463.                      this.maxOffset = var5;
  464.                      throw new IllegalArgumentException("Pattern incorrect or locale does not support formats, error at ");
  465.                   }
  466.             }
  467.          case 7:
  468.          case 8:
  469.             try {
  470.                var6 = new ChoiceFormat(var3[3].toString());
  471.                break;
  472.             } catch (Exception var8) {
  473.                this.maxOffset = var5;
  474.                throw new IllegalArgumentException("Choice Pattern incorrect, error at ");
  475.             }
  476.          default:
  477.             this.maxOffset = var5;
  478.             throw new IllegalArgumentException("unknown format type at ");
  479.       }
  480.  
  481.       this.formats[var2] = (Format)var6;
  482.       var3[1].setLength(0);
  483.       var3[2].setLength(0);
  484.       var3[3].setLength(0);
  485.    }
  486.  
  487.    private static final int findKeyword(String var0, String[] var1) {
  488.       var0 = var0.trim().toLowerCase();
  489.  
  490.       for(int var2 = 0; var2 < var1.length; ++var2) {
  491.          if (var0.equals(var1[var2])) {
  492.             return var2;
  493.          }
  494.       }
  495.  
  496.       return -1;
  497.    }
  498.  
  499.    NumberFormat getIntegerFormat(Locale var1) {
  500.       NumberFormat var2 = NumberFormat.getInstance(var1);
  501.       if (var2 instanceof DecimalFormat) {
  502.          DecimalFormat var3 = (DecimalFormat)var2;
  503.          var3.setMaximumFractionDigits(0);
  504.          var3.setDecimalSeparatorAlwaysShown(false);
  505.          ((NumberFormat)var3).setParseIntegerOnly(true);
  506.       }
  507.  
  508.       return var2;
  509.    }
  510.  
  511.    private static final void copyAndFixQuotes(String var0, int var1, int var2, StringBuffer var3) {
  512.       for(int var4 = var1; var4 < var2; ++var4) {
  513.          char var5 = var0.charAt(var4);
  514.          if (var5 == '{') {
  515.             var3.append("'{'");
  516.          } else if (var5 == '}') {
  517.             var3.append("'}'");
  518.          } else if (var5 == '\'') {
  519.             var3.append("''");
  520.          } else {
  521.             var3.append(var5);
  522.          }
  523.       }
  524.  
  525.    }
  526.  
  527.    private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
  528.       var1.defaultReadObject();
  529.       boolean var2 = this.maxOffset >= -1 && this.maxOffset < 10 && this.formats.length == 10 && this.offsets.length == 10 && this.argumentNumbers.length == 10;
  530.       if (var2) {
  531.          int var3 = this.pattern.length() + 1;
  532.  
  533.          for(int var4 = this.maxOffset; var4 >= 0; --var4) {
  534.             if (this.offsets[var4] < 0 || this.offsets[var4] > var3) {
  535.                var2 = false;
  536.                break;
  537.             }
  538.  
  539.             var3 = this.offsets[var4];
  540.          }
  541.       }
  542.  
  543.       if (!var2) {
  544.          throw new InvalidObjectException("Could not reconstruct MessageFormat from corrupt stream.");
  545.       }
  546.    }
  547. }
  548.