public int compareTo(Object o) {
    final String pattern = ((StringComparable) o).toString();
    if (m_text.equals(pattern)) { // Code-point equals
      return 0;
    }
    final int savedStrength = m_collator.getStrength();
    int comp = 0;
    // Is there difference more significant than case-order?
    if (((savedStrength == Collator.PRIMARY) || (savedStrength == Collator.SECONDARY))) {
      comp = m_collator.compare(m_text, pattern);
    } else { // more than SECONDARY
      m_collator.setStrength(Collator.SECONDARY);
      comp = m_collator.compare(m_text, pattern);
      m_collator.setStrength(savedStrength);
    }
    if (comp != 0) { // Difference more significant than case-order
      return comp;
    }

    // No difference more significant than case-order.
    // Find case difference
    comp = getCaseDiff(m_text, pattern);
    if (comp != 0) {
      return comp;
    } else { // No case differences. Less significant difference could exist
      return m_collator.compare(m_text, pattern);
    }
  }
  private final int getCaseDiff(final String text, final String pattern) {
    final int savedStrength = m_collator.getStrength();
    final int savedDecomposition = m_collator.getDecomposition();
    m_collator.setStrength(Collator.TERTIARY); // not to ignore case
    m_collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION); // corresponds NDF

    final int diff[] = getFirstCaseDiff(text, pattern, m_locale);
    m_collator.setStrength(savedStrength); // restore
    m_collator.setDecomposition(savedDecomposition); // restore
    if (diff != null) {
      if ((m_caseOrder).equals("upper-first")) {
        if (diff[0] == UPPER_CASE) {
          return -1;
        } else {
          return 1;
        }
      } else { // lower-first
        if (diff[0] == LOWER_CASE) {
          return -1;
        } else {
          return 1;
        }
      }
    } else { // No case differences
      return 0;
    }
  }
 public StringComparable(
     final String text, final Locale locale, final Collator collator, final String caseOrder) {
   m_text = text;
   m_locale = locale;
   m_collator = (RuleBasedCollator) collator;
   m_caseOrder = caseOrder;
   m_mask = getMask(m_collator.getStrength());
 }