nl.strohalm.cyclos.utils.Amount.java Source code

Java tutorial

Introduction

Here is the source code for nl.strohalm.cyclos.utils.Amount.java

Source

/*
This file is part of Cyclos (www.cyclos.org).
A project of the Social Trade Organisation (www.socialtrade.org).
    
Cyclos is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
    
Cyclos is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
    
You should have received a copy of the GNU General Public License
along with Cyclos; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    
 */
package nl.strohalm.cyclos.utils;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.MathContext;

import nl.strohalm.cyclos.entities.settings.LocalSettings;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

/**
 * Represents a percentage or fixed value
 * @author luis
 */
public class Amount implements Serializable, Cloneable {

    public static enum Type implements StringValuedEnum {
        PERCENTAGE("P"), FIXED("F");
        public static Type getFromValue(final String value) {
            for (final Type type : values()) {
                if (type.getValue().equals(value)) {
                    return type;
                }
            }
            return null;
        }

        private final String value;

        private Type(final String value) {
            this.value = value;
        }

        // TODO JAVADOC
        public BigDecimal apply(final BigDecimal number, final BigDecimal amount) {
            if (number == null || amount == null) {
                return number;
            }
            final MathContext mathContext = new MathContext(LocalSettings.BIG_DECIMAL_DIVISION_PRECISION);
            if (this == FIXED) {
                return amount;
            } else {
                return (number.multiply(amount).divide(new BigDecimal(100), mathContext));
            }
        }

        public String getValue() {
            return value;
        }
    }

    private static final long serialVersionUID = 6344417251664586114L;

    public static Amount fixed(final BigDecimal value) {
        final Amount amount = new Amount();
        amount.setType(Type.FIXED);
        amount.setValue(value);
        return amount;
    }

    public static Amount percentage(final BigDecimal value) {
        final Amount amount = new Amount();
        amount.setType(Type.PERCENTAGE);
        amount.setValue(value);
        return amount;
    }

    private Type type;
    private BigDecimal value;

    public Amount() {
    }

    public Amount(final BigDecimal value, final Type type) {
        this.value = value;
        this.type = type;
    }

    // TODO JAVADOC
    public BigDecimal add(final BigDecimal number) {
        final BigDecimal applied = apply(number);
        if (applied == null) {
            return null;
        }
        return applied.add(number);
    }

    // TODO JAVADOC
    public BigDecimal apply(final BigDecimal number) {
        if (value == null || type == null || number == null) {
            return number;
        }
        return type.apply(number, value);
    }

    @Override
    public Amount clone() {
        try {
            return (Amount) super.clone();
        } catch (final CloneNotSupportedException e) {
            return null;
        }
    }

    @Override
    public boolean equals(final Object obj) {
        if (!(obj instanceof Amount)) {
            return false;
        }
        final Amount amount = (Amount) obj;
        return new EqualsBuilder().append(value, amount.value).append(type, amount.type).isEquals();
    }

    public Type getType() {
        return type;
    }

    public BigDecimal getValue() {
        return value;
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder().append(value).append(type).toHashCode();
    }

    public boolean isPercentage() {
        return type == Type.PERCENTAGE;
    }

    public void setType(final Type type) {
        this.type = type;
    }

    public void setValue(final BigDecimal value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return value + (type == Type.PERCENTAGE ? "%" : "");
    }
}