]> granicus.if.org Git - icu/commitdiff
ICU-11029 Based on the review comments, I moved SimpleFilteredBreakIterator to impl...
authorYoshito Umaoka <y.umaoka@gmail.com>
Tue, 9 Sep 2014 21:35:53 +0000 (21:35 +0000)
committerYoshito Umaoka <y.umaoka@gmail.com>
Tue, 9 Sep 2014 21:35:53 +0000 (21:35 +0000)
X-SVN-Rev: 36409

.gitattributes
icu4j/main/classes/core/src/com/ibm/icu/impl/SimpleFilteredSentenceBreakIterator.java [moved from icu4j/main/classes/core/src/com/ibm/icu/text/SimpleFilteredBreakIteratorBuilder.java with 50% similarity]
icu4j/main/classes/core/src/com/ibm/icu/text/FilteredBreakIteratorBuilder.java

index 9cf81a418ed6d158ec0abb1985ef593caaaf840b..81368c64481f6fef5c08d02b5b7a402023803f22 100644 (file)
@@ -425,11 +425,11 @@ icu4j/main/classes/core/.settings/edu.umd.cs.findbugs.core.prefs -text
 icu4j/main/classes/core/.settings/org.eclipse.core.resources.prefs -text
 icu4j/main/classes/core/.settings/org.eclipse.jdt.core.prefs -text
 icu4j/main/classes/core/manifest.stub -text
+icu4j/main/classes/core/src/com/ibm/icu/impl/SimpleFilteredSentenceBreakIterator.java -text
 icu4j/main/classes/core/src/com/ibm/icu/impl/TZDBTimeZoneNames.java -text
 icu4j/main/classes/core/src/com/ibm/icu/impl/locale/KeyTypeData.java -text
 icu4j/main/classes/core/src/com/ibm/icu/text/BurmeseBreakEngine.java -text
 icu4j/main/classes/core/src/com/ibm/icu/text/FilteredBreakIteratorBuilder.java -text
-icu4j/main/classes/core/src/com/ibm/icu/text/SimpleFilteredBreakIteratorBuilder.java -text
 icu4j/main/classes/currdata/.externalToolBuilders/copy-data-currdata.launch -text
 icu4j/main/classes/currdata/.settings/org.eclipse.core.resources.prefs -text
 icu4j/main/classes/currdata/.settings/org.eclipse.jdt.core.prefs -text
similarity index 50%
rename from icu4j/main/classes/core/src/com/ibm/icu/text/SimpleFilteredBreakIteratorBuilder.java
rename to icu4j/main/classes/core/src/com/ibm/icu/impl/SimpleFilteredSentenceBreakIterator.java
index a83c2f46f932e2c6273dc92589151087fc23a303..46689157debb004c5017bf9e09ec8f3b19302fa0 100644 (file)
@@ -4,12 +4,14 @@
  * others. All Rights Reserved.\r
  *******************************************************************************\r
  */\r
-package com.ibm.icu.text;\r
+package com.ibm.icu.impl;\r
 \r
 import java.text.CharacterIterator;\r
 import java.util.HashSet;\r
 \r
-import com.ibm.icu.impl.ICUResourceBundle;\r
+import com.ibm.icu.text.BreakIterator;\r
+import com.ibm.icu.text.FilteredBreakIteratorBuilder;\r
+import com.ibm.icu.text.UCharacterIterator;\r
 import com.ibm.icu.util.BytesTrie;\r
 import com.ibm.icu.util.CharsTrie;\r
 import com.ibm.icu.util.CharsTrieBuilder;\r
@@ -20,7 +22,7 @@ import com.ibm.icu.util.UResourceBundle;
 /**\r
  * @author tomzhang\r
  */\r
-class SimpleFilteredSentenceBreakIterator extends BreakIterator {\r
+public class SimpleFilteredSentenceBreakIterator extends BreakIterator {\r
 \r
     private BreakIterator delegate;\r
     private UCharacterIterator text; // TODO(Tom): suffice to move into the local scope in next() ?\r
@@ -83,12 +85,12 @@ class SimpleFilteredSentenceBreakIterator extends BreakIterator {
             }\r
 \r
             if (bestPosn >= 0) {\r
-                if (bestValue == SimpleFilteredBreakIteratorBuilder.MATCH) { // exact match!\r
+                if (bestValue == Builder.MATCH) { // exact match!\r
                     n = delegate.next(); // skip this one. Find the next lowerlevel break.\r
                     if (n == BreakIterator.DONE)\r
                         return n;\r
                     continue; // See if the next is another exception.\r
-                } else if (bestValue == SimpleFilteredBreakIteratorBuilder.PARTIAL && forwardsPartialTrie != null) {\r
+                } else if (bestValue == Builder.PARTIAL && forwardsPartialTrie != null) {\r
                     // make sure there's a forward trie\r
                     // We matched the "Ph." in "Ph.D." - now we need to run everything through the forwards trie\r
                     // to see if it matches something going forward.\r
@@ -151,17 +153,20 @@ class SimpleFilteredSentenceBreakIterator extends BreakIterator {
 \r
     @Override\r
     public int next(int n) {\r
-        return delegate.next(n);\r
+        // TODO\r
+        throw new UnsupportedOperationException("next(int) is not yet implemented");\r
     }\r
 \r
     @Override\r
     public int previous() {\r
-        return delegate.previous();\r
+        // TODO\r
+        throw new UnsupportedOperationException("previous() is not yet implemented");\r
     }\r
 \r
     @Override\r
     public int following(int offset) {\r
-        return delegate.following(offset);\r
+        // TODO\r
+        throw new UnsupportedOperationException("following(int) is not yet implemented");\r
     }\r
 \r
     @Override\r
@@ -169,6 +174,12 @@ class SimpleFilteredSentenceBreakIterator extends BreakIterator {
         return delegate.current();\r
     }\r
 \r
+    @Override\r
+    public int preceding(int offset) {\r
+        // TODO\r
+        throw new UnsupportedOperationException("preceding(int) is not yet implemented");\r
+    }\r
+\r
     @Override\r
     public CharacterIterator getText() {\r
         return delegate.getText();\r
@@ -178,137 +189,137 @@ class SimpleFilteredSentenceBreakIterator extends BreakIterator {
     public void setText(CharacterIterator newText) {\r
         delegate.setText(newText);\r
     }\r
-}\r
-\r
-public class SimpleFilteredBreakIteratorBuilder extends FilteredBreakIteratorBuilder {\r
-    /**\r
-     * filter set to store all exceptions\r
-     */\r
-    private HashSet<String> filterSet;\r
 \r
-    static final int PARTIAL = (1 << 0); // < partial - need to run through forward trie\r
-    static final int MATCH = (1 << 1); // < exact match - skip this one.\r
-    static final int SuppressInReverse = (1 << 0);\r
-    static final int AddToForward = (1 << 1);\r
+    public static class Builder extends FilteredBreakIteratorBuilder {\r
+        /**\r
+         * filter set to store all exceptions\r
+         */\r
+        private HashSet<String> filterSet;\r
+\r
+        static final int PARTIAL = (1 << 0); // < partial - need to run through forward trie\r
+        static final int MATCH = (1 << 1); // < exact match - skip this one.\r
+        static final int SuppressInReverse = (1 << 0);\r
+        static final int AddToForward = (1 << 1);\r
+\r
+        /**\r
+         * Create SimpleFilteredBreakIteratorBuilder using given locale\r
+         * @param loc the locale to get filtered iterators\r
+         */\r
+        public Builder(ULocale loc) {\r
+            ICUResourceBundle rb = (ICUResourceBundle) UResourceBundle.getBundleInstance(\r
+                    ICUResourceBundle.ICU_BRKITR_BASE_NAME, loc);\r
+            ICUResourceBundle exceptions = rb.findWithFallback("exceptions");\r
+            ICUResourceBundle breaks = exceptions.findWithFallback("SentenceBreak");\r
 \r
-    /**\r
-     * Create SimpleFilteredBreakIteratorBuilder using given locale\r
-     * @param loc the locale to get filtered iterators\r
-     */\r
-    public SimpleFilteredBreakIteratorBuilder(ULocale loc) {\r
-        ICUResourceBundle rb = (ICUResourceBundle) UResourceBundle.getBundleInstance(\r
-                ICUResourceBundle.ICU_BRKITR_BASE_NAME, loc);\r
-        ICUResourceBundle exceptions = rb.findWithFallback("exceptions");\r
-        ICUResourceBundle breaks = exceptions.findWithFallback("SentenceBreak");\r
-\r
-        filterSet = new HashSet<String>();\r
-        if (breaks != null) {\r
-            for (int index = 0, size = breaks.getSize(); index < size; ++index) {\r
-                ICUResourceBundle b = (ICUResourceBundle) breaks.get(index);\r
-                String br = b.getString();\r
-                filterSet.add(br);\r
+            filterSet = new HashSet<String>();\r
+            if (breaks != null) {\r
+                for (int index = 0, size = breaks.getSize(); index < size; ++index) {\r
+                    ICUResourceBundle b = (ICUResourceBundle) breaks.get(index);\r
+                    String br = b.getString();\r
+                    filterSet.add(br);\r
+                }\r
             }\r
         }\r
-    }\r
-\r
-    /**\r
-     * Create SimpleFilteredBreakIteratorBuilder with no exception\r
-     */\r
-    public SimpleFilteredBreakIteratorBuilder() {\r
-        filterSet = new HashSet<String>();\r
-    }\r
 \r
-    @Override\r
-    public boolean suppressBreakAfter(String str) {\r
-        if (filterSet == null) {\r
+        /**\r
+         * Create SimpleFilteredBreakIteratorBuilder with no exception\r
+         */\r
+        public Builder() {\r
             filterSet = new HashSet<String>();\r
         }\r
-        return filterSet.add(str);\r
-    }\r
 \r
-    @Override\r
-    public boolean unsuppressBreakAfter(String str) {\r
-        if (filterSet == null) {\r
-            return false;\r
-        } else {\r
-            return filterSet.remove(str);\r
+        @Override\r
+        public boolean suppressBreakAfter(String str) {\r
+            if (filterSet == null) {\r
+                filterSet = new HashSet<String>();\r
+            }\r
+            return filterSet.add(str);\r
         }\r
-    }\r
 \r
-    @Override\r
-    public BreakIterator build(BreakIterator adoptBreakIterator) {\r
-        CharsTrieBuilder builder = new CharsTrieBuilder();\r
-        CharsTrieBuilder builder2 = new CharsTrieBuilder();\r
+        @Override\r
+        public boolean unsuppressBreakAfter(String str) {\r
+            if (filterSet == null) {\r
+                return false;\r
+            } else {\r
+                return filterSet.remove(str);\r
+            }\r
+        }\r
 \r
-        int revCount = 0;\r
-        int fwdCount = 0;\r
+        @Override\r
+        public BreakIterator build(BreakIterator adoptBreakIterator) {\r
+            CharsTrieBuilder builder = new CharsTrieBuilder();\r
+            CharsTrieBuilder builder2 = new CharsTrieBuilder();\r
 \r
-        int subCount = filterSet.size();\r
-        String[] ustrs = new String[subCount];\r
-        int[] partials = new int[subCount];\r
+            int revCount = 0;\r
+            int fwdCount = 0;\r
 \r
-        CharsTrie backwardsTrie = null; // i.e. ".srM" for Mrs.\r
-        CharsTrie forwardsPartialTrie = null; // Has ".a" for "a.M."\r
+            int subCount = filterSet.size();\r
+            String[] ustrs = new String[subCount];\r
+            int[] partials = new int[subCount];\r
 \r
-        int i = 0;\r
-        for (String s : filterSet) {\r
-            ustrs[i] = s; // copy by value?\r
-            partials[i] = 0; // default: no partial\r
-            i++;\r
-        }\r
+            CharsTrie backwardsTrie = null; // i.e. ".srM" for Mrs.\r
+            CharsTrie forwardsPartialTrie = null; // Has ".a" for "a.M."\r
 \r
-        for (i = 0; i < subCount; i++) {\r
-            int nn = ustrs[i].indexOf('.'); // TODO: non-'.' abbreviations\r
-            if (nn > -1 && (nn + 1) != ustrs[i].length()) {\r
-                // is partial.\r
-                // is it unique?\r
-                int sameAs = -1;\r
-                for (int j = 0; j < subCount; j++) {\r
-                    if (j == i)\r
-                        continue;\r
-                    if (ustrs[i].regionMatches(0, ustrs[j], 0, nn + 1)) {\r
-                        if (partials[j] == 0) { // hasn't been processed yet\r
-                            partials[j] = SuppressInReverse | AddToForward;\r
-                        } else if ((partials[j] & SuppressInReverse) != 0) {\r
-                            sameAs = j; // the other entry is already in the reverse table.\r
+            int i = 0;\r
+            for (String s : filterSet) {\r
+                ustrs[i] = s; // copy by value?\r
+                partials[i] = 0; // default: no partial\r
+                i++;\r
+            }\r
+\r
+            for (i = 0; i < subCount; i++) {\r
+                int nn = ustrs[i].indexOf('.'); // TODO: non-'.' abbreviations\r
+                if (nn > -1 && (nn + 1) != ustrs[i].length()) {\r
+                    // is partial.\r
+                    // is it unique?\r
+                    int sameAs = -1;\r
+                    for (int j = 0; j < subCount; j++) {\r
+                        if (j == i)\r
+                            continue;\r
+                        if (ustrs[i].regionMatches(0, ustrs[j], 0, nn + 1)) {\r
+                            if (partials[j] == 0) { // hasn't been processed yet\r
+                                partials[j] = SuppressInReverse | AddToForward;\r
+                            } else if ((partials[j] & SuppressInReverse) != 0) {\r
+                                sameAs = j; // the other entry is already in the reverse table.\r
+                            }\r
                         }\r
                     }\r
+\r
+                    if ((sameAs == -1) && (partials[i] == 0)) {\r
+                        StringBuilder prefix = new StringBuilder(ustrs[i].substring(0, nn + 1));\r
+                        // first one - add the prefix to the reverse table.\r
+                        prefix.reverse();\r
+                        builder.add(prefix, PARTIAL);\r
+                        revCount++;\r
+                        partials[i] = SuppressInReverse | AddToForward;\r
+                    }\r
                 }\r
+            }\r
 \r
-                if ((sameAs == -1) && (partials[i] == 0)) {\r
-                    StringBuilder prefix = new StringBuilder(ustrs[i].substring(0, nn + 1));\r
-                    // first one - add the prefix to the reverse table.\r
-                    prefix.reverse();\r
-                    builder.add(prefix, PARTIAL);\r
+            for (i = 0; i < subCount; i++) {\r
+                if (partials[i] == 0) {\r
+                    StringBuilder reversed = new StringBuilder(ustrs[i]).reverse();\r
+                    builder.add(reversed, MATCH);\r
                     revCount++;\r
-                    partials[i] = SuppressInReverse | AddToForward;\r
+                } else {\r
+                    // an optimization would be to only add the portion after the '.'\r
+                    // for example, for "Ph.D." we store ".hP" in the reverse table. We could just store "D." in the\r
+                    // forward,\r
+                    // instead of "Ph.D." since we already know the "Ph." part is a match.\r
+                    // would need the trie to be able to hold 0-length strings, though.\r
+                    builder2.add(ustrs[i], MATCH); // forward\r
+                    fwdCount++;\r
                 }\r
             }\r
-        }\r
 \r
-        for (i = 0; i < subCount; i++) {\r
-            if (partials[i] == 0) {\r
-                StringBuilder reversed = new StringBuilder(ustrs[i]).reverse();\r
-                builder.add(reversed, MATCH);\r
-                revCount++;\r
-            } else {\r
-                // an optimization would be to only add the portion after the '.'\r
-                // for example, for "Ph.D." we store ".hP" in the reverse table. We could just store "D." in the\r
-                // forward,\r
-                // instead of "Ph.D." since we already know the "Ph." part is a match.\r
-                // would need the trie to be able to hold 0-length strings, though.\r
-                builder2.add(ustrs[i], MATCH); // forward\r
-                fwdCount++;\r
+            if (revCount > 0) {\r
+                backwardsTrie = builder.build(StringTrieBuilder.Option.FAST);\r
             }\r
-        }\r
 \r
-        if (revCount > 0) {\r
-            backwardsTrie = builder.build(StringTrieBuilder.Option.FAST);\r
-        }\r
-\r
-        if (fwdCount > 0) {\r
-            forwardsPartialTrie = builder2.build(StringTrieBuilder.Option.FAST);\r
+            if (fwdCount > 0) {\r
+                forwardsPartialTrie = builder2.build(StringTrieBuilder.Option.FAST);\r
+            }\r
+            return new SimpleFilteredSentenceBreakIterator(adoptBreakIterator, forwardsPartialTrie, backwardsTrie);\r
         }\r
-        return new SimpleFilteredSentenceBreakIterator(adoptBreakIterator, forwardsPartialTrie, backwardsTrie);\r
     }\r
 }\r
index 378f1d60af45f1a42b271a638256ddaa71fda8d0..8f81fd922e4e8320e6ff3c4b8450526453c24c98 100644 (file)
@@ -6,6 +6,7 @@
  */\r
 package com.ibm.icu.text;\r
 \r
+import com.ibm.icu.impl.SimpleFilteredSentenceBreakIterator;\r
 import com.ibm.icu.util.ULocale;\r
 \r
 /**\r
@@ -16,6 +17,18 @@ import com.ibm.icu.util.ULocale;
  *  in the string "Mr. Smith" (resulting in two segments),\r
  *  but with "Mr." as an exception, a filtered break iterator\r
  *  would consider the string "Mr. Smith" to be a single segment.\r
+ *  \r
+ * <p><b>Note:</b> An instance of {@link BreakIterator} returned by this builder\r
+ * class currently does not support following operations in this technology preview\r
+ * version:\r
+ * <ul>\r
+ *   <li>{@link BreakIterator#next(int) next(int n)}</li>\r
+ *   <li>{@link BreakIterator#previous() previous()}</li>\r
+ *   <li>{@link BreakIterator#following(int) following(int offset)}</li>\r
+ *   <li>{@link BreakIterator#preceding(int) preceding(int offset)}</li>\r
+ * </ul>\r
+ * When one of above methods is called, {@link UnsupportedOperationException} will be\r
+ * thrown.\r
  *\r
  * @author tomzhang\r
  * \r
@@ -39,7 +52,7 @@ public abstract class FilteredBreakIteratorBuilder {
      */\r
     @Deprecated\r
     public static FilteredBreakIteratorBuilder createInstance(ULocale where) {\r
-        FilteredBreakIteratorBuilder ret = new SimpleFilteredBreakIteratorBuilder(where);\r
+        FilteredBreakIteratorBuilder ret = new SimpleFilteredSentenceBreakIterator.Builder(where);\r
         return ret;\r
     }\r
 \r
@@ -52,7 +65,7 @@ public abstract class FilteredBreakIteratorBuilder {
      */\r
     @Deprecated\r
     public static FilteredBreakIteratorBuilder createInstance() {\r
-        FilteredBreakIteratorBuilder ret = new SimpleFilteredBreakIteratorBuilder();\r
+        FilteredBreakIteratorBuilder ret = new SimpleFilteredSentenceBreakIterator.Builder();\r
         return ret;\r
     }\r
 \r