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

Print this page
rev 5615 : 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 Jigsaw. by Naoto Sato and Masayoshi Okutsu)

*** 39,62 **** */ 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; /** * The <code>BreakIterator</code> class implements methods for finding * the location of boundaries in text. Instances of <code>BreakIterator</code> --- 39,52 ---- */ package java.text; import java.lang.ref.SoftReference; import java.text.spi.BreakIteratorProvider; import java.util.Locale; ! 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,255 **** --- 236,246 ---- /** * Create a copy of this iterator * @return A copy of this */ + @Override public Object clone() { try { return super.clone(); }
*** 358,369 **** 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) pos = previous(); return pos; } /** * Returns true if the specified character offset is a text boundary. --- 349,361 ---- 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) { pos = previous(); + } return pos; } /** * Returns true if the specified character offset is a text boundary.
*** 462,475 **** * @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"); } /** * Returns a new <code>BreakIterator</code> instance * for <a href="BreakIterator.html#line">line breaks</a> --- 454,464 ---- * @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); } /** * Returns a new <code>BreakIterator</code> instance * for <a href="BreakIterator.html#line">line breaks</a>
*** 489,502 **** * @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"); } /** * Returns a new <code>BreakIterator</code> instance * for <a href="BreakIterator.html#character">character breaks</a> --- 478,488 ---- * @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); } /** * Returns a new <code>BreakIterator</code> instance * for <a href="BreakIterator.html#character">character breaks</a>
*** 516,529 **** * @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"); } /** * Returns a new <code>BreakIterator</code> instance * for <a href="BreakIterator.html#sentence">sentence breaks</a> --- 502,512 ---- * @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); } /** * Returns a new <code>BreakIterator</code> instance * for <a href="BreakIterator.html#sentence">sentence breaks</a>
*** 543,629 **** * @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"); } ! private static BreakIterator getBreakInstance(Locale locale, ! int type, ! String dataName, ! String dictionaryName) { 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); 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; } } ! ! 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); } - else if (classNames[type].equals("DictionaryBasedBreakIterator")) { - String dictionaryFile = bundle.getString(dictionaryName); - return new DictionaryBasedBreakIterator(dataFile, dictionaryFile); - } - 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. --- 526,579 ---- * @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); } ! 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); BreakIteratorCache cache = new BreakIteratorCache(locale, result); iterCache[type] = new SoftReference<>(cache); return result; } private static BreakIterator createBreakInstance(Locale locale, ! int type) { ! LocaleProviderAdapter adapter = LocaleProviderAdapter.getAdapter(BreakIteratorProvider.class, locale); ! 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; } + if (iterator == null) { + throw new RuntimeException("BreakIterator instance creation failed. (provider=" + + breakIteratorProvider + ")"); } ! return iterator; } /** * Returns an array of all locales for which the * <code>get*Instance</code> methods of this class can return * localized instances.
*** 659,717 **** 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; - } - } } --- 609,614 ----