X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2Fengine%2FTransliteratorManager.java;h=4dfb2b67d9ccf85a114eb847b7e5b5171c16c48e;hb=8674b09eae371994e01e0af541b546fced86c366;hp=50a7ca6a4b3ed8a8bee0148d3913c1bffc5182a4;hpb=319caebfa9fa020c44b61b7014cc8570bc14a2fa;p=Dictionary.git diff --git a/src/com/hughes/android/dictionary/engine/TransliteratorManager.java b/src/com/hughes/android/dictionary/engine/TransliteratorManager.java index 50a7ca6..4dfb2b6 100644 --- a/src/com/hughes/android/dictionary/engine/TransliteratorManager.java +++ b/src/com/hughes/android/dictionary/engine/TransliteratorManager.java @@ -1,58 +1,95 @@ +// Copyright 2011 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package com.hughes.android.dictionary.engine; import java.util.ArrayList; import java.util.List; -import android.util.Log; - +import com.hughes.util.LRUCacheMap; import com.ibm.icu.text.Transliterator; public class TransliteratorManager { - private static boolean starting = false; - private static boolean ready = false; - - private static List callbacks = new ArrayList(); - - public static synchronized boolean init(final Callback callback) { - if (ready) { - return true; + private static boolean starting = false; + private static boolean ready = false; + private static ThreadSetup threadSetup = null; + private static final LRUCacheMap cache = new LRUCacheMap<>(4); + + // Whom to notify when we're all set up and ready to go. + private static final List callbacks = new ArrayList<>(); + + 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; + synchronized (cache) { + result = cache.get(rules); + if (result == null) { + result = Transliterator.createFromRules("", rules, Transliterator.FORWARD); + cache.put(rules, result); + } + } + return result; } - if (callback != null) { - callbacks.add(callback); + + public static synchronized boolean init(final Callback callback, final ThreadSetup setupCallback) { + if (ready) { + return true; + } + if (callback != null) { + callbacks.add(callback); + } + if (!starting) { + starting = true; + threadSetup = setupCallback; + new Thread(init).start(); + } + return false; } - if (!starting) { - starting = true; - new Thread(init).start(); + + private static final Runnable init = new Runnable() { + @Override + public void run() { + synchronized (TransliteratorManager.class) { + if (threadSetup != null) threadSetup.onThreadStart(); + } + System.out.println("Starting Transliterator load."); + final String transliterated = get(Language.en.getDefaultNormalizerRules()).transliterate("Îñţérñåţîöñåļîžåţîờñ"); + if (!"internationalization".equals(transliterated)) { + System.out.println("Wrong transliteration: " + transliterated); + } + + final List callbacks; + synchronized (TransliteratorManager.class) { + callbacks = new ArrayList<>(TransliteratorManager.callbacks); + ready = true; + } + for (final Callback callback : callbacks) { + callback.onTransliteratorReady(); + } + } + }; + + public interface ThreadSetup { + void onThreadStart(); } - return false; - } - - private static final Runnable init = new Runnable() { - @Override - public void run() { - System.out.println("Starting Transliterator load."); - final String transliterated = - Transliterator.createFromRules("", ":: Any-Latin; :: Lower; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC ;", - Transliterator.FORWARD).transliterate("Îñţérñåţîöñåļîžåţîờñ"); - if (!"internationalization".equals(transliterated)) { - System.out.println("Wrong transliteratation: " + transliterated); - } - - final List callbacks = new ArrayList(); - synchronized (TransliteratorManager.class) { - callbacks.addAll(TransliteratorManager.callbacks); - ready = true; - } - for (final Callback callback : callbacks) { - callback.onTransliteratorReady(); - } + + public interface Callback { + void onTransliteratorReady(); } - }; - - - public interface Callback { - void onTransliteratorReady(); - } }