19 * limitations under the License. |
19 * limitations under the License. |
20 */ |
20 */ |
21 |
21 |
22 package com.sun.org.apache.xml.internal.utils; |
22 package com.sun.org.apache.xml.internal.utils; |
23 |
23 |
24 import java.util.Vector; |
24 import java.text.CollationElementIterator; |
25 import java.text.Collator; |
25 import java.text.Collator; |
26 import java.text.RuleBasedCollator; |
26 import java.text.RuleBasedCollator; |
27 import java.text.CollationElementIterator; |
|
28 import java.util.Locale; |
27 import java.util.Locale; |
29 import java.text.CollationKey; |
|
30 |
28 |
31 |
29 |
32 /** |
30 /** |
33 * International friendly string comparison with case-order |
31 * International friendly string comparison with case-order |
34 * @author Igor Hersht, igorh@ca.ibm.com |
32 * @author Igor Hersht, igorh@ca.ibm.com |
35 */ |
33 */ |
36 public class StringComparable implements Comparable { |
34 public class StringComparable implements Comparable<StringComparable> { |
37 |
35 |
38 public final static int UNKNOWN_CASE = -1; |
36 public final static int UNKNOWN_CASE = -1; |
39 public final static int UPPER_CASE = 1; |
37 public final static int UPPER_CASE = 1; |
40 public final static int LOWER_CASE = 2; |
38 public final static int LOWER_CASE = 2; |
41 |
39 |
43 private Locale m_locale; |
41 private Locale m_locale; |
44 private RuleBasedCollator m_collator; |
42 private RuleBasedCollator m_collator; |
45 private String m_caseOrder; |
43 private String m_caseOrder; |
46 private int m_mask = 0xFFFFFFFF; |
44 private int m_mask = 0xFFFFFFFF; |
47 |
45 |
48 public StringComparable(final String text, final Locale locale, final Collator collator, final String caseOrder){ |
46 public StringComparable(final String text, final Locale locale, |
|
47 final Collator collator, final String caseOrder){ |
49 m_text = text; |
48 m_text = text; |
50 m_locale = locale; |
49 m_locale = locale; |
51 m_collator = (RuleBasedCollator)collator; |
50 m_collator = (RuleBasedCollator)collator; |
52 m_caseOrder = caseOrder; |
51 m_caseOrder = caseOrder; |
53 m_mask = getMask(m_collator.getStrength()); |
52 m_mask = getMask(m_collator.getStrength()); |
54 } |
53 } |
55 |
54 |
56 public final static Comparable getComparator( final String text, final Locale locale, final Collator collator, final String caseOrder){ |
55 @SuppressWarnings({"rawtypes", "unchecked"}) |
57 if((caseOrder == null) ||(caseOrder.length() == 0)){// no case-order specified |
56 public final static Comparable getComparator( final String text, final Locale locale, |
|
57 final Collator collator, final String caseOrder){ |
|
58 if((caseOrder == null) ||(caseOrder.length() == 0)){// no case-order specified |
58 return ((RuleBasedCollator)collator).getCollationKey(text); |
59 return ((RuleBasedCollator)collator).getCollationKey(text); |
59 }else{ |
60 }else{ |
60 return new StringComparable(text, locale, collator, caseOrder); |
61 return new StringComparable(text, locale, collator, caseOrder); |
61 } |
62 } |
62 } |
63 } |
63 |
64 |
64 public final String toString(){return m_text;} |
65 public final String toString(){return m_text;} |
65 |
66 |
66 public int compareTo(Object o) { |
67 public int compareTo(StringComparable o) { |
67 final String pattern = ((StringComparable)o).toString(); |
68 final String pattern = o.toString(); |
68 if(m_text.equals(pattern)){//Code-point equals |
69 if(m_text.equals(pattern)){//Code-point equals |
69 return 0; |
70 return 0; |
70 } |
71 } |
71 final int savedStrength = m_collator.getStrength(); |
72 final int savedStrength = m_collator.getStrength(); |
72 int comp = 0; |
73 int comp = 0; |
73 // Is there difference more significant than case-order? |
74 // Is there difference more significant than case-order? |
74 if(((savedStrength == Collator.PRIMARY) || (savedStrength == Collator.SECONDARY))){ |
75 if(((savedStrength == Collator.PRIMARY) || (savedStrength == Collator.SECONDARY))){ |
75 comp = m_collator.compare(m_text, pattern ); |
76 comp = m_collator.compare(m_text, pattern ); |
76 }else{// more than SECONDARY |
77 }else{// more than SECONDARY |
77 m_collator.setStrength(Collator.SECONDARY); |
78 m_collator.setStrength(Collator.SECONDARY); |