1 package org.apidesign.apifest08.currency;
3 import java.math.BigDecimal;
4 import java.math.RoundingMode;
7 * This class encapsulates settings for currency conversion
8 * We can use it eg. for uptime options etc. in future versions
10 * @author Ladislav Vitasek
12 final public class ConversionProperties {
14 private final ConversionRatioProvider conversionRatioProvider;
15 private final RoundingMode roundingMode;
18 * Returns conversion constants - conversion operation is invertable
21 private final static class FixedBidirectionalRatioConversion implements ConversionRatioProvider {
22 private final BigDecimal currency1ToCurrency2Constant;
23 private final BigDecimal currency2ToCurrency1Constant;
24 private static final int SCALE_MAX_DEFAULT = 20;
28 * @param ratioConstant fixed ratio constant
29 * @param mode math rounding mode
30 * @throws IllegalArgumentException if conversion value is <= 0
32 private FixedBidirectionalRatioConversion(BigDecimal ratioConstant, RoundingMode mode) {
33 if (ratioConstant.compareTo(BigDecimal.ZERO) <= 0)
34 throw new IllegalArgumentException("Conversion value cannot be <= 0");
35 this.currency1ToCurrency2Constant = ratioConstant;
36 this.currency2ToCurrency1Constant = BigDecimal.ONE.setScale(SCALE_MAX_DEFAULT).divide(ratioConstant, mode);
39 public BigDecimal getCurrency1ToCurrency2Constant() {
40 return currency1ToCurrency2Constant;
43 public BigDecimal getCurrency2ToCurrency1Constant() {
44 return currency2ToCurrency1Constant;
50 * Returns new instance Conversion properties - fixed conversion ratio - both directions
51 * Default max scale is set to 20
53 * @param conversionConstant value of constant for conversion
54 * @param roundingMode math rounding mode
55 * @return new instance of ConversionProperties class
56 * @throws IllegalArgumentException if conversion constant is <= 0
57 * @see org.apidesign.apifest08.currency.ConversionProperties.FixedBidirectionalRatioConversion
59 public static ConversionProperties create(BigDecimal conversionConstant, RoundingMode roundingMode) {
60 return create(new FixedBidirectionalRatioConversion(conversionConstant, roundingMode), roundingMode);
64 * Returns new instance Conversion properties
66 * @param conversionRatioProvider provider for conversion constants
67 * @param roundingMode math rounding mode
68 * @return new instance of ConversionProperties class
70 public static ConversionProperties create(ConversionRatioProvider conversionRatioProvider, RoundingMode roundingMode) {
71 if (conversionRatioProvider == null || roundingMode == null)
72 throw new NullPointerException();
73 return new ConversionProperties(conversionRatioProvider, roundingMode);
77 * Returns new instance Conversion properties with values set to conversionConstant=BigDecimal.ONE
78 * and roundingMode=RoundingMode.HALF_EVEN
80 * Conversion is bidirectional.
84 public static ConversionProperties createDefault() {
85 return create(BigDecimal.ONE, RoundingMode.HALF_EVEN);
88 private ConversionProperties(ConversionRatioProvider conversionRatioProvider, RoundingMode roundingMode) {
89 this.conversionRatioProvider = conversionRatioProvider;
90 this.roundingMode = roundingMode;
94 public RoundingMode getRoundingMode() {
98 public ConversionRatioProvider getConversionRatioProvider() {
99 return conversionRatioProvider;