]> granicus.if.org Git - icu/commitdiff
ICU-10998 collation reorder others=Zzzz, recognize only others = reset
authorMarkus Scherer <markus.icu@gmail.com>
Wed, 9 Jul 2014 23:36:43 +0000 (23:36 +0000)
committerMarkus Scherer <markus.icu@gmail.com>
Wed, 9 Jul 2014 23:36:43 +0000 (23:36 +0000)
X-SVN-Rev: 36019

icu4j/main/classes/collate/src/com/ibm/icu/impl/coll/CollationRuleParser.java
icu4j/main/classes/collate/src/com/ibm/icu/text/Collator.java
icu4j/main/classes/collate/src/com/ibm/icu/text/RuleBasedCollator.java
icu4j/main/tests/collate/src/com/ibm/icu/dev/data/collationtest.txt
icu4j/main/tests/collate/src/com/ibm/icu/dev/test/collator/CollationMiscTest.java
icu4j/main/tests/collate/src/com/ibm/icu/dev/test/collator/CollationTest.java

index 9ebbcb264178800e988ed2c91e07af898a73f579..cf2681648d38c3055b5812c3367f5545ac357cda 100644 (file)
@@ -719,8 +719,7 @@ public final class CollationRuleParser {
             i = limit;
         }
         int length = reorderCodes.size();
-        if(length == 1 && reorderCodes.get(0) == Collator.ReorderCodes.DEFAULT) {
-            // The root collator does not have a reordering, by definition.
+        if(length == 1 && reorderCodes.get(0) == Collator.ReorderCodes.NONE) {
             settings.resetReordering();
             return;
         }
@@ -739,8 +738,7 @@ public final class CollationRuleParser {
     /**
      * Gets a script or reorder code from its string representation.
      * @return the script/reorder code, or
-     * -1==Collator.ReorderCodes.REORDER_CODE_DEFAULT, or
-     * -2 if not recognized
+     * -1 if not recognized
      */
     public static int getReorderCode(String word) {
         for(int i = 0; i < gSpecialReorderCodes.length; ++i) {
@@ -756,10 +754,10 @@ public final class CollationRuleParser {
         } catch (IllegalIcuArgumentException e) {
             // fall through
         }
-        if(word.equalsIgnoreCase("default")) {
-            return Collator.ReorderCodes.DEFAULT;
+        if(word.equalsIgnoreCase("others")) {
+            return Collator.ReorderCodes.OTHERS;  // same as Zzzz = USCRIPT_UNKNOWN 
         }
-        return -2;
+        return -1;
     }
 
     private static int getOnOffValue(String s) {
index 6c8dc49dde95b718940506d926f86ac547bd1a07..03e7765793fcb025cb06e30ce16cf1752d64dc58 100644 (file)
@@ -644,6 +644,9 @@ public abstract class Collator implements Comparator<Object>, Freezable<Collator
     private static final int getReorderCode(String keyword, String s) {
         return Collator.ReorderCodes.FIRST +
                 getIntValue(keyword, s, "space", "punct", "symbol", "currency", "digit");
+        // Not supporting "others" = UCOL_REORDER_CODE_OTHERS
+        // as a synonym for Zzzz = USCRIPT_UNKNOWN for now:
+        // Avoid introducing synonyms/aliases.
     }
 
     /**
index 519840e631fa05c350ba6e26b685adbf0ee9292c..ab7d23066af850117dbaec631a2aab7870bd455a 100644 (file)
@@ -935,12 +935,15 @@ public final class RuleBasedCollator extends Collator {
     @Override
     public void setReorderCodes(int... order) {
         checkNotFrozen();
-        if(order == null ?
+        int length = (order != null) ? order.length : 0;
+        if(length == 1 && order[0] == ReorderCodes.NONE) {
+            length = 0;
+        }
+        if(length == 0 ?
                 settings.readOnly().reorderCodes.length == 0 :
                 Arrays.equals(order, settings.readOnly().reorderCodes)) {
             return;
         }
-        int length = (order != null) ? order.length : 0;
         CollationSettings defaultSettings = getDefaultSettings();
         if(length == 1 && order[0] == Collator.ReorderCodes.DEFAULT) {
             if(settings.readOnly() != defaultSettings) {
index ec6a2c526b13ebb8bd0384c3a70fb051a8244dba..5b14a77fae745c38ef5007ad53e8160f13d332dc 100644 (file)
 <1 a
 <1 ae
 <2 ä
+
+** test: import rules from a language with non-Latin native script, and reset the reordering, ICU ticket 10998
+# Greek should sort Greek first.
+@ rules
+[import el]
+* compare
+<1 4
+<1 Ω
+<1 L
+
+# Import Greek, and then reset the reordering.
+@ rules
+[import el][reorder Zzzz]
+* compare
+<1 4
+<1 L
+<1 Ω
+
+# "others" is a synonym for Zzzz.
+@ rules
+[import el][reorder others]
+* compare
+<1 4
+<1 L
+<1 Ω
index ad4c70406d260ccca5268d9a182672f6bb0ed89e..02bbce06070960f62e6fd341c0a78b8e175198c5 100644 (file)
@@ -3204,6 +3204,13 @@ public class CollationMiscTest extends TestFmwk {
             errln("ERROR: collation result should have been greater.");
         }
         
+        /* clear the reordering using [NONE] */
+        myCollation.setReorderCodes(new int[]{ ReorderCodes.NONE });    
+        retrievedReorderCodes = myCollation.getReorderCodes();
+        if (retrievedReorderCodes.length != 0) {
+            errln("ERROR: [NONE] retrieved reorder codes was not null.");
+        }
+
         boolean gotException = false;
         /* set duplicates in the reorder codes */
         try {
index 764bbff0cecd33213c0c16c07e8e9057eb9a3715..4f9197d2fca3c2adfa45e6538cbc37cd907ca36f 100644 (file)
@@ -1290,10 +1290,14 @@ public class CollationTest extends TestFmwk {
             String name = fileLine.substring(start, limit);
             int code = CollationRuleParser.getReorderCode(name);
             if (code < -1) {
-                logln(fileLine);
-                error = new ParseException("invalid reorder code '" + name + "' on line "
-                                            + fileLineNumber, fileLineNumber);
-                return;
+                if (name.equalsIgnoreCase("default")) {
+                    code = ReorderCodes.DEFAULT;  // -1
+                } else {
+                    logln(fileLine);
+                    error = new ParseException("invalid reorder code '" + name + "' on line "
+                                                + fileLineNumber, fileLineNumber);
+                    return;
+                }
             }
             reorderCodes.addElement(code);
             start = limit;