001package org.javamoney.moneta.internal;
002
003import java.math.RoundingMode;
004
005import javax.money.CurrencyUnit;
006import javax.money.MonetaryContext;
007import javax.money.MonetaryContext.AmountFlavor;
008
009import org.javamoney.moneta.Money;
010import org.javamoney.moneta.spi.AbstractAmountFactory;
011
012/**
013 * Implementation of {@link javax.money.MonetaryAmountFactory} creating instances of {@link Money}.
014 *
015 * @author Anatole Tresch
016 */
017public class MoneyAmountFactory extends AbstractAmountFactory<Money> {
018
019        static final MonetaryContext DEFAULT_CONTEXT = new MonetaryContext.Builder(
020                        Money.class).setPrecision(64)
021                        .setMaxScale(63).set(RoundingMode.HALF_EVEN)
022                        .setFlavor(AmountFlavor.PRECISION).create();
023        static final MonetaryContext MAX_CONTEXT = new MonetaryContext.Builder(
024                        Money.class).setPrecision(0)
025                        .setMaxScale(-1).set(RoundingMode.HALF_EVEN)
026                        .setFlavor(AmountFlavor.PRECISION).create();
027
028        @Override
029        protected Money create(CurrencyUnit currency, Number number,
030                        MonetaryContext monetaryContext) {
031                return Money.of(currency, number,
032                                MonetaryContext.from(monetaryContext, Money.class));
033        }
034
035        @Override
036        public Class<Money> getAmountType() {
037                return Money.class;
038        }
039
040        @Override
041        protected MonetaryContext loadDefaultMonetaryContext() {
042                return DEFAULT_CONTEXT;
043        }
044
045        @Override
046        protected MonetaryContext loadMaxMonetaryContext() {
047                return MAX_CONTEXT;
048        }
049
050}