com.opengamma.engine.view.NumberDeltaComparer.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.engine.view.NumberDeltaComparer.java

Source

/**
 * 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);
    }

}