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.lang.System.getProperty; 022import static java.math.RoundingMode.valueOf; 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 040 /** 041 * Instantiates a new percent rounding adapter. 042 */ 043 public PercentRoundingAdapter() { 044 String name = this.getClass().getName(); 045 scale = parseInt(getProperty(name + ".scale", DEFAULT_SCALE)); 046 roundingMode = valueOf(getProperty(name + ".roundingMode", DEFAULT_ROUNDING_MODE)); 047 } 048 049 @Override 050 public BigDecimal unmarshal(BigDecimal p) throws Exception { 051 return p; 052 } 053 054 @Override 055 public BigDecimal marshal(BigDecimal value) throws Exception { 056 if (value == null) { return null; } 057 return value.setScale(scale, roundingMode).stripTrailingZeros(); 058 } 059}