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 \"" +