package com.ora.jsp.tags.sql.value;
import java.lang.reflect.*;
import java.math.*;
import java.text.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import com.ora.jsp.sql.value.*;
import com.ora.jsp.tags.sql.ValueTagParent;
import com.ora.jsp.util.*;
/**
* This class is a custom action intended to be used in the body of
* a sqlQuery or an sqlUpdate action element. It adds the specified
* value to its parent's value list.
*
* @author Hans Bergsten, Gefion software <hans@gefionsoftware.com>
* @version 1.0
*/
public class BigDecimalValueTag extends ValueTag {
private BigDecimal value;
/**
* Sets the value property.
*/
public void setValue(BigDecimal value) {
this.value = value;
}
/**
* Gets the value, specified by the value attribute, the stringValue
* attribute, the param attribute, or the name and property attributes,
* and adds it to the parent's value list. If the value is a String
* and a pattern attribute is specified, the String is converted
* into the appropriate type before being added to the parent's
* value list.
*/
public int doEndTag() throws JspException {
if (stringValue != null) {
value = toBigDecimal(stringValue, pattern);
}
else if (param != null) {
String paramValue = getParameter(param);
value = toBigDecimal(paramValue, pattern);
}
else if (name != null) {
value = getBigDecimal(name, property, pattern);
}
ValueTagParent parent =
(ValueTagParent) findAncestorWithClass(this, ValueTagParent.class);
if (parent == null) {
throw new JspException("The sqlBigDecimalValue action is not " +
"enclosed by a supported action type");
}
parent.addValue(new BigDecimalValue(value));
return EVAL_PAGE;
}
/**
* Releases all instance variables.
*/
public void release() {
value = null;
super.release();
}
private BigDecimal toBigDecimal(String stringValue, String pattern)
throws JspException {
BigDecimal bdValue = null;
try {
Number number = StringFormat.toNumber(stringValue, pattern);
bdValue = new BigDecimal(number.doubleValue());
}
catch (ParseException e) {
throw new JspException(stringValue + " can not be converted to " +
" a BigDecimal using pattern: " + pattern + ". Message: " +
e.getMessage());
}
return bdValue;
}
private BigDecimal getBigDecimal(String beanName, String propertyName,
String pattern) throws JspException {
BigDecimal bdValue = null;
Object bean = getBean(beanName);
Method readMethod = getPropertyReadMethod(bean, propertyName);
Class returnType = readMethod.getReturnType();
Object value = getValue(bean, readMethod, propertyName);
if (BigDecimal.class.isAssignableFrom(returnType)) {
bdValue = (BigDecimal) value;
}
else if (String.class.isAssignableFrom(returnType)) {
bdValue = toBigDecimal((String) value, pattern);
}
else {
throw new JspException("Read method for the " + propertyName +
" property in the bean named " + beanName + " is not of type " +
" String or BigDecimal");
}
return bdValue;
}
} |