src/share/classes/java/text/BreakIterator.java

Print this page
rev 5696 : 6336885: RFE: Locale Data Deployment Enhancements
4609153: Provide locale data for Indic locales
5104387: Support for gl_ES locale (galician language)
6337471: desktop/system locale preferences support
7056139: (cal) SPI support for locale-dependent Calendar parameters
7058206: Provide CalendarData SPI for week params and display field value names
7073852: Support multiple scripts for digits and decimal symbols per locale
7079560: [Fmt-Da] Context dependent month names support in SimpleDateFormat
7171324: getAvailableLocales() of locale sensitive services should return the actual availability of locales
7151414: (cal) Support calendar type identification
7168528: LocaleServiceProvider needs to be aware of Locale extensions
7171372: (cal) locale's default Calendar should be created if unknown calendar is specified
Summary: JEP 127: Improve Locale Data Packaging and Adopt Unicode CLDR Data (part 1 w/o packaging changes. by Naoto Sato and Masayoshi Okutsu)

@@ -39,24 +39,14 @@
  */
 
 package java.text;
 
 import java.lang.ref.SoftReference;
-import java.net.URL;
-import java.io.InputStream;
-import java.io.IOException;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.text.CharacterIterator;
-import java.text.StringCharacterIterator;
 import java.text.spi.BreakIteratorProvider;
 import java.util.Locale;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-import java.util.spi.LocaleServiceProvider;
-import sun.util.LocaleServiceProviderPool;
-import sun.util.resources.LocaleData;
+import sun.util.locale.provider.LocaleProviderAdapter;
+import sun.util.locale.provider.LocaleServiceProviderPool;
 
 
 /**
  * The <code>BreakIterator</code> class implements methods for finding
  * the location of boundaries in text. Instances of <code>BreakIterator</code>

@@ -246,10 +236,11 @@
 
     /**
      * Create a copy of this iterator
      * @return A copy of this
      */
+    @Override
     public Object clone()
     {
         try {
             return super.clone();
         }

@@ -358,12 +349,13 @@
     public int preceding(int offset) {
         // NOTE:  This implementation is here solely because we can't add new
         // abstract methods to an existing class.  There is almost ALWAYS a
         // better, faster way to do this.
         int pos = following(offset);
-        while (pos >= offset && pos != DONE)
+        while (pos >= offset && pos != DONE) {
             pos = previous();
+        }
         return pos;
     }
 
     /**
      * Returns true if the specified character offset is a text boundary.

@@ -462,14 +454,11 @@
      * @return A break iterator for word breaks
      * @exception NullPointerException if <code>locale</code> is null
      */
     public static BreakIterator getWordInstance(Locale locale)
     {
-        return getBreakInstance(locale,
-                                WORD_INDEX,
-                                "WordData",
-                                "WordDictionary");
+        return getBreakInstance(locale, WORD_INDEX);
     }
 
     /**
      * Returns a new <code>BreakIterator</code> instance
      * for <a href="BreakIterator.html#line">line breaks</a>

@@ -489,14 +478,11 @@
      * @return A break iterator for line breaks
      * @exception NullPointerException if <code>locale</code> is null
      */
     public static BreakIterator getLineInstance(Locale locale)
     {
-        return getBreakInstance(locale,
-                                LINE_INDEX,
-                                "LineData",
-                                "LineDictionary");
+        return getBreakInstance(locale, LINE_INDEX);
     }
 
     /**
      * Returns a new <code>BreakIterator</code> instance
      * for <a href="BreakIterator.html#character">character breaks</a>

@@ -516,14 +502,11 @@
      * @return A break iterator for character breaks
      * @exception NullPointerException if <code>locale</code> is null
      */
     public static BreakIterator getCharacterInstance(Locale locale)
     {
-        return getBreakInstance(locale,
-                                CHARACTER_INDEX,
-                                "CharacterData",
-                                "CharacterDictionary");
+        return getBreakInstance(locale, CHARACTER_INDEX);
     }
 
     /**
      * Returns a new <code>BreakIterator</code> instance
      * for <a href="BreakIterator.html#sentence">sentence breaks</a>

@@ -543,87 +526,58 @@
      * @return A break iterator for sentence breaks
      * @exception NullPointerException if <code>locale</code> is null
      */
     public static BreakIterator getSentenceInstance(Locale locale)
     {
-        return getBreakInstance(locale,
-                                SENTENCE_INDEX,
-                                "SentenceData",
-                                "SentenceDictionary");
+        return getBreakInstance(locale, SENTENCE_INDEX);
     }
 
-    private static BreakIterator getBreakInstance(Locale locale,
-                                                  int type,
-                                                  String dataName,
-                                                  String dictionaryName) {
+    private static BreakIterator getBreakInstance(Locale locale, int type) {
         if (iterCache[type] != null) {
             BreakIteratorCache cache = iterCache[type].get();
             if (cache != null) {
                 if (cache.getLocale().equals(locale)) {
                     return cache.createBreakInstance();
                 }
             }
         }
 
-        BreakIterator result = createBreakInstance(locale,
-                                                   type,
-                                                   dataName,
-                                                   dictionaryName);
+        BreakIterator result = createBreakInstance(locale, type);
         BreakIteratorCache cache = new BreakIteratorCache(locale, result);
         iterCache[type] = new SoftReference<>(cache);
         return result;
     }
 
-    private static ResourceBundle getBundle(final String baseName, final Locale locale) {
-         return AccessController.doPrivileged(new PrivilegedAction<ResourceBundle>() {
-            public ResourceBundle run() {
-                return ResourceBundle.getBundle(baseName, locale);
-            }
-        });
-    }
-
     private static BreakIterator createBreakInstance(Locale locale,
-                                                     int type,
-                                                     String dataName,
-                                                     String dictionaryName) {
-
-        // Check whether a provider can provide an implementation that's closer
-        // to the requested locale than what the Java runtime itself can provide.
-        LocaleServiceProviderPool pool =
-            LocaleServiceProviderPool.getPool(BreakIteratorProvider.class);
-        if (pool.hasProviders()) {
-            BreakIterator providersInstance = pool.getLocalizedObject(
-                                                    BreakIteratorGetter.INSTANCE,
-                                                    locale, type);
-            if (providersInstance != null) {
-                return providersInstance;
+                                                     int type) {
+        LocaleProviderAdapter adapter = LocaleProviderAdapter.getAdapter(BreakIteratorProvider.class, locale);
+        BreakIterator iterator = createBreakInstance(adapter, locale, type);
+        if (iterator == null) {
+            iterator = createBreakInstance(LocaleProviderAdapter.forJRE(), locale, type);
             }
+        return iterator;
         }
 
-        ResourceBundle bundle = getBundle(
-                        "sun.text.resources.BreakIteratorInfo", locale);
-        String[] classNames = bundle.getStringArray("BreakIteratorClasses");
-
-        String dataFile = bundle.getString(dataName);
-
-        try {
-            if (classNames[type].equals("RuleBasedBreakIterator")) {
-                return new RuleBasedBreakIterator(dataFile);
+    private static BreakIterator createBreakInstance(LocaleProviderAdapter adapter, Locale locale, int type) {
+        BreakIteratorProvider breakIteratorProvider = adapter.getBreakIteratorProvider();
+        BreakIterator iterator = null;
+        switch (type) {
+        case CHARACTER_INDEX:
+            iterator = breakIteratorProvider.getCharacterInstance(locale);
+            break;
+        case WORD_INDEX:
+            iterator = breakIteratorProvider.getWordInstance(locale);
+            break;
+        case LINE_INDEX:
+            iterator = breakIteratorProvider.getLineInstance(locale);
+            break;
+        case SENTENCE_INDEX:
+            iterator = breakIteratorProvider.getSentenceInstance(locale);
+            break;
             }
-            else if (classNames[type].equals("DictionaryBasedBreakIterator")) {
-                String dictionaryFile = bundle.getString(dictionaryName);
-                return new DictionaryBasedBreakIterator(dataFile, dictionaryFile);
+        return iterator;
             }
-            else {
-                throw new IllegalArgumentException("Invalid break iterator class \"" +
-                                classNames[type] + "\"");
-            }
-        }
-        catch (Exception e) {
-            throw new InternalError(e.toString(), e);
-        }
-    }
 
     /**
      * Returns an array of all locales for which the
      * <code>get*Instance</code> methods of this class can return
      * localized instances.

@@ -659,59 +613,6 @@
 
         BreakIterator createBreakInstance() {
             return (BreakIterator) iter.clone();
         }
     }
-
-    static long getLong(byte[] buf, int offset) {
-        long num = buf[offset]&0xFF;
-        for (int i = 1; i < 8; i++) {
-            num = num<<8 | (buf[offset+i]&0xFF);
-        }
-        return num;
-    }
-
-    static int getInt(byte[] buf, int offset) {
-        int num = buf[offset]&0xFF;
-        for (int i = 1; i < 4; i++) {
-            num = num<<8 | (buf[offset+i]&0xFF);
-        }
-        return num;
-    }
-
-    static short getShort(byte[] buf, int offset) {
-        short num = (short)(buf[offset]&0xFF);
-        num = (short)(num<<8 | (buf[offset+1]&0xFF));
-        return num;
-    }
-
-    /**
-     * Obtains a BreakIterator instance from a BreakIteratorProvider
-     * implementation.
-     */
-    private static class BreakIteratorGetter
-        implements LocaleServiceProviderPool.LocalizedObjectGetter<BreakIteratorProvider, BreakIterator> {
-        private static final BreakIteratorGetter INSTANCE =
-            new BreakIteratorGetter();
-
-        public BreakIterator getObject(BreakIteratorProvider breakIteratorProvider,
-                                Locale locale,
-                                String key,
-                                Object... params) {
-            assert params.length == 1;
-
-            switch ((Integer)params[0]) {
-            case CHARACTER_INDEX:
-                return breakIteratorProvider.getCharacterInstance(locale);
-            case WORD_INDEX:
-                return breakIteratorProvider.getWordInstance(locale);
-            case LINE_INDEX:
-                return breakIteratorProvider.getLineInstance(locale);
-            case SENTENCE_INDEX:
-                return breakIteratorProvider.getSentenceInstance(locale);
-            default:
-                assert false : "should not happen";
-            }
-            return null;
-        }
-    }
 }