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;
         }
     }