001/* Copyright (C) 2014 konik.io 002 * 003 * This file is part of the Konik library. 004 * 005 * The Konik library is free software: you can redistribute it and/or modify 006 * it under the terms of the GNU Affero General Public License as 007 * published by the Free Software Foundation, either version 3 of the 008 * License, or (at your option) any later version. 009 * 010 * The Konik library is distributed in the hope that it will be useful, 011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 013 * GNU Affero General Public License for more details. 014 * 015 * You should have received a copy of the GNU Affero General Public License 016 * along with the Konik library. If not, see <http://www.gnu.org/licenses/>. 017 */ 018package io.konik.jaxb.adapter; 019 020import static java.lang.Integer.parseInt; 021import static java.math.RoundingMode.valueOf; 022import io.konik.Configuration; 023 024import java.math.BigDecimal; 025import java.math.RoundingMode; 026 027import javax.xml.bind.annotation.adapters.XmlAdapter; 028 029/** 030 * 031 * Adapter to round the BigDecimal for marshalling to four decimals after the period. 032 * 033 * The scale and rounding mode can be overridden via the configuration. 034 * 035 * Defaults:: 036 * 037 * ---- 038 * io.konik.jaxb.adapter.BigDecimalRoundingAdapter.scale=4 039 * io.konik.jaxb.adapter.BigDecimalRoundingAdapter.roundingMode=HALF_UP 040 * ---- 041 * 042 */ 043public class QuantityRoundingAdapter extends XmlAdapter<BigDecimal, BigDecimal> { 044 045 private static final String DEFAULT_ROUNDING_MODE = "HALF_UP"; 046 private static final String DEFAULT_SCALE = "4"; 047 048 final int scale; 049 final RoundingMode roundingMode; 050 private final boolean stripTrailingZeros; 051 052 /** 053 * Instantiates a new amount rounding adapter. 054 */ 055 public QuantityRoundingAdapter() { 056 String name = this.getClass().getName(); 057 scale = parseInt(Configuration.INSTANCE.getProperty(name + ".scale", DEFAULT_SCALE)); 058 roundingMode = valueOf(Configuration.INSTANCE.getProperty(name + ".roundingMode", DEFAULT_ROUNDING_MODE)); 059 stripTrailingZeros = Configuration.INSTANCE.stripTrailingZeros(); 060 } 061 062 @Override 063 public BigDecimal unmarshal(BigDecimal amount) throws Exception { 064 return amount; 065 } 066 067 @Override 068 public BigDecimal marshal(BigDecimal amount) throws Exception { 069 if (amount == null) { return null; } 070 BigDecimal roundedValue = amount.setScale(scale, roundingMode); 071 if (stripTrailingZeros) { return roundedValue.stripTrailingZeros(); } 072 return roundedValue; 073 } 074}