001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019 020 package org.apache.myfaces.tobago.util; 021 022 import java.text.CollationKey; 023 import java.text.Collator; 024 import java.util.Comparator; 025 026 027 public abstract class ComparatorBase implements Comparator { 028 029 030 private Comparator comparator; 031 032 private boolean reverse; 033 034 035 protected ComparatorBase() { 036 } 037 038 protected ComparatorBase(boolean reverse, Comparator comparator) { 039 this.comparator = comparator; 040 this.reverse = reverse; 041 } 042 043 protected ComparatorBase(boolean reverse) { 044 this.reverse = reverse; 045 } 046 047 protected ComparatorBase(Comparator comparator) { 048 this.comparator = comparator; 049 } 050 051 protected int internalCompare(Object obj1, Object obj2) { 052 053 if (obj1 == null || obj2 == null) { 054 if (obj1 == null && obj2 == null) { 055 return 0; 056 } 057 if (obj1 == null) { 058 return reverse ? 1 : -1; 059 } else { 060 return reverse ? -1 : 1; 061 } 062 } 063 064 if (!obj1.getClass().isInstance(obj2)) { 065 throw new ClassCastException(obj1.getClass().getName() + " != " 066 + obj2.getClass().getName()); 067 } 068 069 int result; 070 071 072 if (comparator instanceof Collator) { 073 CollationKey collationKey1 074 = ((Collator) comparator).getCollationKey(obj1.toString()); 075 CollationKey collationKey2 076 = ((Collator) comparator).getCollationKey(obj2.toString()); 077 result = collationKey1.compareTo(collationKey2); 078 079 } else if (comparator != null) { 080 result = comparator.compare(obj1, obj2); 081 } else { 082 if (obj1 instanceof String) { 083 result = ((String) obj1).compareToIgnoreCase((String) obj2); 084 } else if (obj1 instanceof Comparable) { 085 result = ((Comparable) obj1).compareTo(obj2); 086 } else { 087 result = obj1.toString().compareTo(obj2.toString()); 088 } 089 } 090 return reverse ? -result : result; 091 } 092 093 /* 094 095 // TODO use this?? 096 public boolean equals(Object o) { 097 if (this == o) { 098 return true; 099 } 100 if (o == null || getClass() != o.getClass()) { 101 return false; 102 } 103 104 final ComparatorBase that = (ComparatorBase) o; 105 106 return !(comparator != null ? !comparator.equals(that.comparator) : that.comparator != null); 107 108 } 109 110 public int hashCode() { 111 return (comparator != null ? comparator.hashCode() : 0); 112 } */ 113 114 public boolean equals(Object o) { 115 if (o == null) { 116 return false; 117 } 118 return ((ComparatorBase) o).getComparator().equals(comparator); 119 } 120 121 public int hashCode() { 122 return (comparator != null ? comparator.hashCode() : 0); 123 } 124 125 public Comparator getComparator() { 126 return comparator; 127 } 128 }