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