org.milyn.javabean.decoders.NumberDecoder Maven / Gradle / Ivy
/*
* Milyn - Copyright (C) 2006 - 2010
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License (version 2.1) as published by the Free Software
* Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* See the GNU Lesser General Public License for more details:
* http://www.gnu.org/licenses/lgpl.txt
*/
package org.milyn.javabean.decoders;
import org.milyn.cdr.SmooksConfigurationException;
import org.milyn.javabean.DataDecodeException;
import org.milyn.javabean.DataEncoder;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
import java.util.Properties;
/**
* Abstract {@link Number} based DataDecoder.
*
* @author [email protected]
*/
public abstract class NumberDecoder extends LocaleAwareDecoder implements DataEncoder {
/**
* Format.
*/
public static final String FORMAT = "format";
/**
* Type.
*/
public static final String TYPE = "type";
private NumberType type;
public static enum NumberType {
RAW,
PERCENTAGE,
CURRENCY
}
private NumberFormat numberFormat;
public void setConfiguration(Properties config) throws SmooksConfigurationException {
super.setConfiguration(config);
String pattern = config.getProperty(FORMAT);
String typeConfig = config.getProperty(TYPE);
Locale locale = getLocale();
if(locale == null && pattern == null) {
// Don't create a formatter if neither locale or
// pattern are configured...
return;
}
if(locale == null) {
locale = Locale.getDefault();
}
if(typeConfig == null) {
type = NumberType.RAW;
} else {
try {
type = NumberType.valueOf(typeConfig);
} catch(Exception e) {
throw new SmooksConfigurationException("Unsupported Number type specification '" + typeConfig + "'. Must be one of '" + NumberType.values() + "'.");
}
}
if(type == NumberType.PERCENTAGE || (pattern != null && pattern.indexOf('%') != -1)) {
type = NumberType.PERCENTAGE;
numberFormat = NumberFormat.getPercentInstance(locale);
} else if(type == NumberType.CURRENCY) {
numberFormat = NumberFormat.getCurrencyInstance(locale);
} else {
numberFormat = NumberFormat.getInstance(locale);
numberFormat.setGroupingUsed(false);
if(pattern != null && numberFormat instanceof DecimalFormat) {
((DecimalFormat) numberFormat).applyPattern(pattern);
}
}
}
/**
* Get the {@link NumberFormat} instance, if one exists.
* @return A clone of the {@link NumberFormat} instance, otherwise null.
*/
public NumberFormat getNumberFormat() {
if(numberFormat != null) {
return (NumberFormat) numberFormat.clone();
} else {
return null;
}
}
public NumberType getType() {
return type;
}
public boolean isPercentage() {
return type == NumberType.PERCENTAGE;
}
public String encode(Object object) throws DataDecodeException {
if(numberFormat != null) {
return getNumberFormat().format(object);
} else {
return object.toString();
}
}
}