package org.javers.core.diff.custom;
import org.javers.core.diff.changetype.ValueChange;
import org.javers.core.metamodel.object.GlobalId;
import org.javers.core.metamodel.property.Property;
import java.math.BigDecimal;
import static java.math.BigDecimal.ROUND_HALF_UP;
/**
* Compares BigDecimals with custom precision.
* Before comparing, values are rounded (HALF_UP) to required scale.
* <br/><br/>
*
* Usage example:
* <pre>
* JaversBuilder.javers()
* .registerCustomComparator(new CustomBigDecimalComparator(2), BigDecimal).build();
* </pre>
*
* @author bartosz walacik
*/
public class CustomBigDecimalComparator implements CustomPropertyComparator<BigDecimal, ValueChange>{
private int significantDecimalPlaces;
public CustomBigDecimalComparator(int significantDecimalPlaces) {
this.significantDecimalPlaces = significantDecimalPlaces;
}
@Override
public ValueChange compare(BigDecimal left, BigDecimal right, GlobalId affectedId,
Property property)
{
BigDecimal leftRounded = left.setScale(significantDecimalPlaces, ROUND_HALF_UP);
BigDecimal rightRounded = right.setScale(significantDecimalPlaces, ROUND_HALF_UP);
if (leftRounded.equals(rightRounded)){
return null;
}
return new ValueChange(affectedId, property.getName(), left, right);
}
}