home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1999 April / DPPCPRO0499.ISO / April / Notes / 50b2wic.exe / DATA1.CAB / NotesProgramFilesJavaSupport / rt.jar / java / text / RuleBasedCollator.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-04-23  |  9.1 KB  |  532 lines

  1. package java.text;
  2.  
  3. import java.util.Vector;
  4.  
  5. public class RuleBasedCollator extends Collator {
  6.    static final long serialVersionUID = 2822366911447564107L;
  7.    static int CHARINDEX = 1879048192;
  8.    static int EXPANDCHARINDEX = 2113929216;
  9.    static int CONTRACTCHARINDEX = 2130706432;
  10.    static int UNMAPPED = -1;
  11.    private static final int SHORT_MAX_VALUE = 32767;
  12.    private static final int PRIMARYORDERINCREMENT = 65536;
  13.    private static final int MAXIGNORABLE = 65536;
  14.    private static final int SECONDARYORDERINCREMENT = 256;
  15.    private static final int TERTIARYORDERINCREMENT = 1;
  16.    static final int PRIMARYORDERMASK = -65536;
  17.    static final int SECONDARYORDERMASK = 65280;
  18.    static final int TERTIARYORDERMASK = 255;
  19.    static final int PRIMARYDIFFERENCEONLY = -65536;
  20.    static final int SECONDARYDIFFERENCEONLY = -256;
  21.    private static final int SECONDARYRESETMASK = 65535;
  22.    private static final int IGNORABLEMASK = 65535;
  23.    private static final int INITIALTABLESIZE = 20;
  24.    private static final int MAXKEYSIZE = 5;
  25.    static int PRIMARYORDERSHIFT = 16;
  26.    static int SECONDARYORDERSHIFT = 8;
  27.    private static final int MAXTOKENLEN = 256;
  28.    private static final int MAXRULELEN = 512;
  29.    private static final int COLLATIONKEYOFFSET = 1;
  30.    private boolean isFrenchSec = false;
  31.    private String ruleTable;
  32.    private CompactIntArray mapping;
  33.    private Vector contractTable;
  34.    private Vector expandTable;
  35.    private transient MergeCollation mPattern;
  36.    private transient boolean isOverIgnore = false;
  37.    private transient int currentOrder;
  38.    private transient short maxSecOrder;
  39.    private transient short maxTerOrder;
  40.    private transient char lastChar;
  41.    private transient StringBuffer key = new StringBuffer(5);
  42.    private transient int strengthResult = 3;
  43.    private transient StringBuffer primResult = new StringBuffer(256);
  44.    private transient StringBuffer secResult = new StringBuffer(256);
  45.    private transient StringBuffer terResult = new StringBuffer(256);
  46.  
  47.    public RuleBasedCollator(String var1) throws ParseException {
  48.       ((Collator)this).setStrength(2);
  49.       this.build(var1);
  50.    }
  51.  
  52.    public String getRules() {
  53.       if (this.ruleTable == null) {
  54.          this.ruleTable = this.mPattern.emitPattern();
  55.          this.mPattern = null;
  56.       }
  57.  
  58.       return this.ruleTable;
  59.    }
  60.  
  61.    public CollationElementIterator getCollationElementIterator(String var1) {
  62.       return new CollationElementIterator(var1, this);
  63.    }
  64.  
  65.    public int compare(String var1, String var2) {
  66.       int var3 = 0;
  67.       this.strengthResult = 3;
  68.       CollationElementIterator var4 = new CollationElementIterator(var2, this);
  69.       CollationElementIterator var5 = new CollationElementIterator(var1, this);
  70.       int var6 = 0;
  71.       int var7 = 0;
  72.       int var8 = 0;
  73.       int var9 = 0;
  74.       boolean var10 = false;
  75.       boolean var11 = true;
  76.       boolean var12 = true;
  77.  
  78.       while(true) {
  79.          int var13 = 0;
  80.          int var14 = 0;
  81.          if (var11) {
  82.             var6 = var5.next();
  83.          } else {
  84.             var11 = true;
  85.          }
  86.  
  87.          if (var12) {
  88.             var7 = var4.next();
  89.          } else {
  90.             var12 = true;
  91.          }
  92.  
  93.          if (var6 == -1 || var7 == -1) {
  94.             break;
  95.          }
  96.  
  97.          var8 = var6;
  98.          var9 = var7;
  99.          if (var6 != var7) {
  100.             var13 = CollationElementIterator.primaryOrder(var6);
  101.             var14 = CollationElementIterator.primaryOrder(var7);
  102.             if (var13 == var14) {
  103.                var3 = this.checkSecTerDiff(var6, var7, var3, var10);
  104.                if (this.isFrenchSec && CollationElementIterator.isIgnorable(var6) && CollationElementIterator.isIgnorable(var7)) {
  105.                   var10 = true;
  106.                } else {
  107.                   var10 = false;
  108.                }
  109.             } else if (var6 == 0) {
  110.                var12 = false;
  111.             } else if (var7 == 0) {
  112.                var11 = false;
  113.             } else if (var13 == 0) {
  114.                if (var14 == 0) {
  115.                   var3 = this.checkSecTerDiff(var6, var7, var3, false);
  116.                   var10 = true;
  117.                } else {
  118.                   if (!this.isFrenchSec && (var3 == 0 || this.strengthResult > 1) || this.isFrenchSec && !var10) {
  119.                      this.strengthResult = 1;
  120.                      var3 = 1;
  121.                   }
  122.  
  123.                   var12 = false;
  124.                   var10 = false;
  125.                }
  126.             } else {
  127.                if (var14 != 0) {
  128.                   if (var13 < var14) {
  129.                      var3 = -1;
  130.                   } else {
  131.                      var3 = 1;
  132.                   }
  133.                   break;
  134.                }
  135.  
  136.                if (!this.isFrenchSec && (var3 == 0 || this.strengthResult > 1) || this.isFrenchSec && !var10) {
  137.                   var3 = -1;
  138.                   this.strengthResult = 1;
  139.                }
  140.  
  141.                var11 = false;
  142.                var10 = false;
  143.             }
  144.          }
  145.       }
  146.  
  147.       if (var6 != -1) {
  148.          if (var7 == -1) {
  149.             do {
  150.                if (CollationElementIterator.primaryOrder(var6) != 0) {
  151.                   return 1;
  152.                }
  153.  
  154.                if (CollationElementIterator.secondaryOrder(var6) != 0 && (!CollationElementIterator.isIgnorable(var9) || this.strengthResult > 1)) {
  155.                   var3 = this.checkSecTerDiff(var6, 0, var3, false);
  156.                }
  157.             } while((var6 = var5.next()) != -1);
  158.          }
  159.       } else if (var7 != -1) {
  160.          do {
  161.             if (CollationElementIterator.primaryOrder(var7) != 0) {
  162.                return -1;
  163.             }
  164.  
  165.             if (CollationElementIterator.secondaryOrder(var7) != 0 && (!CollationElementIterator.isIgnorable(var8) || this.strengthResult > 1)) {
  166.                var3 = this.checkSecTerDiff(0, var7, var3, false);
  167.             }
  168.          } while((var7 = var4.next()) != -1);
  169.       }
  170.  
  171.       if (var3 == 0 && ((Collator)this).getStrength() == 3) {
  172.          var3 = DecompositionIterator.decompose(var1, ((Collator)this).getDecomposition()).compareTo(DecompositionIterator.decompose(var2, ((Collator)this).getDecomposition()));
  173.       }
  174.  
  175.       return var3;
  176.    }
  177.  
  178.    public CollationKey getCollationKey(String var1) {
  179.       if (var1 == null) {
  180.          return null;
  181.       } else {
  182.          this.primResult.setLength(0);
  183.          this.secResult.setLength(0);
  184.          this.terResult.setLength(0);
  185.          int var2 = 0;
  186.          boolean var3 = ((Collator)this).getStrength() >= 1;
  187.          boolean var4 = ((Collator)this).getStrength() >= 2;
  188.          short var5 = -1;
  189.          short var6 = -1;
  190.          int var7 = 0;
  191.          CollationElementIterator var8 = new CollationElementIterator(var1, this);
  192.  
  193.          while((var2 = var8.next()) != -1) {
  194.             var5 = CollationElementIterator.secondaryOrder(var2);
  195.             var6 = CollationElementIterator.tertiaryOrder(var2);
  196.             if (!CollationElementIterator.isIgnorable(var2)) {
  197.                this.primResult.append((char)(CollationElementIterator.primaryOrder(var2) + 1));
  198.                if (var3) {
  199.                   if (this.isFrenchSec && var7 < this.secResult.length()) {
  200.                      this.reverse(this.secResult, var7, this.secResult.length());
  201.                   }
  202.  
  203.                   this.secResult.append((char)(var5 + 1));
  204.                   var7 = this.secResult.length();
  205.                }
  206.  
  207.                if (var4) {
  208.                   this.terResult.append((char)(var6 + 1));
  209.                }
  210.             } else {
  211.                if (var3 && var5 != 0) {
  212.                   this.secResult.append((char)(var5 + this.maxSecOrder + 1));
  213.                }
  214.  
  215.                if (var4 && var6 != 0) {
  216.                   this.terResult.append((char)(var6 + this.maxTerOrder + 1));
  217.                }
  218.             }
  219.          }
  220.  
  221.          if (this.isFrenchSec) {
  222.             if (var7 < this.secResult.length()) {
  223.                this.reverse(this.secResult, var7, this.secResult.length());
  224.             }
  225.  
  226.             this.reverse(this.secResult, 0, this.secResult.length());
  227.          }
  228.  
  229.          this.primResult.append('\u0000');
  230.          this.secResult.append('\u0000');
  231.          this.secResult.append(this.terResult.toString());
  232.          this.primResult.append(this.secResult.toString());
  233.          if (((Collator)this).getStrength() == 3) {
  234.             this.primResult.append('\u0000');
  235.             this.primResult.append(DecompositionIterator.decompose(var1, ((Collator)this).getDecomposition()));
  236.          }
  237.  
  238.          return new CollationKey(var1, this.primResult.toString());
  239.       }
  240.    }
  241.  
  242.    public Object clone() {
  243.       RuleBasedCollator var1 = (RuleBasedCollator)super.clone();
  244.       var1.primResult = new StringBuffer(256);
  245.       var1.secResult = new StringBuffer(256);
  246.       var1.terResult = new StringBuffer(256);
  247.       var1.key = new StringBuffer(5);
  248.       return var1;
  249.    }
  250.  
  251.    public boolean equals(Object var1) {
  252.       if (var1 == null) {
  253.          return false;
  254.       } else if (!super.equals(var1)) {
  255.          return false;
  256.       } else {
  257.          RuleBasedCollator var2 = (RuleBasedCollator)var1;
  258.          return this.getRules().equals(var2.getRules());
  259.       }
  260.    }
  261.  
  262.    public int hashCode() {
  263.       return this.getRules().hashCode();
  264.    }
  265.  
  266.    private void build(String var1) throws ParseException {
  267.       boolean var2 = false;
  268.       if (var1.length() == 0) {
  269.          throw new ParseException("Build rules empty.", 0);
  270.       } else {
  271.          this.mapping = new CompactIntArray(UNMAPPED);
  272.          var1 = DecompositionIterator.decompose(var1, ((Collator)this).getDecomposition());
  273.          this.mPattern = new MergeCollation(var1);
  274.  
  275.          for(int var8 = 0; var8 < this.mPattern.getCount(); ++var8) {
  276.             PatternEntry var5 = this.mPattern.getItemAt(var8);
  277.             if (var5 != null) {
  278.                String var4 = var5.getChars();
  279.                if (var4.length() > 1 && var4.charAt(var4.length() - 1) == '@') {
  280.                   this.isFrenchSec = true;
  281.                   var4 = var4.substring(0, var4.length() - 1);
  282.                }
  283.  
  284.                String var3 = var5.getExtension();
  285.                if (var3.length() != 0) {
  286.                   this.addExpandOrder(var4, var3, var5.getStrength());
  287.                } else if (var4.length() > 1) {
  288.                   this.addContractOrder(var4, var5.getStrength());
  289.                   this.lastChar = var4.charAt(0);
  290.                } else {
  291.                   char var6 = var4.charAt(0);
  292.                   this.addOrder(var6, var5.getStrength());
  293.                   this.lastChar = var6;
  294.                }
  295.             }
  296.          }
  297.  
  298.          this.commit();
  299.          this.mapping.compact();
  300.       }
  301.    }
  302.  
  303.    private final void commit() {
  304.       if (this.expandTable != null) {
  305.          for(int var1 = 0; var1 < this.expandTable.size(); ++var1) {
  306.             int[] var2 = (int[])this.expandTable.elementAt(var1);
  307.  
  308.             for(int var3 = 0; var3 < var2.length; ++var3) {
  309.                if (var2[var3] < EXPANDCHARINDEX && var2[var3] > CHARINDEX) {
  310.                   char var4 = (char)(var2[var3] - CHARINDEX);
  311.                   int var5 = this.mapping.elementAt(var4);
  312.                   if (var5 == UNMAPPED) {
  313.                      var2[var3] = '\uffff' & var2[var3 - 1];
  314.                   } else if (var5 >= CONTRACTCHARINDEX) {
  315.                      Object var6 = null;
  316.                      Vector var7 = (Vector)this.contractTable.elementAt(var5 - CONTRACTCHARINDEX);
  317.                      EntryPair var8 = (EntryPair)var7.firstElement();
  318.                      var2[var3] = var8.value;
  319.                   } else {
  320.                      var2[var3] = var5;
  321.                   }
  322.                }
  323.             }
  324.          }
  325.       }
  326.  
  327.    }
  328.  
  329.    private final int increment(int var1, int var2) {
  330.       switch (var1) {
  331.          case 0:
  332.             var2 += 65536;
  333.             var2 &= -65536;
  334.             this.isOverIgnore = true;
  335.             break;
  336.          case 1:
  337.             var2 += 256;
  338.             var2 &= -256;
  339.             if (!this.isOverIgnore) {
  340.                ++this.maxSecOrder;
  341.             }
  342.             break;
  343.          case 2:
  344.             ++var2;
  345.             if (!this.isOverIgnore) {
  346.                ++this.maxTerOrder;
  347.             }
  348.       }
  349.  
  350.       return var2;
  351.    }
  352.  
  353.    private final void addOrder(char var1, int var2) {
  354.       int var3 = this.mapping.elementAt(var1);
  355.       if (var3 >= CONTRACTCHARINDEX) {
  356.          this.key.setLength(0);
  357.          this.key.append(var1);
  358.          this.addContractOrder(this.key.toString(), var2);
  359.       } else {
  360.          this.currentOrder = this.increment(var2, this.currentOrder);
  361.          this.mapping.setElementAt(var1, this.currentOrder);
  362.       }
  363.    }
  364.  
  365.    private final void addContractOrder(String var1, int var2) {
  366.       if (this.contractTable == null) {
  367.          this.contractTable = new Vector(20);
  368.       }
  369.  
  370.       if (var2 != 3) {
  371.          this.currentOrder = this.increment(var2, this.currentOrder);
  372.       }
  373.  
  374.       int var3 = this.mapping.elementAt(var1.charAt(0));
  375.       Vector var4 = this.getContractValues(var3 - CONTRACTCHARINDEX);
  376.       if (var4 != null) {
  377.          int var8 = this.getEntry(var4, var1);
  378.          if (var8 != UNMAPPED) {
  379.             EntryPair var6 = (EntryPair)var4.elementAt(var8);
  380.             var6.value = this.currentOrder;
  381.          } else {
  382.             var4.addElement(new EntryPair(var1, this.currentOrder));
  383.          }
  384.       } else {
  385.          var4 = new Vector(20);
  386.          int var5 = CONTRACTCHARINDEX + this.contractTable.size();
  387.          var4.addElement(new EntryPair(var1.substring(0, 1), var3));
  388.          var4.addElement(new EntryPair(var1, this.currentOrder));
  389.          this.contractTable.addElement(var4);
  390.          this.mapping.setElementAt(var1.charAt(0), var5);
  391.       }
  392.    }
  393.  
  394.    private final int getEntry(Vector var1, String var2) {
  395.       for(int var3 = 0; var3 < var1.size(); ++var3) {
  396.          EntryPair var4 = (EntryPair)var1.elementAt(var3);
  397.          if (var4.entryName.equals(var2)) {
  398.             return var3;
  399.          }
  400.       }
  401.  
  402.       return UNMAPPED;
  403.    }
  404.  
  405.    Vector getContractValues(char var1) {
  406.       int var2 = this.mapping.elementAt(var1);
  407.       return this.getContractValues(var2 - CONTRACTCHARINDEX);
  408.    }
  409.  
  410.    Vector getContractValues(int var1) {
  411.       return var1 >= 0 ? (Vector)this.contractTable.elementAt(var1) : null;
  412.    }
  413.  
  414.    private final void addExpandOrder(String var1, String var2, int var3) throws ParseException {
  415.       EntryPair var4 = new EntryPair();
  416.       if (this.expandTable == null) {
  417.          this.expandTable = new Vector(20);
  418.       }
  419.  
  420.       int var5 = EXPANDCHARINDEX + this.expandTable.size();
  421.       this.key.setLength(0);
  422.       int var6 = UNMAPPED;
  423.       if (var1.length() > 1) {
  424.          this.addContractOrder(var1, var3);
  425.          this.lastChar = var1.charAt(0);
  426.          Vector var7 = this.getContractValues(var1.charAt(0));
  427.          int var8 = UNMAPPED;
  428.          var8 = this.getEntry(var7, var1);
  429.          if (var8 != UNMAPPED) {
  430.             var4 = (EntryPair)var7.elementAt(var8);
  431.             var6 = var4.value;
  432.          }
  433.  
  434.          var4.entryName = var1;
  435.          var4.value = var5;
  436.       } else {
  437.          char var14 = var1.charAt(0);
  438.          if (this.mapping.elementAt(var14) == UNMAPPED) {
  439.             this.addOrder(var14, var3);
  440.             this.lastChar = var14;
  441.             var6 = this.mapping.elementAt(this.lastChar);
  442.          } else {
  443.             var6 = this.increment(var3, this.mapping.elementAt(this.lastChar));
  444.          }
  445.  
  446.          this.mapping.setElementAt(var14, var5);
  447.       }
  448.  
  449.       int[] var15 = new int[var2.length() + 1];
  450.       var15[0] = var6;
  451.  
  452.       for(int var17 = 0; var17 < var2.length(); ++var17) {
  453.          int var9 = this.mapping.elementAt(var2.charAt(var17));
  454.          if (var9 >= CONTRACTCHARINDEX) {
  455.             this.key.append(var2.charAt(var17));
  456.             int var10 = CHARINDEX + var2.charAt(var17);
  457.             Vector var11 = this.getContractValues(var2.charAt(var17));
  458.             if (var11 != null) {
  459.                int var12 = UNMAPPED;
  460.                var12 = this.getEntry(var11, this.key.toString());
  461.                if (var12 != UNMAPPED) {
  462.                   var4 = (EntryPair)var11.elementAt(var12);
  463.                   var10 = var4.value;
  464.                }
  465.             }
  466.  
  467.             this.key.setLength(0);
  468.             var15[var17 + 1] = var10;
  469.          } else if (var9 != UNMAPPED) {
  470.             var15[var17 + 1] = var9;
  471.          } else {
  472.             var15[var17 + 1] = CHARINDEX + var2.charAt(var17);
  473.          }
  474.       }
  475.  
  476.       this.expandTable.addElement(var15);
  477.    }
  478.  
  479.    final int[] getExpandValueList(char var1) {
  480.       int var2 = this.mapping.elementAt(var1);
  481.       if (var2 >= EXPANDCHARINDEX && var2 < CONTRACTCHARINDEX) {
  482.          int var3 = var2 - EXPANDCHARINDEX;
  483.          return (int[])this.expandTable.elementAt(var3);
  484.       } else {
  485.          return null;
  486.       }
  487.    }
  488.  
  489.    final int[] getExpandValueList(int var1) {
  490.       return var1 < this.expandTable.size() ? (int[])this.expandTable.elementAt(var1) : null;
  491.    }
  492.  
  493.    final int getUnicodeOrder(char var1) {
  494.       return this.mapping.elementAt(var1);
  495.    }
  496.  
  497.    private final int checkSecTerDiff(int var1, int var2, int var3, boolean var4) {
  498.       int var5 = var3;
  499.       if (CollationElementIterator.secondaryOrder(var1) != CollationElementIterator.secondaryOrder(var2)) {
  500.          if (!this.isFrenchSec && (var3 == 0 || this.strengthResult > 1) || this.isFrenchSec && !var4) {
  501.             this.strengthResult = 1;
  502.             if (CollationElementIterator.secondaryOrder(var1) < CollationElementIterator.secondaryOrder(var2)) {
  503.                var5 = -1;
  504.             } else {
  505.                var5 = 1;
  506.             }
  507.          }
  508.       } else if (CollationElementIterator.tertiaryOrder(var1) != CollationElementIterator.tertiaryOrder(var2) && var3 == 0) {
  509.          this.strengthResult = 2;
  510.          if (CollationElementIterator.tertiaryOrder(var1) < CollationElementIterator.tertiaryOrder(var2)) {
  511.             var5 = -1;
  512.          } else {
  513.             var5 = 1;
  514.          }
  515.       }
  516.  
  517.       return var5;
  518.    }
  519.  
  520.    private final void reverse(StringBuffer var1, int var2, int var3) {
  521.       int var4 = var2;
  522.  
  523.       for(int var6 = var3 - 1; var4 < var6; --var6) {
  524.          char var5 = var1.charAt(var4);
  525.          var1.setCharAt(var4, var1.charAt(var6));
  526.          var1.setCharAt(var6, var5);
  527.          ++var4;
  528.       }
  529.  
  530.    }
  531. }
  532.