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;
- }
- }
}