]> granicus.if.org Git - icu/commitdiff
ICU-12055 remove NPE from FilteredBreakIteratorBuilder
authorSteven R. Loomis <srl@icu-project.org>
Thu, 25 Feb 2016 01:39:48 +0000 (01:39 +0000)
committerSteven R. Loomis <srl@icu-project.org>
Thu, 25 Feb 2016 01:39:48 +0000 (01:39 +0000)
X-SVN-Rev: 38361

icu4j/main/classes/core/src/com/ibm/icu/impl/SimpleFilteredSentenceBreakIterator.java
icu4j/main/tests/core/src/com/ibm/icu/dev/test/rbbi/BreakIteratorTest.java

index 6f8995dd036f80624d41971da3a207a0ab481802..5d04eb8c2e6e337e6a25544000886a7b0632094c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *******************************************************************************
- * Copyright (C) 2014-2015, International Business Machines Corporation and
+ * Copyright (C) 2014-2016, International Business Machines Corporation and
  * others. All Rights Reserved.
  *******************************************************************************
  */
@@ -199,7 +199,7 @@ public class SimpleFilteredSentenceBreakIterator extends BreakIterator {
         /**
          * filter set to store all exceptions
          */
-        private HashSet<String> filterSet;
+        private HashSet<String> filterSet = new HashSet<String>();
 
         static final int PARTIAL = (1 << 0); // < partial - need to run through forward trie
         static final int MATCH = (1 << 1); // < exact match - skip this one.
@@ -214,16 +214,17 @@ public class SimpleFilteredSentenceBreakIterator extends BreakIterator {
             ICUResourceBundle rb = (ICUResourceBundle) UResourceBundle.getBundleInstance(
                     ICUResourceBundle.ICU_BRKITR_BASE_NAME, loc);
             ICUResourceBundle exceptions = rb.findWithFallback("exceptions");
-            ICUResourceBundle breaks = exceptions.findWithFallback("SentenceBreak");
-
-            filterSet = new HashSet<String>();
-            if (breaks != null) {
-                for (int index = 0, size = breaks.getSize(); index < size; ++index) {
-                    ICUResourceBundle b = (ICUResourceBundle) breaks.get(index);
-                    String br = b.getString();
-                    filterSet.add(br);
+            if (exceptions != null) {
+                ICUResourceBundle breaks = exceptions.findWithFallback("SentenceBreak");
+    
+                if (breaks != null) {
+                    for (int index = 0, size = breaks.getSize(); index < size; ++index) {
+                        ICUResourceBundle b = (ICUResourceBundle) breaks.get(index);
+                        String br = b.getString();
+                        filterSet.add(br);
+                    }
                 }
-            }
+            } // else - no exceptions.
         }
 
         /**
@@ -252,6 +253,11 @@ public class SimpleFilteredSentenceBreakIterator extends BreakIterator {
 
         @Override
         public BreakIterator build(BreakIterator adoptBreakIterator) {
+            if( filterSet.isEmpty() ) {
+                // Short circuit - nothing to except.
+                return adoptBreakIterator;
+            }
+            
             CharsTrieBuilder builder = new CharsTrieBuilder();
             CharsTrieBuilder builder2 = new CharsTrieBuilder();
 
index a3bda1e99c734840970f59cfa87ee34741571b58..3379472c6ec501eba90081e283af30934d44220e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *******************************************************************************
- * Copyright (C) 1996-2014, International Business Machines Corporation and    *
+ * Copyright (C) 1996-2016, International Business Machines Corporation and    *
  * others. All Rights Reserved.                                                *
  *******************************************************************************
  */
@@ -846,6 +846,21 @@ public class BreakIteratorTest extends TestFmwk
         }
     }
 
+    /**
+     * At present, Japanese doesn't have exceptions.
+     * However, this still should not fail.
+     */
+    public void TestFilteredJapanese() {
+        ULocale loc = ULocale.JAPANESE;
+        BreakIterator brk = FilteredBreakIteratorBuilder
+                .createInstance(loc)
+                .build(BreakIterator.getSentenceInstance(loc));
+        brk.setText("OKです。");
+        assertEquals("Starting point", 0, brk.current());
+        assertEquals("Next point", 5, brk.next());
+        assertEquals("Last point", BreakIterator.DONE, brk.next());
+    }
+    
     /*
      * Test case for Ticket#10721. BreakIterator factory method should throw NPE
      * when specified locale is null.