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