package fr.openwide.core.commons.util.ordering; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.text.Collator; import java.util.Locale; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.google.common.collect.Ordering; /** * A wrapper class providing {@link Collator}-like functionnality in a {@link Serializable} object. * <p>This class extends {@link Ordering}. * <p><em>Note:</em> Collators themselves are <strong>not</strong> Serializable */ public final class SerializableCollator extends Ordering<String> implements Serializable { private static final long serialVersionUID = -7694744450385630563L; private final Locale locale; private transient Collator collator; /** * @see Collator#getInstance(Locale) */ public SerializableCollator(Locale locale) { this.locale = locale; initCollator(); } private void initCollator() { this.collator = Collator.getInstance(locale); } /** * @see Collator#getStrength() */ public int getStrength() { return collator.getStrength(); } /** * @see Collator#setStrength(int) */ public void setStrength(int strength) { collator.setStrength(strength); } /** * @see Collator#getDecomposition() */ public int getDecomposition() { return collator.getDecomposition(); } /** * @see Collator#setDecomposition(int) */ public void setDecomposition(int decomposition) { collator.setDecomposition(decomposition); } /** * @see Collator#compare(String, String) */ @Override public int compare(final String left, final String right) { return collator.compare(left, right); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof SerializableCollator)) { return false; } SerializableCollator other = (SerializableCollator) obj; return new EqualsBuilder() .append(locale, other.locale) .append(collator, other.collator) .build(); } @Override public int hashCode() { return new HashCodeBuilder() .append(locale) .append(collator) .build(); } @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) .append(locale) .append(collator) .build(); } private void writeObject(final ObjectOutputStream out) throws IOException { out.defaultWriteObject(); out.writeInt(collator.getStrength()); out.writeInt(collator.getDecomposition()); } private void readObject(final ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); initCollator(); setStrength(in.readInt()); setDecomposition(in.readInt()); } }