From eeb1de2b79ed6953e7a97aa6a85e393b1966df0d Mon Sep 17 00:00:00 2001 From: Keith Donald Date: Sat, 22 Mar 2008 03:53:49 +0000 Subject: [PATCH] formatter registry unit tests --- .../factories/DateFormatterFactory.java | 2 +- .../factories/NumberFormatterFactory.java | 2 +- .../format/impl/FormatterRegistryImpl.java | 68 +++++++++++++++---- 3 files changed, 56 insertions(+), 16 deletions(-) diff --git a/spring-binding/src/main/java/org/springframework/binding/format/factories/DateFormatterFactory.java b/spring-binding/src/main/java/org/springframework/binding/format/factories/DateFormatterFactory.java index 6cfdef25..576f76dd 100644 --- a/spring-binding/src/main/java/org/springframework/binding/format/factories/DateFormatterFactory.java +++ b/spring-binding/src/main/java/org/springframework/binding/format/factories/DateFormatterFactory.java @@ -33,7 +33,7 @@ public class DateFormatterFactory implements FormatterFactory { return DateFormat.getDateInstance(DateFormat.SHORT, context.getLocale()); } - private class DateFormatter extends AbstractFormatter { + private static class DateFormatter extends AbstractFormatter { private DateFormat dateFormat; diff --git a/spring-binding/src/main/java/org/springframework/binding/format/factories/NumberFormatterFactory.java b/spring-binding/src/main/java/org/springframework/binding/format/factories/NumberFormatterFactory.java index f87dcec9..b35320fc 100644 --- a/spring-binding/src/main/java/org/springframework/binding/format/factories/NumberFormatterFactory.java +++ b/spring-binding/src/main/java/org/springframework/binding/format/factories/NumberFormatterFactory.java @@ -36,7 +36,7 @@ public class NumberFormatterFactory implements FormatterFactory { } } - private class NumberFormatter extends AbstractFormatter { + private static class NumberFormatter extends AbstractFormatter { private NumberFormat numberFormat; diff --git a/spring-binding/src/main/java/org/springframework/binding/format/impl/FormatterRegistryImpl.java b/spring-binding/src/main/java/org/springframework/binding/format/impl/FormatterRegistryImpl.java index 7bffa475..dd10131c 100644 --- a/spring-binding/src/main/java/org/springframework/binding/format/impl/FormatterRegistryImpl.java +++ b/spring-binding/src/main/java/org/springframework/binding/format/impl/FormatterRegistryImpl.java @@ -16,6 +16,7 @@ package org.springframework.binding.format.impl; import java.util.HashMap; +import java.util.LinkedList; import java.util.Locale; import java.util.Map; @@ -25,6 +26,7 @@ import org.springframework.binding.format.FormatterRegistry; import org.springframework.context.i18n.LocaleContext; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.context.i18n.SimpleLocaleContext; +import org.springframework.util.Assert; /** * Base class for formatter factories. Manages the locale used by the produced formatters using Spring's @@ -62,6 +64,8 @@ public class FormatterRegistryImpl implements FormatterRegistry { } public Formatter getFormatter(Class clazz) { + Assert.notNull(clazz, "The formatted class argument is required"); + clazz = convertToWrapperClassIfNecessary(clazz); FormatterFactory factory = findFormatterFactory(clazz); if (factory != null) { FormatterFactoryContextImpl context = new FormatterFactoryContextImpl(); @@ -74,6 +78,7 @@ public class FormatterRegistryImpl implements FormatterRegistry { } public Formatter getFormatter(String id, Class clazz) { + Assert.hasText(id, "The id of the custom formatter is required"); FormatterFactory factory = (FormatterFactory) formattersById.get(id); if (factory != null) { FormatterFactoryContextImpl context = new FormatterFactoryContextImpl(); @@ -85,21 +90,9 @@ public class FormatterRegistryImpl implements FormatterRegistry { } } - private FormatterFactory findFormatterFactory(Class clazz) { - FormatterFactory factory = (FormatterFactory) formattersByClass.get(clazz); - if (factory != null) { - return factory; - } else { - // TODO - getSuperClass can return null - if (clazz.getSuperclass() != Object.class) { - return findFormatterFactory(clazz.getSuperclass()); - } else { - return null; - } - } - } - public void registerFormatter(String id, FormatterFactory factory) { + Assert.hasText(id, "The id of the custom formatter is required"); + Assert.notNull(factory, "The formatter factory is required"); formattersById.put(id, factory); Class formattedClass = factory.getFormattedClass(); if (!formattersByClass.containsKey(formattedClass)) { @@ -108,6 +101,53 @@ public class FormatterRegistryImpl implements FormatterRegistry { } public void registerFormatter(FormatterFactory factory) { + Assert.notNull(factory, "The formatter factory is required"); formattersByClass.put(factory.getFormattedClass(), factory); } + + private FormatterFactory findFormatterFactory(Class clazz) { + LinkedList classQueue = new LinkedList(); + classQueue.addFirst(clazz); + while (!classQueue.isEmpty()) { + clazz = (Class) classQueue.removeLast(); + FormatterFactory factory = (FormatterFactory) formattersByClass.get(clazz); + if (factory != null) { + return factory; + } + if (!clazz.isInterface() && clazz.getSuperclass() != null) { + classQueue.add(clazz.getSuperclass()); + } + Class[] interfaces = clazz.getInterfaces(); + for (int i = 0; i < interfaces.length; i++) { + classQueue.addFirst(interfaces[i]); + } + } + return null; + } + + private Class convertToWrapperClassIfNecessary(Class targetType) { + if (targetType.isPrimitive()) { + if (targetType.equals(int.class)) { + return Integer.class; + } else if (targetType.equals(short.class)) { + return Short.class; + } else if (targetType.equals(long.class)) { + return Long.class; + } else if (targetType.equals(float.class)) { + return Float.class; + } else if (targetType.equals(double.class)) { + return Double.class; + } else if (targetType.equals(byte.class)) { + return Byte.class; + } else if (targetType.equals(boolean.class)) { + return Boolean.class; + } else if (targetType.equals(char.class)) { + return Character.class; + } else { + throw new IllegalStateException("Should never happen - primitive type is not a primitive?"); + } + } else { + return targetType; + } + } } \ No newline at end of file