org.yestech.lib.currency.Money.java Source code

Java tutorial

Introduction

Here is the source code for org.yestech.lib.currency.Money.java

Source

/*
 * Copyright LGPL3
 * YES Technology Association
 * http://yestech.org
 *
 * http://www.opensource.org/licenses/lgpl-3.0.html
 */

/*
 *
 * Author:  Artie Copeland
 * Last Modified Date: $DateTime: $
 */
package org.yestech.lib.currency;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;

import javax.persistence.Embeddable;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Currency;
import java.util.Locale;

import com.thoughtworks.xstream.annotations.XStreamAlias;

/**
 * Represents an immutable monetary value. By default it assumes {@link Locale#US} and
 * the corresponding Currency.
 *
 * @author Artie Copeland
 * @version $Revision: $
 */
@XStreamAlias("money")
@XmlRootElement(name = "money")
public class Money implements Serializable, Comparable<Money> {
    private BigDecimal amount = BigDecimal.ZERO;
    private Locale locale;
    private Currency curreny;

    /**
     * ONLY used for xml serialization and deserialization!!!!!
     */
    public Money() {
    }

    /**
     * ONLY used for xml deserialization!!!!!
     */
    public void setAmount(BigDecimal amount) {
        this.amount = amount;
    }

    /**
     * ONLY used for xml deserialization!!!!!
     */
    public void setLocale(Locale locale) {
        this.locale = locale;
    }

    /**
     * ONLY used for xml deserialization!!!!!
     */
    public void setCurreny(Currency curreny) {
        this.curreny = curreny;
    }

    public Money(double amount) {
        this(amount, Locale.US);
    }

    public Money(double amount, Locale locale) {
        if (amount < 0) {
            throw new CurrencyException("money amount must be a positive number");
        }
        if (locale == null) {
            throw new CurrencyException("can't have a null locale");
        }
        this.amount = new BigDecimal(amount);
        this.locale = locale;
        this.curreny = Currency.getInstance(locale);
    }

    public Money(String amount) {
        this(amount, Locale.US);
    }

    public Money(String amount, Locale locale) {
        BigDecimal tmpAmount;
        if (StringUtils.isBlank(amount) || !NumberUtils.isNumber(amount)) {
            throw new CurrencyException("money amount must be a positive number");
        } else {
            tmpAmount = new BigDecimal(amount);
            validateAmount(tmpAmount);
        }
        if (locale == null) {
            throw new CurrencyException("can't have a null locale");
        }
        this.amount = tmpAmount;
        this.locale = locale;
        this.curreny = Currency.getInstance(locale);
    }

    public Money(BigDecimal amount) {
        this(amount, Locale.US);
    }

    public Money(BigDecimal amount, Locale locale) {
        validateAmount(amount);
        if (locale == null) {
            throw new CurrencyException("can't have a null locale");
        }
        this.amount = amount;
        this.locale = locale;
        this.curreny = Currency.getInstance(locale);
    }

    private void validateAmount(BigDecimal amount) {
        if (amount == null || amount.doubleValue() < BigDecimal.ZERO.doubleValue()) {
            throw new CurrencyException("can't have a null of negative money amount");
        }
    }

    public BigDecimal getAmount() {
        return amount;
    }

    public Currency getCurreny() {
        return curreny;
    }

    public Locale getLocale() {
        return locale;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (!(o instanceof Money))
            return false;

        Money money = (Money) o;

        if (amount != null ? !amount.equals(money.amount) : money.amount != null)
            return false;
        if (curreny != null ? !curreny.equals(money.curreny) : money.curreny != null)
            return false;
        if (locale != null ? !locale.equals(money.locale) : money.locale != null)
            return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = amount != null ? amount.hashCode() : 0;
        result = 31 * result + (locale != null ? locale.hashCode() : 0);
        result = 31 * result + (curreny != null ? curreny.hashCode() : 0);
        return result;
    }

    @Override
    public String toString() {
        return "Money{" + "amount=" + amount + ", locale=" + locale + ", curreny=" + curreny + '}';
    }

    @Override
    public int compareTo(Money comparable) {
        return getAmount().compareTo(comparable.getAmount());
    }
}