package sk.stuba.fiit.perconik.utilities.configuration; import java.io.Serializable; import java.util.Map.Entry; import com.google.common.base.Equivalence; import static com.google.common.base.Objects.equal; final class OptionEquivalence extends Equivalence<Entry<String, Object>> implements Serializable { private static final long serialVersionUID = 0L; static final OptionEquivalence INSTANCE = new OptionEquivalence(); private OptionEquivalence() {} static final class KeyEquivalence extends Equivalence<String> implements Serializable { private static final long serialVersionUID = 0L; static final KeyEquivalence INSTANCE = new KeyEquivalence(); private KeyEquivalence() {} @Override protected boolean doEquivalent(final String a, final String b) { return equalKeys(a, b); } @Override protected int doHash(final String s) { return hashKey(s); } @SuppressWarnings("static-method") private Object readResolve() { return INSTANCE; } } static final class ValueEquivalence extends Equivalence<Object> implements Serializable { private static final long serialVersionUID = 0L; static final ValueEquivalence INSTANCE = new ValueEquivalence(); private ValueEquivalence() {} @Override protected boolean doEquivalent(final Object a, final Object b) { return equalValues(a, b); } @Override protected int doHash(final Object o) { return hashValue(o); } @SuppressWarnings("static-method") private Object readResolve() { return INSTANCE; } } static boolean equalKeys(final String a, final String b) { return equal(a, b); } static boolean equalValues(final Object a, final Object b) { return a == b || (a != null && b != null && a.toString().equals(b.toString())); } static int hashKey(final String s) { return s != null ? s.hashCode() : 0; } static int hashValue(final Object o) { return o != null ? o.toString().hashCode() : 0; } @Override protected boolean doEquivalent(final Entry<String, Object> a, final Entry<String, Object> b) { return a == b || (a != null && b != null && equalKeys(a.getKey(), b.getKey()) && equalValues(a.getValue(), b.getValue())); } @Override protected int doHash(final Entry<String, Object> option) { return hashKey(option.getKey()) ^ hashValue(option.getValue()); } @SuppressWarnings("static-method") private Object readResolve() { return INSTANCE; } }