package de.invesdwin.util.lang;
import java.io.Serializable;
import javax.annotation.concurrent.NotThreadSafe;
/**
* This can be used to display a specific String in a table, but let the auto sort work on an uderlying comparable
* object.
*/
@NotThreadSafe
@SuppressWarnings("rawtypes")
public class ComparableString<E extends Comparable> implements Comparable<Object>, Serializable, CharSequence {
private final String str;
private final E comparable;
public ComparableString(final String str, final E comparable) {
this.str = str;
this.comparable = comparable;
}
@SuppressWarnings("unchecked")
@Override
public int compareTo(final Object o) {
return comparable.compareTo(maybeUnwrapComparable(o));
}
@Override
public int hashCode() {
return comparable.hashCode();
}
@Override
public boolean equals(final Object obj) {
return comparable.equals(maybeUnwrapComparable(obj));
}
@Override
public String toString() {
return str;
}
public E getComparable() {
return comparable;
}
public static Comparable maybeUnwrapComparable(final Object obj) {
if (obj instanceof ComparableString) {
final ComparableString cObj = (ComparableString) obj;
return cObj.comparable;
} else {
return (Comparable) obj;
}
}
@Override
public int length() {
return str.length();
}
@Override
public char charAt(final int index) {
return str.charAt(index);
}
@Override
public CharSequence subSequence(final int start, final int end) {
return str.subSequence(start, end);
}
}