- Revision
- 728
- Author
- mauro
- Date
- 2008-06-18 03:02:01 -0500 (Wed, 18 Jun 2008)
Log Message
Pulled up patterns to abstract value converter. NumberListValueConverter now extends ListValueConverter by providing number parsing.
Modified Paths
- trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/FreemarkerRegistrar.java
- trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/AbstractValueConverter.java
- trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/DateValueConverter.java
- trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/ListValueConverter.java
- trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/NumberListValueConverter.java
Diff
Modified: trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/FreemarkerRegistrar.java (727 => 728)
--- trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/FreemarkerRegistrar.java 2008-06-17 16:23:43 UTC (rev 727) +++ trunk/examples/freemarker-example/src/main/java/org/codehaus/waffle/example/freemarker/FreemarkerRegistrar.java 2008-06-18 08:02:01 UTC (rev 728) @@ -6,6 +6,7 @@ import java.util.Properties; import org.codehaus.waffle.ComponentRegistry; +import org.codehaus.waffle.bind.converters.AbstractValueConverter; import org.codehaus.waffle.bind.converters.DateValueConverter; import org.codehaus.waffle.example.freemarker.controller.DateProvider; import org.codehaus.waffle.example.freemarker.controller.PersonController; @@ -23,7 +24,7 @@ public void application() { ComponentRegistry registry = getComponentRegistry(); DateProvider dateProvider = new DateProvider("dd/MM/yyyy", "hh:mm:ss", "dd/MM/yyyy"); - DateValueConverter converter = (DateValueConverter) registry.locateByType(DateValueConverter.class); + AbstractValueConverter converter = (AbstractValueConverter) registry.locateByType(DateValueConverter.class); if (converter != null) { Properties patterns = new Properties(); patterns.setProperty(DAY_FORMAT_KEY, dateProvider.getDayPattern());
Modified: trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/AbstractValueConverter.java (727 => 728)
--- trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/AbstractValueConverter.java 2008-06-17 16:23:43 UTC (rev 727) +++ trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/AbstractValueConverter.java 2008-06-18 08:02:01 UTC (rev 728) @@ -16,14 +16,16 @@ */ public abstract class AbstractValueConverter implements ValueConverter { - protected final MessageResources messageResources; + private final MessageResources messageResources; + private Properties patterns; - protected AbstractValueConverter(MessageResources messageResources) { + protected AbstractValueConverter(MessageResources messageResources, Properties patterns) { this.messageResources = messageResources; + this.patterns = patterns; } /** - * Determines if the value is missing. + * Determines if the value is missing. * * @param value the String value * @return A boolean, <code>true</code> if value is <code>null</code> or trimmed length is 0. @@ -33,8 +35,8 @@ } /** - * Handles the case of a missing value. By default it return a <code>null</code> converted value, - * but can be overridden to throw a BindException + * Handles the case of a missing value. By default it return a <code>null</code> converted value, but can be + * overridden to throw a BindException * * @param key the error message key * @param defaultMessage the default message if key is not found @@ -44,8 +46,8 @@ protected Object convertMissingValue(String key, String defaultMessage, Object... parameters) { return null; } - - @SuppressWarnings({"ThrowableInstanceNeverThrown"}) + + @SuppressWarnings( { "ThrowableInstanceNeverThrown" }) protected BindException newBindException(String key, String defaultMessage, Object... parameters) { String message = messageResources.getMessageWithDefault(key, defaultMessage, parameters); return new BindException(message); @@ -59,10 +61,18 @@ return value != null && value.matches(regex); } - protected String patternFor(Properties patterns, String key, String defaultPattern) { - if ( patterns.containsKey(key)) { + protected String patternFor(String key, String defaultPattern) { + if (patterns.containsKey(key)) { return patterns.getProperty(key); } return messageFor(key, defaultPattern); } + + public Properties getPatterns() { + return patterns; + } + + public void changePatterns(Properties patterns) { + this.patterns = patterns; + } }
Modified: trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/DateValueConverter.java (727 => 728)
--- trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/DateValueConverter.java 2008-06-17 16:23:43 UTC (rev 727) +++ trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/DateValueConverter.java 2008-06-18 08:02:01 UTC (rev 728) @@ -54,20 +54,17 @@ public static final String DEFAULT_DATE_MESSAGE = "Invalid date {1} (using format {2}) for field {0}"; public static final String DEFAULT_DATE_MISSING_MESSAGE = "Missing date value for field {0}"; - private Properties patterns; - public DateValueConverter(MessageResources messageResources) { this(messageResources, new Properties()); } public DateValueConverter(MessageResources messageResources, Properties patterns) { - super(messageResources); - this.patterns = patterns; + super(messageResources, patterns); } public boolean accept(Type type) { - if ( type instanceof Class ){ - return Date.class.isAssignableFrom((Class<?>)type); + if (type instanceof Class) { + return Date.class.isAssignableFrom((Class<?>) type); } return false; } @@ -88,14 +85,6 @@ } } - public Properties getPatterns() { - return patterns; - } - - public void changePatterns(Properties patterns) { - this.patterns = patterns; - } - private enum DateType { DAY, TIME, DATE } @@ -111,24 +100,24 @@ String pattern; switch (dateType) { case DAY: - pattern = patternFor(patterns, DAY_FORMAT_KEY, DEFAULT_DAY_FORMAT); + pattern = patternFor(DAY_FORMAT_KEY, DEFAULT_DAY_FORMAT); break; case TIME: - pattern = patternFor(patterns, TIME_FORMAT_KEY, DEFAULT_TIME_FORMAT); + pattern = patternFor(TIME_FORMAT_KEY, DEFAULT_TIME_FORMAT); break; default: - pattern = patternFor(patterns, DATE_FORMAT_KEY, DEFAULT_DATE_FORMAT); + pattern = patternFor(DATE_FORMAT_KEY, DEFAULT_DATE_FORMAT); } return new SimpleDateFormat(pattern); } private DateType dateType(String propertyName) { - if (matches(propertyName, patternFor(patterns , DAY_NAME_KEY, DEFAULT_DAY_NAME))) { + if (matches(propertyName, patternFor(DAY_NAME_KEY, DEFAULT_DAY_NAME))) { return DateType.DAY; - } else if (matches(propertyName, patternFor(patterns , TIME_NAME_KEY, DEFAULT_TIME_NAME))) { + } else if (matches(propertyName, patternFor(TIME_NAME_KEY, DEFAULT_TIME_NAME))) { return DateType.TIME; } return DateType.DATE; } - + }
Modified: trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/ListValueConverter.java (727 => 728)
--- trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/ListValueConverter.java 2008-06-17 16:23:43 UTC (rev 727) +++ trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/ListValueConverter.java 2008-06-18 08:02:01 UTC (rev 728) @@ -13,7 +13,7 @@ /** * <p> - * <code>ValueConverter</code> that converts a CSV value to a List. A <code>null</code> or empty value (once + * <code>ValueConverter</code> that converts CSV values to List of Strings. A <code>null</code> or empty value (once * trimmed) will be returned as an empty list (behaviour which can be overridden via the [EMAIL PROTECTED] #convertMissingValue} * method). The message keys and default values used are: * <ul> @@ -32,15 +32,13 @@ public static final String DEFAULT_LIST_MESSAGE = "Invalid list value for field {0}"; private static final String COMMA = ","; - private Properties patterns; public ListValueConverter(MessageResources messageResources) { this(messageResources, new Properties()); } public ListValueConverter(MessageResources messageResources, Properties patterns) { - super(messageResources); - this.patterns = patterns; + super(messageResources, patterns); } public boolean accept(Type type) { @@ -64,7 +62,7 @@ return listValues(value); } - private List<String> listValues(String value) { + protected List<String> listValues(String value) { String[] values = value.split(COMMA); List<String> list = new ArrayList<String>(); for (String current : values) { @@ -75,14 +73,6 @@ return list; } - public Properties getPatterns() { - return patterns; - } - - public void changePatterns(Properties patterns) { - this.patterns = patterns; - } - @SuppressWarnings("unchecked") protected Object convertMissingValue(String key, String defaultMessage, Object... parameters) { return new ArrayList();
Modified: trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/NumberListValueConverter.java (727 => 728)
--- trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/NumberListValueConverter.java 2008-06-17 16:23:43 UTC (rev 727) +++ trunk/waffle-core/src/main/java/org/codehaus/waffle/bind/converters/NumberListValueConverter.java 2008-06-18 08:02:01 UTC (rev 728) @@ -15,43 +15,25 @@ /** * <p> - * <code>ValueConverter</code> that converts a CSV value to a List. A <code>null</code> or empty value (once - * trimmed) will be returned as an empty list (behaviour which can be overridden via the [EMAIL PROTECTED] #convertMissingValue} - * method). The message keys and default values used are: - * <ul> - * <li>"bind.error.list" ([EMAIL PROTECTED] #BIND_ERROR_LIST_KEY}): list is <code>null</code> or empty (message defaults to - * [EMAIL PROTECTED] #DEFAULT_LIST_MESSAGE})</li> - * </ul> - * The patterns are also optionally injectable via <code>Properties</code> in the constructor and take precedence over - * the ones configured in the messages resources. + * <code>ValueConverter</code> that converts a CSV value to a List of Numbers. It extends + * [EMAIL PROTECTED] org.codehaus.waffle.bind.converters.ListValueConverter ListValueConverter} to provide number parsing using the + * <code>NumberFormat</code> instance provided (which defaults to <code>NumberFormat.getInstance()</code>) and if + * not successful returns the string values. * </p> - * <p> - * NOTE: the converter will first check if the values match the configured number regex pattern and only if it does will - * it attempt to parse them (using the <code>NumberFormat</code> instance provided, which defaults to - * <code>NumberFormat.getInstance()</code>) and if not successful returns the string values. The reason for the - * presence of the preliminary number pattern matching is to disable the attempt of number parsing altogether for some - * string values that may start with number and may be erronously parsed as numbers. - * </p> * * @author Mauro Talevi */ -public class NumberListValueConverter extends AbstractValueConverter { +public class NumberListValueConverter extends ListValueConverter { - public static final String BIND_ERROR_LIST_KEY = "bind.error.list"; - public static final String DEFAULT_LIST_MESSAGE = "Invalid list value for field {0}"; - - private static final String COMMA = ","; private NumberFormat numberFormat; - private Properties patterns; public NumberListValueConverter(MessageResources messageResources) { - this(messageResources, NumberFormat.getInstance(), new Properties()); + this(messageResources, new Properties(), NumberFormat.getInstance()); } - public NumberListValueConverter(MessageResources messageResources, NumberFormat numberFormat, Properties patterns) { - super(messageResources); + public NumberListValueConverter(MessageResources messageResources, Properties patterns, NumberFormat numberFormat) { + super(messageResources, patterns); this.numberFormat = numberFormat; - this.patterns = patterns; } /** @@ -64,7 +46,8 @@ ParameterizedType parameterizedType = (ParameterizedType) type; Type rawType = parameterizedType.getRawType(); Type argumentType = parameterizedType.getActualTypeArguments()[0]; - return List.class.isAssignableFrom((Class<?>) rawType) && Number.class.isAssignableFrom((Class<?>)argumentType); + return List.class.isAssignableFrom((Class<?>) rawType) + && Number.class.isAssignableFrom((Class<?>) argumentType); } return false; } @@ -79,43 +62,16 @@ List<String> values = listValues(value); try { - return toNumbers(values); + List<Number> numbers = new ArrayList<Number>(); + for (String numberValue : values) { + numbers.add(numberFormat.parse(numberValue)); + } + return numbers; } catch (ParseException e) { // failed to parse as numbers, return string values + // TODO should we throw a bind exception here? } return values; } - private List<String> listValues(String value) { - String[] values = value.split(COMMA); - List<String> list = new ArrayList<String>(); - for (String current : values) { - if (current.trim().length() > 0) { - list.add(current); - } - } - return list; - } - - public Properties getPatterns() { - return patterns; - } - - public void changePatterns(Properties patterns) { - this.patterns = patterns; - } - - @SuppressWarnings("unchecked") - protected Object convertMissingValue(String key, String defaultMessage, Object... parameters) { - return new ArrayList(); - } - - protected List<Number> toNumbers(List<String> values) throws ParseException { - List<Number> numbers = new ArrayList<Number>(); - for (String value : values) { - numbers.add(numberFormat.parse(value)); - } - return numbers; - } - }
To unsubscribe from this list please visit:
