Author: ekoneil
Date: Sat Jul 17 09:37:39 2004
New Revision: 23006

Added:
   
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/type/BaseTypeConverter.java
   (contents, props changed)
   
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/type/DelegatingTypeConverter.java
   (contents, props changed)
Modified:
   
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/type/TypeConverter.java
   
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/type/TypeUtils.java
   
incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/util/type/TypeUtilsTest.java
Log:
Add the ability to pass the Locale to the type conversion infrastructure.

This is needed to be able to convert Date objects (and anything else needing a 
Locle) given a particular a Locale instance.

It's implemented as a new API method on TypeUtils as:

  convertToObject(String value, Class type, Locale locale)

Type converter implementations are free to ignore the locale.  

Added a BaseTypeConverter so that the TypeConverter interface doesn't break and 
switched the TypeUtils to talk to this base class.  TypeConverter 
implementations are called through the DelegatingTypeConverter extension of 
BaseTypeConverter.

Consider this a proposal for a way to handle Locales during conversion; this 
should just get the tests running for non-US locales in the short term.

BB: self
DRT: Controls / NetUI pass 
BVT: NetUI pass



Added: 
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/type/BaseTypeConverter.java
==============================================================================
--- (empty file)
+++ 
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/type/BaseTypeConverter.java
    Sat Jul 17 09:37:39 2004
@@ -0,0 +1,51 @@
+/*
+ * B E A   S Y S T E M S
+ * Copyright 2002-2004  BEA Systems, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.beehive.netui.util.type;
+
+// java imports
+import java.util.Locale;
+
+// internal imports
+
+// external imports
+
+/**
+ * Default implementation of the [EMAIL PROTECTED] TypeConverter} interface.
+ */
+public class BaseTypeConverter
+    implements TypeConverter
+{
+    /**
+     * Convert the String to a type.  The base implementation
+     * delegates to the [EMAIL PROTECTED] convertToObject(java.lang.String, 
java.util.Locale)} 
+     * method with <code>null</code> for the locale.
+     */
+    public Object convertToObject(String value)
+    {
+        return convertToObject(value, null);
+    }
+
+    /**
+     * Convert the String to a type, optinally using the given locale.
+     */
+    public Object convertToObject(String value, Locale locale)
+    {
+        return value;
+    }
+}
\ No newline at end of file

Added: 
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/type/DelegatingTypeConverter.java
==============================================================================
--- (empty file)
+++ 
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/type/DelegatingTypeConverter.java
      Sat Jul 17 09:37:39 2004
@@ -0,0 +1,54 @@
+/*
+ * B E A   S Y S T E M S
+ * Copyright 2002-2004  BEA Systems, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.beehive.netui.util.type;
+
+// java imports
+import java.util.Locale;
+
+// internal imports
+
+// external imports
+
+/**
+ * Implementation of the [EMAIL PROTECTED] TypeConverter} interface that 
delegates 
+ * to a [EMAIL PROTECTED] TypeConverter} implementation which doesn't extend
+ * [EMAIL PROTECTED] BaseTypeConverter}.  
+ */
+public final class DelegatingTypeConverter
+    extends BaseTypeConverter
+{
+    private TypeConverter _converter = null;
+
+    public DelegatingTypeConverter(TypeConverter converter)
+    {
+        super();
+        assert converter != null;
+        _converter = converter;
+    }
+
+    public Object convertToObject(String value)
+    {
+        return _converter.convertToObject(value);
+    }
+
+    public Object convertToObject(String value, Locale locale)
+    {
+        return _converter.convertToObject(value);
+    }
+}
\ No newline at end of file

Modified: 
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/type/TypeConverter.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/type/TypeConverter.java
        (original)
+++ 
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/type/TypeConverter.java
        Sat Jul 17 09:37:39 2004
@@ -19,15 +19,23 @@
 package org.apache.beehive.netui.util.type;
 
 // java imports
+import java.util.Locale;
 
 // internal imports
 
 // external imports
 
 /**
- *
+ * Interface used to define converters for converting Strings into various 
+ * Object types.  
  */
 public interface TypeConverter
 {
+    /**
+     * Convert a String to an Object type
+     *
+     * @param value the String value to convert
+     * @return the converted object
+     */
     public Object convertToObject(String value);
 }

Modified: 
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/type/TypeUtils.java
==============================================================================
--- 
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/type/TypeUtils.java
    (original)
+++ 
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/type/TypeUtils.java
    Sat Jul 17 09:37:39 2004
@@ -31,6 +31,7 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
 
@@ -75,30 +76,37 @@
     /**
      * Convert an object from a String to the given type.  
      * 
+     * @param value the String to convert
+     * @param type the type to which to convert the String
+     * @param locale the locale to use during conversion
      * @throws TypeConverterNotFoundException if a TypeConverter for the 
target type can not be found.
      * @return the Object result of converting the String to the type.
      */
     public static final Object convertToObject(String value, Class type)
     {
-        TypeConverter converter = (TypeConverter)_converters.get(type);
-        if(converter == null)
-        {
-            String msg = "Could not find a TypeConverter for converting a 
String to an object of type \"" + 
-                                                   (type != null ? 
type.getName() : null) + "\"";
-            TypeConverterNotFoundException tcn = new 
TypeConverterNotFoundException(msg);
-
-            if(type == null)
-                msg = Bundle.getErrorString("TypeUtils_nullType");
-            else msg = Bundle.getErrorString("TypeUtils_noConverterForType", 
new Object[] {type.getName()});
-            tcn.setLocalizedMessage(msg);
-            if(logger.isInfoEnabled()) logger.info(msg);
-
-            throw tcn;
-        }
-        
+        BaseTypeConverter converter = lookupTypeConverter(type);
+        assert converter != null;
         return converter.convertToObject(value);
     }
 
+    /**
+     * Convert an object from a String to the given type using the specified 
[EMAIL PROTECTED] java.util.Locale}.
+     *
+     * The locale is optionally used depending on the implementation of the 
[EMAIL PROTECTED] TypeConverter} that is used.
+     * 
+     * @param value the String to convert
+     * @param type the type to which to convert the String
+     * @param locale the locale to use during conversion
+     * @throws TypeConverterNotFoundException if a TypeConverter for the 
target type can not be found.
+     * @return the Object result of converting the String to the type.
+     */
+    public static final Object convertToObject(String value, Class type, 
Locale locale)
+    {
+        BaseTypeConverter converter = lookupTypeConverter(type);
+        assert converter != null;
+        return converter.convertToObject(value, locale);
+    }
+
     public static final byte convertToByte(String value) 
     {return ((Byte)convertToObject(value, byte.class)).byteValue();}
 
@@ -147,6 +155,35 @@
     public static final Short convertToShortObject(String value) 
     {return (Short)convertToObject(value, Short.class);}
 
+    /**
+     * Internal method used to lookup a [EMAIL PROTECTED] BaseTypeConverter}.
+     *
+     * @param type the target conversion type
+     * @throws TypeConverterNotFoundException if a TypeConverter for the 
target type can not be found.
+     * @return a [EMAIL PROTECTED] BaseTypeConverter} to use for conversion
+     */
+    private static final BaseTypeConverter lookupTypeConverter(Class type)
+    {
+        BaseTypeConverter converter = (BaseTypeConverter)_converters.get(type);
+        if(converter == null)
+        {
+            String msg = "Could not find a TypeConverter for converting a 
String to an object of type \"" + 
+                                                   (type != null ? 
type.getName() : null) + "\"";
+            TypeConverterNotFoundException tcn = new 
TypeConverterNotFoundException(msg);
+
+            if(type == null)
+                msg = Bundle.getErrorString("TypeUtils_nullType");
+            else msg = Bundle.getErrorString("TypeUtils_noConverterForType", 
new Object[] {type.getName()});
+            tcn.setLocalizedMessage(msg);
+            if(logger.isInfoEnabled()) 
+                logger.info(msg);
+
+            throw tcn;
+        }
+        
+        return converter;
+    }
+
     private static String registeredConvertersToString()
     {
         if(_toString != null)
@@ -281,6 +318,12 @@
             {
                 tcClazz = Class.forName(className);
                 tc = (TypeConverter)tcClazz.newInstance();
+                
+                // this supports existing TypeConverter implementations
+                // but allows TypeUtils make calls against the 
BaseTypeConverter
+                // API, which supports Locale-based conversion
+                if(!(tc instanceof BaseTypeConverter))
+                    tc = new DelegatingTypeConverter(tc);
             }
             catch(ClassNotFoundException cnf)
             {
@@ -316,26 +359,26 @@
      */
     private static void initialize()
     {
-        _converters.put(byte.class, new TypeConverter()
+        _converters.put(byte.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     return (value == null || value.equals(EMPTY_STRING) ? new 
Byte((byte)0) : new Byte(value.trim()));
                 }
 
             });
-        _converters.put(Byte.class, new TypeConverter()
+        _converters.put(Byte.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING)) return 
null;
                     else return TypeUtils.convertToObject(value, byte.class);
                 }
             });
 
-        _converters.put(boolean.class, new TypeConverter()
+        _converters.put(boolean.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING))
                         return Boolean.FALSE;
@@ -346,126 +389,126 @@
                     else return Boolean.FALSE;
                 }
             });
-        _converters.put(Boolean.class, new TypeConverter()
+        _converters.put(Boolean.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING)) return 
null;
                     else return TypeUtils.convertToObject(value, 
boolean.class);
                 }
             });
 
-        _converters.put(char.class, new TypeConverter()
+        _converters.put(char.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING))
                         return new Character('\u0000');
                     else return new Character(value.charAt(0));
                 }
             });
-        _converters.put(Character.class, new TypeConverter()
+        _converters.put(Character.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING)) return 
null;
                     else return TypeUtils.convertToObject(value, char.class);
                 }
             });
 
-        _converters.put(double.class, new TypeConverter()
+        _converters.put(double.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING))
                         return new Double(0.0);
                     else return new Double(value.trim());
                 }
             });
-        _converters.put(Double.class, new TypeConverter()
+        _converters.put(Double.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING)) return 
null;
                     else return TypeUtils.convertToObject(value, double.class);
                 }
             });
 
-        _converters.put(float.class, new TypeConverter()
+        _converters.put(float.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING))
                         return new Float(0.0);
                     else return new Float(value.trim());
                 }
             });
-        _converters.put(Float.class, new TypeConverter()
+        _converters.put(Float.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING)) return 
null;
                     else return TypeUtils.convertToObject(value, float.class);
                 }
             });
 
-        _converters.put(int.class, new TypeConverter() 
+        _converters.put(int.class, new BaseTypeConverter() 
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING))
                         return new Integer(0);
                     else return new Integer(value.trim());
                 }
             });
-        _converters.put(Integer.class, new TypeConverter()
+        _converters.put(Integer.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING)) return 
null;
                     else return TypeUtils.convertToObject(value, int.class);
                 }
             });
 
-        _converters.put(long.class, new TypeConverter()
+        _converters.put(long.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING))
                         return new Long(0);
                     else return new Long(value.trim());
                 }
             });
-        _converters.put(Long.class, new TypeConverter()
+        _converters.put(Long.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING)) return 
null;
                     else return TypeUtils.convertToObject(value, long.class);
                 }
             });
 
-        _converters.put(short.class, new TypeConverter()
+        _converters.put(short.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING))
                         return new Short((short)0);
                     else return new Short(value.trim());
                 }
             });
-        _converters.put(Short.class, new TypeConverter()
+        _converters.put(Short.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING)) return 
null;
                     else return TypeUtils.convertToObject(value, short.class);
                 }
             });
 
-        _converters.put(String.class, new TypeConverter()
+        _converters.put(String.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null)
                         return null;
@@ -473,9 +516,9 @@
                 }
             });
 
-        _converters.put(java.math.BigDecimal.class, new TypeConverter()
+        _converters.put(java.math.BigDecimal.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING))
                         return null;
@@ -483,9 +526,9 @@
                 }
             });
 
-        _converters.put(java.math.BigInteger.class, new TypeConverter()
+        _converters.put(java.math.BigInteger.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING))
                         return null;
@@ -493,9 +536,9 @@
                 }
             });
 
-        _converters.put(byte[].class, new TypeConverter()
+        _converters.put(byte[].class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING))
                         return null;
@@ -503,9 +546,9 @@
                 }
             });
 
-        _converters.put(Byte[].class, new TypeConverter()
+        _converters.put(Byte[].class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING))
                         return null;
@@ -523,15 +566,18 @@
                 }
             });
         
-        _converters.put(Date.class, new TypeConverter()
+        _converters.put(Date.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING)) return 
null;
 
                     try
                     {
-                        DateFormat df = 
DateFormat.getDateInstance(DateFormat.SHORT);
+                        if(locale == null)
+                            locale = Locale.getDefault();
+
+                        DateFormat df = 
DateFormat.getDateInstance(DateFormat.SHORT, locale);
                         return df.parse(value);
                     }
                     catch(java.text.ParseException pe)
@@ -549,9 +595,9 @@
             });
 
         // http://java.sun.com/j2se/1.4.1/docs/api/java/sql/Date.html
-        _converters.put(java.sql.Date.class, new TypeConverter()
+        _converters.put(java.sql.Date.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING)) return 
null;
 
@@ -573,9 +619,9 @@
             });
 
         // http://java.sun.com/j2se/1.4.1/docs/api/java/sql/Timestamp.html
-        _converters.put(java.sql.Timestamp.class, new TypeConverter()
+        _converters.put(java.sql.Timestamp.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING)) return 
null;
 
@@ -597,9 +643,9 @@
             });
 
         // http://java.sun.com/j2se/1.4.1/docs/api/java/sql/Time.html
-        _converters.put(java.sql.Time.class, new TypeConverter()
+        _converters.put(java.sql.Time.class, new BaseTypeConverter()
             {
-                public Object convertToObject(String value)
+                public Object convertToObject(String value, Locale locale)
                 {
                     if(value == null || value.equals(EMPTY_STRING)) return 
null;
 

Modified: 
incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/util/type/TypeUtilsTest.java
==============================================================================
--- 
incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/util/type/TypeUtilsTest.java
        (original)
+++ 
incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/util/type/TypeUtilsTest.java
        Sat Jul 17 09:37:39 2004
@@ -24,6 +24,7 @@
 // import java.sql.Date; // there are tests for this below, but the name 
conflicts with java.util.Date
 import java.sql.Timestamp;
 import java.util.Date;
+import java.util.Locale;
 
 // internal imports
 import org.apache.beehive.netui.util.logging.Logger;
@@ -140,7 +141,7 @@
                 Object result = null;
                 try
                 {
-                    result = TypeUtils.convertToObject(value, type);
+                    result = TypeUtils.convertToObject(value, type, Locale.US);
                     
                     if(!valid) 
                         throw new TestFailedException("The test case [" + i + 
"] failed because an illegal value \"" + 

Reply via email to