home *** CD-ROM | disk | FTP | other *** search
- package java.text;
-
- import java.util.Vector;
-
- public class RuleBasedCollator extends Collator {
- static final long serialVersionUID = 2822366911447564107L;
- static int CHARINDEX = 1879048192;
- static int EXPANDCHARINDEX = 2113929216;
- static int CONTRACTCHARINDEX = 2130706432;
- static int UNMAPPED = -1;
- private static final int SHORT_MAX_VALUE = 32767;
- private static final int PRIMARYORDERINCREMENT = 65536;
- private static final int MAXIGNORABLE = 65536;
- private static final int SECONDARYORDERINCREMENT = 256;
- private static final int TERTIARYORDERINCREMENT = 1;
- static final int PRIMARYORDERMASK = -65536;
- static final int SECONDARYORDERMASK = 65280;
- static final int TERTIARYORDERMASK = 255;
- static final int PRIMARYDIFFERENCEONLY = -65536;
- static final int SECONDARYDIFFERENCEONLY = -256;
- private static final int SECONDARYRESETMASK = 65535;
- private static final int IGNORABLEMASK = 65535;
- private static final int INITIALTABLESIZE = 20;
- private static final int MAXKEYSIZE = 5;
- static int PRIMARYORDERSHIFT = 16;
- static int SECONDARYORDERSHIFT = 8;
- private static final int MAXTOKENLEN = 256;
- private static final int MAXRULELEN = 512;
- private static final int COLLATIONKEYOFFSET = 1;
- private boolean isFrenchSec = false;
- private String ruleTable;
- private CompactIntArray mapping;
- private Vector contractTable;
- private Vector expandTable;
- private transient MergeCollation mPattern;
- private transient boolean isOverIgnore = false;
- private transient int currentOrder;
- private transient short maxSecOrder;
- private transient short maxTerOrder;
- private transient char lastChar;
- private transient StringBuffer key = new StringBuffer(5);
- private transient int strengthResult = 3;
- private transient StringBuffer primResult = new StringBuffer(256);
- private transient StringBuffer secResult = new StringBuffer(256);
- private transient StringBuffer terResult = new StringBuffer(256);
-
- public RuleBasedCollator(String var1) throws ParseException {
- ((Collator)this).setStrength(2);
- this.build(var1);
- }
-
- public String getRules() {
- if (this.ruleTable == null) {
- this.ruleTable = this.mPattern.emitPattern();
- this.mPattern = null;
- }
-
- return this.ruleTable;
- }
-
- public CollationElementIterator getCollationElementIterator(String var1) {
- return new CollationElementIterator(var1, this);
- }
-
- public int compare(String var1, String var2) {
- int var3 = 0;
- this.strengthResult = 3;
- CollationElementIterator var4 = new CollationElementIterator(var2, this);
- CollationElementIterator var5 = new CollationElementIterator(var1, this);
- int var6 = 0;
- int var7 = 0;
- int var8 = 0;
- int var9 = 0;
- boolean var10 = false;
- boolean var11 = true;
- boolean var12 = true;
-
- while(true) {
- int var13 = 0;
- int var14 = 0;
- if (var11) {
- var6 = var5.next();
- } else {
- var11 = true;
- }
-
- if (var12) {
- var7 = var4.next();
- } else {
- var12 = true;
- }
-
- if (var6 == -1 || var7 == -1) {
- break;
- }
-
- var8 = var6;
- var9 = var7;
- if (var6 != var7) {
- var13 = CollationElementIterator.primaryOrder(var6);
- var14 = CollationElementIterator.primaryOrder(var7);
- if (var13 == var14) {
- var3 = this.checkSecTerDiff(var6, var7, var3, var10);
- if (this.isFrenchSec && CollationElementIterator.isIgnorable(var6) && CollationElementIterator.isIgnorable(var7)) {
- var10 = true;
- } else {
- var10 = false;
- }
- } else if (var6 == 0) {
- var12 = false;
- } else if (var7 == 0) {
- var11 = false;
- } else if (var13 == 0) {
- if (var14 == 0) {
- var3 = this.checkSecTerDiff(var6, var7, var3, false);
- var10 = true;
- } else {
- if (!this.isFrenchSec && (var3 == 0 || this.strengthResult > 1) || this.isFrenchSec && !var10) {
- this.strengthResult = 1;
- var3 = 1;
- }
-
- var12 = false;
- var10 = false;
- }
- } else {
- if (var14 != 0) {
- if (var13 < var14) {
- var3 = -1;
- } else {
- var3 = 1;
- }
- break;
- }
-
- if (!this.isFrenchSec && (var3 == 0 || this.strengthResult > 1) || this.isFrenchSec && !var10) {
- var3 = -1;
- this.strengthResult = 1;
- }
-
- var11 = false;
- var10 = false;
- }
- }
- }
-
- if (var6 != -1) {
- if (var7 == -1) {
- do {
- if (CollationElementIterator.primaryOrder(var6) != 0) {
- return 1;
- }
-
- if (CollationElementIterator.secondaryOrder(var6) != 0 && (!CollationElementIterator.isIgnorable(var9) || this.strengthResult > 1)) {
- var3 = this.checkSecTerDiff(var6, 0, var3, false);
- }
- } while((var6 = var5.next()) != -1);
- }
- } else if (var7 != -1) {
- do {
- if (CollationElementIterator.primaryOrder(var7) != 0) {
- return -1;
- }
-
- if (CollationElementIterator.secondaryOrder(var7) != 0 && (!CollationElementIterator.isIgnorable(var8) || this.strengthResult > 1)) {
- var3 = this.checkSecTerDiff(0, var7, var3, false);
- }
- } while((var7 = var4.next()) != -1);
- }
-
- if (var3 == 0 && ((Collator)this).getStrength() == 3) {
- var3 = DecompositionIterator.decompose(var1, ((Collator)this).getDecomposition()).compareTo(DecompositionIterator.decompose(var2, ((Collator)this).getDecomposition()));
- }
-
- return var3;
- }
-
- public CollationKey getCollationKey(String var1) {
- if (var1 == null) {
- return null;
- } else {
- this.primResult.setLength(0);
- this.secResult.setLength(0);
- this.terResult.setLength(0);
- int var2 = 0;
- boolean var3 = ((Collator)this).getStrength() >= 1;
- boolean var4 = ((Collator)this).getStrength() >= 2;
- short var5 = -1;
- short var6 = -1;
- int var7 = 0;
- CollationElementIterator var8 = new CollationElementIterator(var1, this);
-
- while((var2 = var8.next()) != -1) {
- var5 = CollationElementIterator.secondaryOrder(var2);
- var6 = CollationElementIterator.tertiaryOrder(var2);
- if (!CollationElementIterator.isIgnorable(var2)) {
- this.primResult.append((char)(CollationElementIterator.primaryOrder(var2) + 1));
- if (var3) {
- if (this.isFrenchSec && var7 < this.secResult.length()) {
- this.reverse(this.secResult, var7, this.secResult.length());
- }
-
- this.secResult.append((char)(var5 + 1));
- var7 = this.secResult.length();
- }
-
- if (var4) {
- this.terResult.append((char)(var6 + 1));
- }
- } else {
- if (var3 && var5 != 0) {
- this.secResult.append((char)(var5 + this.maxSecOrder + 1));
- }
-
- if (var4 && var6 != 0) {
- this.terResult.append((char)(var6 + this.maxTerOrder + 1));
- }
- }
- }
-
- if (this.isFrenchSec) {
- if (var7 < this.secResult.length()) {
- this.reverse(this.secResult, var7, this.secResult.length());
- }
-
- this.reverse(this.secResult, 0, this.secResult.length());
- }
-
- this.primResult.append('\u0000');
- this.secResult.append('\u0000');
- this.secResult.append(this.terResult.toString());
- this.primResult.append(this.secResult.toString());
- if (((Collator)this).getStrength() == 3) {
- this.primResult.append('\u0000');
- this.primResult.append(DecompositionIterator.decompose(var1, ((Collator)this).getDecomposition()));
- }
-
- return new CollationKey(var1, this.primResult.toString());
- }
- }
-
- public Object clone() {
- RuleBasedCollator var1 = (RuleBasedCollator)super.clone();
- var1.primResult = new StringBuffer(256);
- var1.secResult = new StringBuffer(256);
- var1.terResult = new StringBuffer(256);
- var1.key = new StringBuffer(5);
- return var1;
- }
-
- public boolean equals(Object var1) {
- if (var1 == null) {
- return false;
- } else if (!super.equals(var1)) {
- return false;
- } else {
- RuleBasedCollator var2 = (RuleBasedCollator)var1;
- return this.getRules().equals(var2.getRules());
- }
- }
-
- public int hashCode() {
- return this.getRules().hashCode();
- }
-
- private void build(String var1) throws ParseException {
- boolean var2 = false;
- if (var1.length() == 0) {
- throw new ParseException("Build rules empty.", 0);
- } else {
- this.mapping = new CompactIntArray(UNMAPPED);
- var1 = DecompositionIterator.decompose(var1, ((Collator)this).getDecomposition());
- this.mPattern = new MergeCollation(var1);
-
- for(int var8 = 0; var8 < this.mPattern.getCount(); ++var8) {
- PatternEntry var5 = this.mPattern.getItemAt(var8);
- if (var5 != null) {
- String var4 = var5.getChars();
- if (var4.length() > 1 && var4.charAt(var4.length() - 1) == '@') {
- this.isFrenchSec = true;
- var4 = var4.substring(0, var4.length() - 1);
- }
-
- String var3 = var5.getExtension();
- if (var3.length() != 0) {
- this.addExpandOrder(var4, var3, var5.getStrength());
- } else if (var4.length() > 1) {
- this.addContractOrder(var4, var5.getStrength());
- this.lastChar = var4.charAt(0);
- } else {
- char var6 = var4.charAt(0);
- this.addOrder(var6, var5.getStrength());
- this.lastChar = var6;
- }
- }
- }
-
- this.commit();
- this.mapping.compact();
- }
- }
-
- private final void commit() {
- if (this.expandTable != null) {
- for(int var1 = 0; var1 < this.expandTable.size(); ++var1) {
- int[] var2 = (int[])this.expandTable.elementAt(var1);
-
- for(int var3 = 0; var3 < var2.length; ++var3) {
- if (var2[var3] < EXPANDCHARINDEX && var2[var3] > CHARINDEX) {
- char var4 = (char)(var2[var3] - CHARINDEX);
- int var5 = this.mapping.elementAt(var4);
- if (var5 == UNMAPPED) {
- var2[var3] = '\uffff' & var2[var3 - 1];
- } else if (var5 >= CONTRACTCHARINDEX) {
- Object var6 = null;
- Vector var7 = (Vector)this.contractTable.elementAt(var5 - CONTRACTCHARINDEX);
- EntryPair var8 = (EntryPair)var7.firstElement();
- var2[var3] = var8.value;
- } else {
- var2[var3] = var5;
- }
- }
- }
- }
- }
-
- }
-
- private final int increment(int var1, int var2) {
- switch (var1) {
- case 0:
- var2 += 65536;
- var2 &= -65536;
- this.isOverIgnore = true;
- break;
- case 1:
- var2 += 256;
- var2 &= -256;
- if (!this.isOverIgnore) {
- ++this.maxSecOrder;
- }
- break;
- case 2:
- ++var2;
- if (!this.isOverIgnore) {
- ++this.maxTerOrder;
- }
- }
-
- return var2;
- }
-
- private final void addOrder(char var1, int var2) {
- int var3 = this.mapping.elementAt(var1);
- if (var3 >= CONTRACTCHARINDEX) {
- this.key.setLength(0);
- this.key.append(var1);
- this.addContractOrder(this.key.toString(), var2);
- } else {
- this.currentOrder = this.increment(var2, this.currentOrder);
- this.mapping.setElementAt(var1, this.currentOrder);
- }
- }
-
- private final void addContractOrder(String var1, int var2) {
- if (this.contractTable == null) {
- this.contractTable = new Vector(20);
- }
-
- if (var2 != 3) {
- this.currentOrder = this.increment(var2, this.currentOrder);
- }
-
- int var3 = this.mapping.elementAt(var1.charAt(0));
- Vector var4 = this.getContractValues(var3 - CONTRACTCHARINDEX);
- if (var4 != null) {
- int var8 = this.getEntry(var4, var1);
- if (var8 != UNMAPPED) {
- EntryPair var6 = (EntryPair)var4.elementAt(var8);
- var6.value = this.currentOrder;
- } else {
- var4.addElement(new EntryPair(var1, this.currentOrder));
- }
- } else {
- var4 = new Vector(20);
- int var5 = CONTRACTCHARINDEX + this.contractTable.size();
- var4.addElement(new EntryPair(var1.substring(0, 1), var3));
- var4.addElement(new EntryPair(var1, this.currentOrder));
- this.contractTable.addElement(var4);
- this.mapping.setElementAt(var1.charAt(0), var5);
- }
- }
-
- private final int getEntry(Vector var1, String var2) {
- for(int var3 = 0; var3 < var1.size(); ++var3) {
- EntryPair var4 = (EntryPair)var1.elementAt(var3);
- if (var4.entryName.equals(var2)) {
- return var3;
- }
- }
-
- return UNMAPPED;
- }
-
- Vector getContractValues(char var1) {
- int var2 = this.mapping.elementAt(var1);
- return this.getContractValues(var2 - CONTRACTCHARINDEX);
- }
-
- Vector getContractValues(int var1) {
- return var1 >= 0 ? (Vector)this.contractTable.elementAt(var1) : null;
- }
-
- private final void addExpandOrder(String var1, String var2, int var3) throws ParseException {
- EntryPair var4 = new EntryPair();
- if (this.expandTable == null) {
- this.expandTable = new Vector(20);
- }
-
- int var5 = EXPANDCHARINDEX + this.expandTable.size();
- this.key.setLength(0);
- int var6 = UNMAPPED;
- if (var1.length() > 1) {
- this.addContractOrder(var1, var3);
- this.lastChar = var1.charAt(0);
- Vector var7 = this.getContractValues(var1.charAt(0));
- int var8 = UNMAPPED;
- var8 = this.getEntry(var7, var1);
- if (var8 != UNMAPPED) {
- var4 = (EntryPair)var7.elementAt(var8);
- var6 = var4.value;
- }
-
- var4.entryName = var1;
- var4.value = var5;
- } else {
- char var14 = var1.charAt(0);
- if (this.mapping.elementAt(var14) == UNMAPPED) {
- this.addOrder(var14, var3);
- this.lastChar = var14;
- var6 = this.mapping.elementAt(this.lastChar);
- } else {
- var6 = this.increment(var3, this.mapping.elementAt(this.lastChar));
- }
-
- this.mapping.setElementAt(var14, var5);
- }
-
- int[] var15 = new int[var2.length() + 1];
- var15[0] = var6;
-
- for(int var17 = 0; var17 < var2.length(); ++var17) {
- int var9 = this.mapping.elementAt(var2.charAt(var17));
- if (var9 >= CONTRACTCHARINDEX) {
- this.key.append(var2.charAt(var17));
- int var10 = CHARINDEX + var2.charAt(var17);
- Vector var11 = this.getContractValues(var2.charAt(var17));
- if (var11 != null) {
- int var12 = UNMAPPED;
- var12 = this.getEntry(var11, this.key.toString());
- if (var12 != UNMAPPED) {
- var4 = (EntryPair)var11.elementAt(var12);
- var10 = var4.value;
- }
- }
-
- this.key.setLength(0);
- var15[var17 + 1] = var10;
- } else if (var9 != UNMAPPED) {
- var15[var17 + 1] = var9;
- } else {
- var15[var17 + 1] = CHARINDEX + var2.charAt(var17);
- }
- }
-
- this.expandTable.addElement(var15);
- }
-
- final int[] getExpandValueList(char var1) {
- int var2 = this.mapping.elementAt(var1);
- if (var2 >= EXPANDCHARINDEX && var2 < CONTRACTCHARINDEX) {
- int var3 = var2 - EXPANDCHARINDEX;
- return (int[])this.expandTable.elementAt(var3);
- } else {
- return null;
- }
- }
-
- final int[] getExpandValueList(int var1) {
- return var1 < this.expandTable.size() ? (int[])this.expandTable.elementAt(var1) : null;
- }
-
- final int getUnicodeOrder(char var1) {
- return this.mapping.elementAt(var1);
- }
-
- private final int checkSecTerDiff(int var1, int var2, int var3, boolean var4) {
- int var5 = var3;
- if (CollationElementIterator.secondaryOrder(var1) != CollationElementIterator.secondaryOrder(var2)) {
- if (!this.isFrenchSec && (var3 == 0 || this.strengthResult > 1) || this.isFrenchSec && !var4) {
- this.strengthResult = 1;
- if (CollationElementIterator.secondaryOrder(var1) < CollationElementIterator.secondaryOrder(var2)) {
- var5 = -1;
- } else {
- var5 = 1;
- }
- }
- } else if (CollationElementIterator.tertiaryOrder(var1) != CollationElementIterator.tertiaryOrder(var2) && var3 == 0) {
- this.strengthResult = 2;
- if (CollationElementIterator.tertiaryOrder(var1) < CollationElementIterator.tertiaryOrder(var2)) {
- var5 = -1;
- } else {
- var5 = 1;
- }
- }
-
- return var5;
- }
-
- private final void reverse(StringBuffer var1, int var2, int var3) {
- int var4 = var2;
-
- for(int var6 = var3 - 1; var4 < var6; --var6) {
- char var5 = var1.charAt(var4);
- var1.setCharAt(var4, var1.charAt(var6));
- var1.setCharAt(var6, var5);
- ++var4;
- }
-
- }
- }
-