blob: d036c987af7544f4ccfaaf340569194dbdcb38d9 [file] [log] [blame]
/**
*******************************************************************************
* Copyright (C) 1996-2005, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*
*
*******************************************************************************
*/
package libcore.icu;
import java.text.CharacterIterator;
import java.text.CollationKey;
import java.text.ParseException;
import java.util.Locale;
public final class RuleBasedCollatorICU implements Cloneable {
// Values from the native UColAttributeValue enum.
public static final int VALUE_DEFAULT = -1;
public static final int VALUE_PRIMARY = 0;
public static final int VALUE_SECONDARY = 1;
public static final int VALUE_TERTIARY = 2;
public static final int VALUE_DEFAULT_STRENGTH = VALUE_TERTIARY;
public static final int VALUE_QUATERNARY = 3;
public static final int VALUE_IDENTICAL = 15;
public static final int VALUE_OFF = 16;
public static final int VALUE_ON = 17;
public static final int VALUE_SHIFTED = 20;
public static final int VALUE_NON_IGNORABLE = 21;
public static final int VALUE_LOWER_FIRST = 24;
public static final int VALUE_UPPER_FIRST = 25;
public static final int VALUE_ON_WITHOUT_HANGUL = 28;
public static final int VALUE_ATTRIBUTE_VALUE_COUNT = 29;
// Values from the UColAttribute enum.
public static final int FRENCH_COLLATION = 0;
public static final int ALTERNATE_HANDLING = 1;
public static final int CASE_FIRST = 2;
public static final int CASE_LEVEL = 3;
public static final int DECOMPOSITION_MODE = 4;
public static final int STRENGTH = 5;
// The address of the ICU4C native peer.
private int address;
public RuleBasedCollatorICU(String rules) throws ParseException {
if (rules == null) {
throw new NullPointerException();
}
address = NativeCollation.openCollatorFromRules(rules, VALUE_OFF, VALUE_DEFAULT_STRENGTH);
}
public RuleBasedCollatorICU(Locale locale) {
address = NativeCollation.openCollator(locale.toString());
}
private RuleBasedCollatorICU(int address) {
this.address = address;
}
public Object clone() {
return new RuleBasedCollatorICU(NativeCollation.safeClone(address));
}
public int compare(String source, String target) {
return NativeCollation.compare(address, source, target);
}
public int getDecomposition() {
return NativeCollation.getAttribute(address, DECOMPOSITION_MODE);
}
public void setDecomposition(int mode) {
NativeCollation.setAttribute(address, DECOMPOSITION_MODE, mode);
}
public int getStrength() {
return NativeCollation.getAttribute(address, STRENGTH);
}
public void setStrength(int strength) {
NativeCollation.setAttribute(address, STRENGTH, strength);
}
public void setAttribute(int type, int value) {
NativeCollation.setAttribute(address, type, value);
}
public int getAttribute(int type) {
return NativeCollation.getAttribute(address, type);
}
public CollationKey getCollationKey(String source) {
if (source == null) {
return null;
}
byte[] key = NativeCollation.getSortKey(address, source);
if (key == null) {
return null;
}
return new CollationKeyICU(source, key);
}
public String getRules() {
return NativeCollation.getRules(address);
}
public CollationElementIteratorICU getCollationElementIterator(String source) {
return CollationElementIteratorICU.getInstance(address, source);
}
public CollationElementIteratorICU getCollationElementIterator(CharacterIterator it) {
// We only implement the String-based API, so build a string from the iterator.
return getCollationElementIterator(characterIteratorToString(it));
}
private String characterIteratorToString(CharacterIterator it) {
StringBuilder result = new StringBuilder();
for (char ch = it.current(); ch != CharacterIterator.DONE; ch = it.next()) {
result.append(ch);
}
return result.toString();
}
@Override public int hashCode() {
return 42; // No-one uses RuleBasedCollatorICU as a hash key.
}
public boolean equals(String source, String target) {
return (compare(source, target) == 0);
}
@Override public boolean equals(Object object) {
if (object == this) {
return true;
}
if (!(object instanceof RuleBasedCollatorICU)) {
return false;
}
RuleBasedCollatorICU rhs = (RuleBasedCollatorICU) object;
return getRules().equals(rhs.getRules()) &&
getStrength() == rhs.getStrength() &&
getDecomposition() == rhs.getDecomposition();
}
@Override protected void finalize() throws Throwable {
try {
NativeCollation.closeCollator(address);
} finally {
super.finalize();
}
}
}