]> gitweb.fperrin.net Git - Dictionary.git/blobdiff - src/com/hughes/android/dictionary/engine/TransliteratorManager.java
Clean up order of imports.
[Dictionary.git] / src / com / hughes / android / dictionary / engine / TransliteratorManager.java
index 4024c681ab7df2c57208e82539b373fbf187c99a..4dfb2b67d9ccf85a114eb847b7e5b5171c16c48e 100644 (file)
@@ -17,54 +17,79 @@ package com.hughes.android.dictionary.engine;
 import java.util.ArrayList;
 import java.util.List;
 
+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<Callback> callbacks = new ArrayList<TransliteratorManager.Callback>();
-  
-  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<String, Transliterator> cache = new LRUCacheMap<>(4);
+
+    // Whom to notify when we're all set up and ready to go.
+    private static final List<Callback> 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<Callback> 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<Callback> callbacks = new ArrayList<TransliteratorManager.Callback>();
-      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();
-  }
 
 }