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.bindable.unqualified; 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 * = Rounding Adapter for percentage. 031 */ 032public class PercentRoundingAdapter extends XmlAdapter<BigDecimal, BigDecimal> { 033 034 private static final String DEFAULT_ROUNDING_MODE = "HALF_UP"; 035 private static final String DEFAULT_SCALE = "2"; 036 037 final int scale; 038 final RoundingMode roundingMode; 039 private boolean stripTrailingZeros; 040 041 /** 042 * Instantiates a new percent rounding adapter. 043 */ 044 public PercentRoundingAdapter() { 045 String name = this.getClass().getName(); 046 scale = parseInt(Configuration.INSTANCE.getProperty(name + ".scale", DEFAULT_SCALE)); 047 roundingMode = valueOf(Configuration.INSTANCE.getProperty(name + ".roundingMode", DEFAULT_ROUNDING_MODE)); 048 stripTrailingZeros = Configuration.INSTANCE.stripTrailingZeros(); 049 } 050 051 @Override 052 public BigDecimal unmarshal(BigDecimal p) throws Exception { 053 return p; 054 } 055 056 @Override 057 public BigDecimal marshal(BigDecimal value) throws Exception { 058 if (value == null) { return null; } 059 BigDecimal roundedValue = value.setScale(scale, roundingMode); 060 if (stripTrailingZeros) { return roundedValue.stripTrailingZeros(); } 061 return roundedValue; 062 } 063}