/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.view; import org.apache.commons.lang.ObjectUtils; import org.fudgemsg.FudgeMsg; import org.fudgemsg.MutableFudgeMsg; import org.fudgemsg.mapping.FudgeDeserializer; import org.fudgemsg.mapping.FudgeSerializer; /** * Allows two {@link Number}s to be compared to see whether they differ sufficiently for the change to be considered * a delta. */ public class NumberDeltaComparer implements DeltaComparer<Number> { private static final String DECIMAL_PLACES_FIELD = "decimalPlaces"; private final int _decimalPlaces; private final double _multiplier; /** * Constructs a new {@link NumberDeltaComparer} for detecting differences to the given number of decimal places. * * @param decimalPlaces * The number of places after the decimal point within which a change is considered to be a delta. If set to * 0, only the integral part of the values are considered. If set to a negative number, digits to the left of * the decimal point become insignificant. */ public NumberDeltaComparer(int decimalPlaces) { _decimalPlaces = decimalPlaces; _multiplier = Math.pow(10, decimalPlaces); } @Override public boolean isDelta(Number previousValue, Number newValue) { if (previousValue == null && newValue == null) { return false; } if (previousValue == null || newValue == null) { return true; } long previousCompare = (long) (previousValue.doubleValue() * _multiplier); long newCompare = (long) (newValue.doubleValue() * _multiplier); return previousCompare != newCompare; } public FudgeMsg toFudgeMsg(FudgeSerializer fudgeContext) { MutableFudgeMsg msg = fudgeContext.newMessage(); msg.add(DECIMAL_PLACES_FIELD, _decimalPlaces); return msg; } public static NumberDeltaComparer fromFudgeMsg(FudgeDeserializer fudgeContext, FudgeMsg msg) { return new NumberDeltaComparer(msg.getInt(DECIMAL_PLACES_FIELD)); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + _decimalPlaces; long temp; temp = Double.doubleToLongBits(_multiplier); result = prime * result + (int) (temp ^ (temp >>> 32)); return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof NumberDeltaComparer)) { return false; } NumberDeltaComparer other = (NumberDeltaComparer) obj; return ObjectUtils.equals(_decimalPlaces, other._decimalPlaces); } }