| /* |
| ******************************************************************************* |
| * Copyright (C) 2008, International Business Machines Corporation and * |
| * others. All Rights Reserved. * |
| ******************************************************************************* |
| */ |
| package com.ibm.icu.impl.jdkadapter; |
| |
| import java.text.CollationKey; |
| |
| import com.ibm.icu.text.Collator; |
| |
| /** |
| * CollatorICU is an adapter class which wraps ICU4J Collator and |
| * implements java.text.Collator APIs. |
| */ |
| public class CollatorICU extends java.text.Collator { |
| |
| private Collator fIcuCollator; |
| |
| private CollatorICU(Collator icuCollator) { |
| fIcuCollator = icuCollator; |
| } |
| |
| public static java.text.Collator wrap(Collator icuCollator) { |
| return new CollatorICU(icuCollator); |
| } |
| |
| public Collator unwrap() { |
| return fIcuCollator; |
| } |
| |
| public Object clone() { |
| CollatorICU other = (CollatorICU)super.clone(); |
| try { |
| other.fIcuCollator = (Collator)fIcuCollator.clone(); |
| } catch (CloneNotSupportedException e) { |
| // ICU Collator clone() may throw CloneNotSupportedException, |
| // but JDK does not. We use UnsupportedOperationException instead |
| // as workwround. |
| throw new UnsupportedOperationException("clone() is not supported by this ICU Collator."); |
| } |
| return other; |
| } |
| |
| public int compare(Object o1, Object o2) { |
| return fIcuCollator.compare(o1, o2); |
| } |
| |
| public int compare(String source, String target) { |
| return fIcuCollator.compare(source, target); |
| } |
| |
| public boolean equals(Object that) { |
| if (that instanceof CollatorICU) { |
| return ((CollatorICU)that).fIcuCollator.equals(fIcuCollator); |
| } |
| return false; |
| } |
| |
| public boolean equals(String source, String target) { |
| return fIcuCollator.equals(source, target); |
| } |
| |
| public CollationKey getCollationKey(String source) { |
| com.ibm.icu.text.CollationKey icuCollKey = fIcuCollator.getCollationKey(source); |
| return CollationKeyICU.wrap(icuCollKey); |
| } |
| |
| public int getDecomposition() { |
| int mode = java.text.Collator.NO_DECOMPOSITION; |
| |
| if (fIcuCollator.getStrength() == Collator.IDENTICAL) { |
| return java.text.Collator.FULL_DECOMPOSITION; |
| } |
| int icuMode = fIcuCollator.getDecomposition(); |
| if (icuMode == Collator.CANONICAL_DECOMPOSITION) { |
| mode = java.text.Collator.CANONICAL_DECOMPOSITION; |
| } |
| // else if (icuMode == Collator.NO_DECOMPOSITION) { |
| // mode = java.text.Collator.NO_DECOMPOSITION; |
| // } |
| // else { |
| // throw new IllegalStateException("Unknown decomposition mode is used by the ICU Collator."); |
| // } |
| |
| return mode; |
| } |
| |
| public int getStrength() { |
| int strength; |
| int icuStrength = fIcuCollator.getStrength(); |
| switch (icuStrength) { |
| case Collator.IDENTICAL: |
| strength = java.text.Collator.IDENTICAL; |
| break; |
| case Collator.PRIMARY: |
| strength = java.text.Collator.PRIMARY; |
| break; |
| case Collator.SECONDARY: |
| strength = java.text.Collator.SECONDARY; |
| break; |
| case Collator.TERTIARY: |
| strength = java.text.Collator.TERTIARY; |
| break; |
| case Collator.QUATERNARY: |
| // Note: No quaternary support in Java.. |
| // Return tertiary instead for now. |
| strength = java.text.Collator.TERTIARY; |
| break; |
| default: |
| throw new IllegalStateException("Unknown strength is used by the ICU Collator."); |
| } |
| return strength; |
| } |
| |
| public int hashCode() { |
| return fIcuCollator.hashCode(); |
| } |
| |
| public void setDecomposition(int decompositionMode) { |
| switch (decompositionMode) { |
| case java.text.Collator.CANONICAL_DECOMPOSITION: |
| fIcuCollator.setDecomposition(Collator.CANONICAL_DECOMPOSITION); |
| break; |
| case java.text.Collator.NO_DECOMPOSITION: |
| fIcuCollator.setDecomposition(Collator.NO_DECOMPOSITION); |
| break; |
| case java.text.Collator.FULL_DECOMPOSITION: |
| // Not supported by ICU. |
| // This option is interpreted as IDENTICAL strength. |
| fIcuCollator.setStrength(Collator.IDENTICAL); |
| break; |
| default: |
| throw new IllegalArgumentException("Invalid decomposition mode."); |
| } |
| } |
| |
| public void setStrength(int newStrength) { |
| switch (newStrength) { |
| case java.text.Collator.IDENTICAL: |
| fIcuCollator.setStrength(Collator.IDENTICAL); |
| break; |
| case java.text.Collator.PRIMARY: |
| fIcuCollator.setStrength(Collator.PRIMARY); |
| break; |
| case java.text.Collator.SECONDARY: |
| fIcuCollator.setStrength(Collator.SECONDARY); |
| break; |
| case java.text.Collator.TERTIARY: |
| fIcuCollator.setStrength(Collator.TERTIARY); |
| break; |
| default: |
| throw new IllegalArgumentException("Invalid strength."); |
| } |
| } |
| |
| } |