All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
studio.raptor.sqlparser.fast.value.CompareModeIcu4J Maven / Gradle / Ivy
/*
* Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0,
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package studio.raptor.sqlparser.fast.value;
import java.lang.reflect.Method;
import java.util.Comparator;
import java.util.Locale;
import studio.raptor.sqlparser.fast.message.ParseException;
import studio.raptor.sqlparser.fast.util.JdbcUtils;
import studio.raptor.sqlparser.fast.util.StringUtils;
/**
* An implementation of CompareMode that uses the ICU4J Collator.
*/
public class CompareModeIcu4J extends CompareMode {
private final Comparator collator;
protected CompareModeIcu4J(String name, int strength, boolean binaryUnsigned) {
super(name, strength, binaryUnsigned);
collator = getIcu4jCollator(name, strength);
}
@SuppressWarnings("unchecked")
private static Comparator getIcu4jCollator(String name, int strength) {
try {
Comparator result = null;
Class> collatorClass = JdbcUtils.loadUserClass(
"com.ibm.icu.text.Collator");
Method getInstanceMethod = collatorClass.getMethod(
"getInstance", Locale.class);
if (name.length() == 2) {
Locale locale = new Locale(StringUtils.toLowerEnglish(name), "");
if (compareLocaleNames(locale, name)) {
result = (Comparator) getInstanceMethod.invoke(null, locale);
}
} else if (name.length() == 5) {
// LL_CC (language_country)
int idx = name.indexOf('_');
if (idx >= 0) {
String language = StringUtils.toLowerEnglish(name.substring(0, idx));
String country = name.substring(idx + 1);
Locale locale = new Locale(language, country);
if (compareLocaleNames(locale, name)) {
result = (Comparator) getInstanceMethod.invoke(null, locale);
}
}
}
if (result == null) {
for (Locale locale : (Locale[]) collatorClass.getMethod(
"getAvailableLocales").invoke(null)) {
if (compareLocaleNames(locale, name)) {
result = (Comparator) getInstanceMethod.invoke(null, locale);
break;
}
}
}
if (result == null) {
throw ParseException.getInvalidValueException("collator", name);
}
collatorClass.getMethod("setStrength", int.class).invoke(result, strength);
return result;
} catch (Exception e) {
throw ParseException.convert(e);
}
}
@Override
public int compareString(String a, String b, boolean ignoreCase) {
if (ignoreCase) {
a = a.toUpperCase();
b = b.toUpperCase();
}
return collator.compare(a, b);
}
@Override
public boolean equalsChars(String a, int ai, String b, int bi,
boolean ignoreCase) {
return compareString(a.substring(ai, ai + 1), b.substring(bi, bi + 1),
ignoreCase) == 0;
}
}