com.webbfontaine.valuewebb.irms.impl.bean.Calculator.java Source code

Java tutorial

Introduction

Here is the source code for com.webbfontaine.valuewebb.irms.impl.bean.Calculator.java

Source

/*
 * Copyrights 2002-2011 Webb Fontaine
 * Developer: Sargis Harutyunyan
 * Date: 25 nov. 2011
 * This software is the proprietary information of Webb Fontaine.
 * Its use is subject to License terms.
 */
package com.webbfontaine.valuewebb.irms.impl.bean;

import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterators;
import com.webbfontaine.valuewebb.model.TtInv;
import com.webbfontaine.valuewebb.model.util.Utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;

import static com.webbfontaine.valuewebb.model.constants.Constants.FRACTION_DIGITS_NUMBER_2;
import static java.util.Arrays.asList;

class Calculator {

    private static final Logger LOGGER = LoggerFactory.getLogger(Calculator.class);

    private final BigDecimal nationalCurrencyRate;
    private final BigDecimal usdCurrencyRate;

    Calculator(TtInv ttInv) {
        this(ttInv.getInvCurRat(), ttInv.getUsdRat());
    }

    Calculator(BigDecimal nationalCurrencyRate, BigDecimal usdCurrencyRate) {
        this.nationalCurrencyRate = nationalCurrencyRate;
        this.usdCurrencyRate = usdCurrencyRate;
    }

    public BigDecimal toNationalCurrency(BigDecimal amount) {
        if (anyNull(amount, nationalCurrencyRate)) {
            LOGGER.info("Found null for [amount, nationalCurrencyRate]: {}, returning 0",
                    asList(amount, nationalCurrencyRate));
            return BigDecimal.ZERO;
        }

        return scale(amount.multiply(nationalCurrencyRate));
    }

    public BigDecimal toUSD(BigDecimal amount) {
        if (anyNullOrZero(amount, nationalCurrencyRate, usdCurrencyRate)) {
            LOGGER.info("Found null/zero for [amount, nationalCurrencyRate, usdCurrencyRate]: {}, returning 0",
                    asList(amount, nationalCurrencyRate, usdCurrencyRate));
            return BigDecimal.ZERO;
        }

        return amount.multiply(nationalCurrencyRate).divide(usdCurrencyRate, FRACTION_DIGITS_NUMBER_2,
                Utils.getRoundingMode());
    }

    private static BigDecimal scale(BigDecimal value) {
        return value.setScale(FRACTION_DIGITS_NUMBER_2, Utils.getRoundingMode());
    }

    private static boolean anyNull(BigDecimal... values) {
        return Iterators.any(Iterators.forArray(values), new EqualsNullPredicate());
    }

    private static boolean anyZero(BigDecimal... values) {
        return Iterators.any(Iterators.forArray(values), new EqualsZeroPredicate());
    }

    private static boolean anyNullOrZero(BigDecimal... values) {
        Predicate<BigDecimal> composite = Predicates.or(new EqualsNullPredicate(), new EqualsZeroPredicate());
        return Iterators.any(Iterators.forArray(values), composite);
    }

    private static class EqualsNullPredicate implements Predicate<BigDecimal> {
        @Override
        public boolean apply(BigDecimal input) {
            return input == null;
        }
    }

    private static class EqualsZeroPredicate implements Predicate<BigDecimal> {
        @Override
        public boolean apply(BigDecimal value) {
            return value.compareTo(BigDecimal.ZERO) == 0;
        }
    }
}