| /** |
| ******************************************************************************* |
| * Copyright (C) 2001-2004, International Business Machines Corporation and * |
| * others. All Rights Reserved. * |
| ******************************************************************************* |
| */ |
| package com.ibm.icu.dev.test.util; |
| |
| import com.ibm.icu.impl.ICULocaleService; |
| import com.ibm.icu.impl.ICUService; |
| import com.ibm.icu.impl.LocaleUtility; |
| import com.ibm.icu.text.Collator; |
| |
| import java.util.EventListener; |
| import java.util.Iterator; |
| import java.util.Locale; |
| import java.util.Map; |
| import java.util.Map.Entry; |
| import java.util.Set; |
| import java.util.SortedMap; |
| |
| public class ICUServiceTestSample { |
| static public void main(String[] args) { |
| HelloServiceClient client = new HelloServiceClient(); |
| |
| Thread t = new HelloUpdateThread(); |
| t.start(); |
| try { |
| t.join(); |
| } |
| catch (InterruptedException e) { |
| } |
| System.out.println("done"); |
| if(client==null){ |
| } |
| } |
| |
| /** |
| * A class that displays the current names in the Hello service. |
| * Each time the service changes, it redisplays the names. |
| */ |
| static class HelloServiceClient implements HelloService.HelloServiceListener { |
| |
| HelloServiceClient() { |
| HelloService.addListener(this); |
| display(); |
| } |
| |
| |
| /** |
| * This will be called in the notification thread of |
| * ICUNotifier. ICUNotifier could spawn a (non-daemon) thread |
| * for each listener, so that impolite listeners wouldn't hold |
| * up notification, but right now it doesn't. Instead, all |
| * notifications are delivered on the notification thread. |
| * Since that's a daemon thread, a notification might not |
| * complete before main terminates. |
| */ |
| public void helloServiceChanged() { |
| display(); |
| } |
| |
| private void display() { |
| Map names = HelloService.getDisplayNames(Locale.US); |
| System.out.println("displaying " + names.size() + " names."); |
| Iterator iter = names.entrySet().iterator(); |
| while (iter.hasNext()) { |
| Entry entry = (Entry)iter.next(); |
| String displayName = (String)entry.getKey(); |
| HelloService service = HelloService.get((String)entry.getValue()); |
| System.out.println(displayName + " says " + service.hello()); |
| try { |
| Thread.sleep(50); |
| } |
| catch (InterruptedException e) { |
| } |
| } |
| System.out.println("----"); |
| } |
| } |
| |
| /** |
| * A thread to update the service. |
| */ |
| static class HelloUpdateThread extends Thread { |
| String[][] updates = { |
| { "Hey", "en_US_INFORMAL" }, |
| { "Hallo", "de_DE_INFORMAL" }, |
| { "Yo!", "en_US_CALIFORNIA_INFORMAL" }, |
| { "Chi Fanle Ma?", "zh__INFORMAL" }, |
| { "Munch munch... Burger?", "en" }, |
| { "Sniff", "fr" }, |
| { "TongZhi! MaoZeDong SiXiang Wan Sui!", "zh_CN" }, |
| { "Bier? Ja!", "de" }, |
| }; |
| public void run() { |
| for (int i = 0; i < updates.length; ++i) { |
| try { |
| Thread.sleep(500); |
| } |
| catch (InterruptedException e) { |
| } |
| HelloService.register(updates[i][0], LocaleUtility.getLocaleFromName(updates[i][1])); |
| } |
| } |
| } |
| |
| /** |
| * An example service that wraps an ICU service in order to export custom API and |
| * notification. The service just implements 'hello'. |
| */ |
| static final class HelloService { |
| private static ICUService registry; |
| private String name; |
| |
| private HelloService(String name) { |
| this.name = name; |
| } |
| |
| /** |
| * The hello service... |
| */ |
| public String hello() { |
| return name; |
| } |
| |
| public String toString() { |
| return super.toString() + ": " + name; |
| } |
| |
| /** |
| * Deferred init. |
| */ |
| private static ICUService registry() { |
| if (registry == null) { |
| initRegistry(); |
| } |
| return registry; |
| } |
| |
| private static void initRegistry() { |
| registry = new ICULocaleService() { |
| protected boolean acceptsListener(EventListener l) { |
| return true; // we already verify in our wrapper APIs |
| } |
| protected void notifyListener(EventListener l) { |
| ((HelloServiceListener)l).helloServiceChanged(); |
| } |
| }; |
| |
| // initialize |
| doRegister("Hello", "en"); |
| doRegister("Bonjour", "fr"); |
| doRegister("Ni Hao", "zh_CN"); |
| doRegister("Guten Tag", "de"); |
| } |
| |
| /** |
| * A custom listener for changes to this service. We don't need to |
| * point to the service since it is defined by this class and not |
| * an object. |
| */ |
| public static interface HelloServiceListener extends EventListener { |
| public void helloServiceChanged(); |
| } |
| |
| /** |
| * Type-safe notification for this service. |
| */ |
| public static void addListener(HelloServiceListener l) { |
| registry().addListener(l); |
| } |
| |
| /** |
| * Type-safe notification for this service. |
| */ |
| public static void removeListener(HelloServiceListener l) { |
| registry().removeListener(l); |
| } |
| |
| /** |
| * Type-safe access to the service. |
| */ |
| public static HelloService get(String id) { |
| return (HelloService)registry().get(id); |
| } |
| |
| public static Set getVisibleIDs() { |
| return registry().getVisibleIDs(); |
| } |
| |
| public static Map getDisplayNames(Locale locale) { |
| return getDisplayNames(registry(),locale); |
| } |
| |
| /** |
| * Register a new hello string for this locale. |
| */ |
| public static void register(String helloString, Locale locale) { |
| if (helloString == null || locale == null) { |
| throw new NullPointerException(); |
| } |
| doRegister(helloString, LocaleUtility.canonicalLocaleString(locale.toString())); |
| } |
| |
| private static void doRegister(String hello, String id) { |
| registry().registerObject(new HelloService(hello), id); |
| } |
| /** |
| * Convenience override of getDisplayNames(Locale, Comparator, String) that |
| * uses the default collator for the locale as the comparator to |
| * sort the display names, and null for the matchID. |
| */ |
| public static SortedMap getDisplayNames(ICUService service, Locale locale) { |
| Collator col = Collator.getInstance(locale); |
| return service.getDisplayNames(locale, col, null); |
| } |
| } |
| } |