You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@velocity.apache.org by nb...@apache.org on 2007/08/28 18:39:38 UTC
svn commit: r570481 -
/velocity/tools/branches/2.x/src/main/java/org/apache/velocity/tools/config/Data.java
Author: nbubna
Date: Tue Aug 28 09:39:36 2007
New Revision: 570481
URL: http://svn.apache.org/viewvc?rev=570481&view=rev
Log:
refactor/simplify Data implementation
Modified:
velocity/tools/branches/2.x/src/main/java/org/apache/velocity/tools/config/Data.java
Modified: velocity/tools/branches/2.x/src/main/java/org/apache/velocity/tools/config/Data.java
URL: http://svn.apache.org/viewvc/velocity/tools/branches/2.x/src/main/java/org/apache/velocity/tools/config/Data.java?rev=570481&r1=570480&r2=570481&view=diff
==============================================================================
--- velocity/tools/branches/2.x/src/main/java/org/apache/velocity/tools/config/Data.java (original)
+++ velocity/tools/branches/2.x/src/main/java/org/apache/velocity/tools/config/Data.java Tue Aug 28 09:39:36 2007
@@ -22,13 +22,13 @@
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
+import java.util.Locale;
import org.apache.commons.beanutils.Converter;
import org.apache.commons.beanutils.converters.BooleanConverter;
-import org.apache.commons.beanutils.converters.DoubleConverter;
-import org.apache.commons.beanutils.converters.IntegerConverter;
import org.apache.commons.beanutils.converters.StringConverter;
-import org.apache.velocity.tools.ToolInfo;
import org.apache.velocity.tools.ClassUtils;
+import org.apache.velocity.tools.ConversionUtils;
+import org.apache.velocity.tools.ToolInfo;
/**
*
@@ -43,7 +43,9 @@
private String key;
private String type;
private Object value;
- private DataConverter converter;
+ private boolean isList;
+ private Class target;
+ private Converter converter;
public Data()
{
@@ -86,25 +88,57 @@
// save the set type
this.type = type;
- // first check if it is a type we support explicitly
- DataConverter dc = getDataConverter(type);
- if (dc != null)
+ //TODO: check if this is a list type
+ // if auto, try to sniff
+ if (type.startsWith("list."))
+ {
+ // use a list converter and drop to subtype
+ this.isList = true;
+ this.target = List.class;
+ type = type.substring(5, type.length());
+ }
+ else if (type.equals("list"))
+ {
+ this.isList = true;
+ this.target = List.class;
+ }
+ else
+ {
+ this.isList = false;
+ }
+
+ //TODO: support an "auto" type that tries to automatically
+ // recognize common list, boolean, field, and number formats
+ if (type.equals("auto"))
+ {
+ this.target = Object.class;
+ this.converter = new AutoConverter();
+ }
+ else if (type.equals("boolean"))
{
- this.converter = dc;
+ this.target = Boolean.class;
+ this.converter = new BooleanConverter();
}
- else // assume it is a classname
+ else if (type.equals("number"))
{
- setClassname(type);
+ this.target = Number.class;
+ this.converter = new NumberConverter();
+ }
+ else if (type.equals("string"))
+ {
+ this.target = String.class;
+ this.converter = new StringConverter();
+ }
+ else if (type.equals("field"))
+ {
+ this.target = Object.class;
+ this.converter = new FieldConverter();
}
}
public void setTargetClass(Class clazz)
{
- if (this.converter == null)
- {
- this.converter = new DataConverter();
- }
- this.converter.setTarget(clazz);
+ this.target = clazz;
}
public void setConverter(Class clazz)
@@ -137,11 +171,7 @@
*/
public void convertWith(Converter converter)
{
- if (this.converter == null)
- {
- this.converter = new DataConverter();
- }
- this.converter.setConverter(converter);
+ this.converter = converter;
}
public String getKey()
@@ -161,32 +191,17 @@
public Class getTargetClass()
{
- if (this.converter == null)
- {
- return String.class;
- }
- return this.converter.getTarget();
+ return this.target;
}
public Converter getConverter()
{
- if (this.converter == null)
- {
- return null;
- }
- return this.converter.getConverter();
+ return this.converter;
}
public Object getConvertedValue()
{
- if (converter == null)
- {
- return this.value;
- }
- else
- {
- return this.converter.convert(getValue());
- }
+ return convert(this.value);
}
public void validate()
@@ -206,7 +221,10 @@
{
try
{
- getConvertedValue();
+ if (getConvertedValue() == null && getValue() != null)
+ {
+ throw new ConfigurationException(this, "Conversion of "+getValue()+" for '"+getKey()+"' failed and returned null");
+ }
}
catch (Throwable t)
{
@@ -215,69 +233,6 @@
}
}
-
- protected DataConverter getDataConverter(String type)
- {
- DataConverter dc;
- if (type.startsWith("list."))
- {
- // use a list converter and drop to subtype
- dc = new ListConverter();
- type = type.substring(5, type.length());
- }
- else if (type.equals("list"))
- {
- // then this is all we do
- return new ListConverter();
- }
- else
- {
- // use datum converter
- dc = new DataConverter();
- }
-
- //TODO: support an "auto" type that tries to automatically
- // recognize common list, boolean, field, and number formats
- if (type.equals("auto"))
- {
- dc.setTarget(Object.class);
- dc.setConverter(new AutoConverter());
- }
- else if (type.equals("boolean"))
- {
- dc.setTarget(Boolean.class);
- dc.setConverter(new BooleanConverter());
- }
- else if (type.equals("number"))
- {
- if (getValue() != null && getValue().toString().indexOf('.') < 0)
- {
- dc.setConverter(new IntegerConverter());
- dc.setTarget(Integer.class);
- }
- else
- {
- dc.setConverter(new DoubleConverter());
- dc.setTarget(Double.class);
- }
- }
- else if (type.equals("string"))
- {
- dc.setTarget(String.class);
- dc.setConverter(new StringConverter());
- }
- else if (type.equals("field"))
- {
- dc.setTarget(Object.class);
- dc.setConverter(new FieldConverter());
- }
- else
- {
- return null;
- }
- return dc;
- }
-
public int compareTo(Data datum)
{
if (getKey() == null && datum.getKey() == null)
@@ -334,71 +289,51 @@
- protected static class DataConverter
+ protected Object convert(Object value)
{
- private Converter converter;
- private Class target = String.class;
-
- public void setConverter(Converter converter)
+ if (this.isList)
{
- this.converter = converter;
+ return convertList(value);
}
-
- public Converter getConverter()
- {
- return this.converter;
- }
-
- public void setTarget(Class target)
+ else if (this.converter == null)
{
- this.target = target;
+ return value;
}
-
- public Class getTarget()
+ else
{
- return this.target;
+ return convertValue(value);
}
+ }
- public Object convert(Object value)
- {
- if (this.converter == null)
- {
- return value;
- }
- else
- {
- return this.converter.convert(this.target, value);
- }
- }
+ private Object convertValue(Object value)
+ {
+ return this.converter.convert(this.target, value);
}
- protected static class ListConverter extends DataConverter
+ private List convertList(Object val)
{
- public List convert(Object val)
+ // we assume it is a string
+ String value = (String)val;
+ if (value == null || value.trim().length() == 0)
+ {
+ return null;
+ }
+ else
{
- // we assume it is a string
- String value = (String)val;
- if (value == null || value.trim().length() == 0)
+ //TODO: make sure this works as expected...
+ List<String> list = Arrays.asList(value.split(","));
+ if (this.converter == null || this.target.equals(String.class))
{
- return null;
+ return list;
}
else
{
- //TODO: make sure this works as expected...
- List<String> list = Arrays.asList(value.split(","));
- if (getConverter() == null || getTarget() == String.class)
- {
- return list;
- }
- else
+ List convertedList = new ArrayList();
+ for (String item : list)
{
- List convertedList = new ArrayList();
- for (String item : list)
- {
- convertedList.add(super.convert(item));
- }
- return convertedList;
+ convertedList.add(convertValue(item));
}
+ return convertedList;
}
}
}
@@ -440,6 +375,30 @@
return value;
}
return obj;
+ }
+ }
+
+ protected static class NumberConverter implements Converter
+ {
+ public Object convert(Class type, Object obj)
+ {
+ Number num = ConversionUtils.toNumber(obj);
+ if (num == null)
+ {
+ String value = String.valueOf(obj);
+ num = ConversionUtils.toNumber(value, "default",
+ Locale.getDefault());
+ if (num == null)
+ {
+ throw new IllegalArgumentException("Could not convert "+obj+" to a number");
+ }
+ // now, let's return integers for integer values
+ else if (value.indexOf('.') < 0)
+ {
+ num = Integer.valueOf(num.intValue());
+ }
+ }
+ return num;
}
}