import java.util.ArrayList;
import java.util.List;
+import com.hughes.util.LRUCacheMap;
+
public class TransliteratorManager {
private static boolean starting = false;
private static boolean ready = false;
+ private static LRUCacheMap<String, Transliterator> cache = new LRUCacheMap<String, Transliterator>(4);
// Whom to notify when we're all set up and ready to go.
private static List<Callback> callbacks = new ArrayList<TransliteratorManager.Callback>();
+ public static Transliterator get(String rules) {
+ // DO NOT make the method synchronized!
+ // synchronizing on the class would break the whole
+ // asynchronous init concept, since the runnable
+ // then holds the same lock as the init function needs.
+ Transliterator result = null;
+ synchronized (cache) {
+ result = cache.get(rules);
+ if (result == null) {
+ result = Transliterator.createFromRules("", rules, Transliterator.FORWARD);
+ cache.put(rules, result);
+ }
+ }
+ return result;
+ }
+
public static synchronized boolean init(final Callback callback) {
if (ready) {
return true;
@Override
public void run() {
System.out.println("Starting Transliterator load.");
- final String transliterated =
- Transliterator
- .createFromRules(
- "",
- Language.en.getDefaultNormalizerRules(),
- Transliterator.FORWARD).transliterate("Îñţérñåţîöñåļîžåţîờñ");
+ final String transliterated = get(Language.en.getDefaultNormalizerRules()).transliterate("Îñţérñåţîöñåļîžåţîờñ");
if (!"internationalization".equals(transliterated)) {
System.out.println("Wrong transliteration: " + transliterated);
}