private static int hashCode(final Object obj, final Iterable<String> propertyNamesIter) { final List<Object> propertyValues = Lists.newArrayList(); for (final Clause clause : clausesFor(propertyNamesIter)) { final Object propertyValue = clause.getValueOf(obj); if(propertyValue != null) { propertyValues.add(propertyValue); } } return Objects.hashCode(propertyValues.toArray()); } //endregion
private String toStringOf(final Object p, final Iterable<String> propertyNamesIter) { final ToStringHelper stringHelper = Objects.toStringHelper(p); for (final Clause clause : clausesFor(propertyNamesIter)) { stringHelper.add(clause.getPropertyName(), asString(clause, p)); } return stringHelper.toString(); }
private static boolean equals(final Object p, final Object q, final Iterable<String> propertyNamesIter) { final Iterable<Clause> clauses = clausesFor(propertyNamesIter); for (final Clause clause : clauses) { final Object pValue = clause.getValueOf(p); final Object qValue = clause.getValueOf(q); if(!Objects.equal(pValue, qValue)) { return false; } } return true; } //endregion
private static <T> int compare(final T p, final T q, final Iterable<String> propertyNamesIter) { if(p == null) { return -1;} if(q == null) { return +1;} if(p.getClass() != q.getClass()) { // just sort on the class type return Ordering.natural().onResultOf(new Function<Object, String>() { @Override public String apply(final Object o) { return o.getClass().getSimpleName(); } }).compare(p, q); } final Iterable<Clause> clauses = clausesFor(propertyNamesIter); ComparisonChain chain = ComparisonChain.start(); for (final Clause clause : clauses) { final Comparable<T> propertyValueOfP = (Comparable<T>) clause.getValueOf(p); final Comparable<T> propertyValueOfQ = (Comparable<T>) clause.getValueOf(q); chain = chain.compare(propertyValueOfP, propertyValueOfQ, clause.getDirection().getOrdering()); } return chain.result(); } //endregion