From 70131cdb9ba6ecb505a7b627db03ad9d739d7c66 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Tue, 18 Dec 2012 10:00:14 +0200 Subject: [PATCH] Extracted common code for number conveters to abstract super class (#11900) Change-Id: I53e413f8e9c8754915d80c30d3dca97eb1881c74 --- .../AbstractStringToNumberConverter.java | 120 ++++++++++++++++++ .../converter/StringToDoubleConverter.java | 67 +--------- .../converter/StringToFloatConverter.java | 67 +--------- .../converter/StringToIntegerConverter.java | 54 +++----- .../converter/StringToNumberConverter.java | 69 +--------- 5 files changed, 148 insertions(+), 229 deletions(-) create mode 100644 server/src/com/vaadin/data/util/converter/AbstractStringToNumberConverter.java diff --git a/server/src/com/vaadin/data/util/converter/AbstractStringToNumberConverter.java b/server/src/com/vaadin/data/util/converter/AbstractStringToNumberConverter.java new file mode 100644 index 0000000000..b9a122ecb5 --- /dev/null +++ b/server/src/com/vaadin/data/util/converter/AbstractStringToNumberConverter.java @@ -0,0 +1,120 @@ +/* + * Copyright 2012 Vaadin Ltd. + * + * 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. + */ + +package com.vaadin.data.util.converter; + +import java.text.NumberFormat; +import java.text.ParsePosition; +import java.util.Locale; + +/** + * A converter that converts from the number type T to {@link String} and back. + * Uses the given locale and {@link NumberFormat} for formatting and parsing. + * Automatically trims the input string, removing any leading and trailing white + * space. + *

+ * Override and overwrite {@link #getFormat(Locale)} to use a different format. + *

+ * + * @author Vaadin Ltd + * @since 7.1 + */ +public abstract class AbstractStringToNumberConverter implements + Converter { + + /** + * Returns the format used by {@link #convertToPresentation(Object, Locale)} + * and {@link #convertToModel(Object, Locale)}. + * + * @param locale + * The locale to use + * @return A NumberFormat instance + * @since 7.1 + */ + protected NumberFormat getFormat(Locale locale) { + if (locale == null) { + locale = Locale.getDefault(); + } + + return NumberFormat.getNumberInstance(locale); + } + + /** + * Convert the value to a Number using the given locale and + * {@link #getFormat(Locale)}. + * + * @param value + * The value to convert + * @param locale + * The locale to use for conversion + * @return The converted value + * @throws ConversionException + * If there was a problem converting the value + * @since 7.1 + */ + protected Number convertToNumber(String value, Locale locale) + throws ConversionException { + if (value == null) { + return null; + } + + // Remove leading and trailing white space + value = value.trim(); + + // Parse and detect errors. If the full string was not used, it is + // an error. + ParsePosition parsePosition = new ParsePosition(0); + Number parsedValue = getFormat(locale).parse(value, parsePosition); + if (parsePosition.getIndex() != value.length()) { + throw new ConversionException("Could not convert '" + value + + "' to " + getModelType().getName()); + } + + if (parsedValue == null) { + // Convert "" to null + return null; + } + return parsedValue; + } + + /* + * (non-Javadoc) + * + * @see + * com.vaadin.data.util.converter.Converter#convertToPresentation(java.lang + * .Object, java.util.Locale) + */ + @Override + public String convertToPresentation(T value, Locale locale) + throws ConversionException { + if (value == null) { + return null; + } + + return getFormat(locale).format(value); + } + + /* + * (non-Javadoc) + * + * @see com.vaadin.data.util.converter.Converter#getPresentationType() + */ + @Override + public Class getPresentationType() { + return String.class; + } + +} diff --git a/server/src/com/vaadin/data/util/converter/StringToDoubleConverter.java b/server/src/com/vaadin/data/util/converter/StringToDoubleConverter.java index 69a0faf8f4..8bb82498b9 100644 --- a/server/src/com/vaadin/data/util/converter/StringToDoubleConverter.java +++ b/server/src/com/vaadin/data/util/converter/StringToDoubleConverter.java @@ -17,7 +17,6 @@ package com.vaadin.data.util.converter; import java.text.NumberFormat; -import java.text.ParsePosition; import java.util.Locale; /** @@ -34,23 +33,8 @@ import java.util.Locale; * @author Vaadin Ltd * @since 7.0 */ -public class StringToDoubleConverter implements Converter { - - /** - * Returns the format used by {@link #convertToPresentation(Double, Locale)} - * and {@link #convertToModel(String, Locale)}. - * - * @param locale - * The locale to use - * @return A NumberFormat instance - */ - protected NumberFormat getFormat(Locale locale) { - if (locale == null) { - locale = Locale.getDefault(); - } - - return NumberFormat.getNumberInstance(locale); - } +public class StringToDoubleConverter extends + AbstractStringToNumberConverter { /* * (non-Javadoc) @@ -62,42 +46,8 @@ public class StringToDoubleConverter implements Converter { @Override public Double convertToModel(String value, Locale locale) throws ConversionException { - if (value == null) { - return null; - } - - // Remove leading and trailing white space - value = value.trim(); - - ParsePosition parsePosition = new ParsePosition(0); - Number parsedValue = getFormat(locale).parse(value, parsePosition); - if (parsePosition.getIndex() != value.length()) { - throw new ConversionException("Could not convert '" + value - + "' to " + getModelType().getName()); - } - if (parsedValue == null) { - // Convert "" to null - return null; - } - - return parsedValue.doubleValue(); - } - - /* - * (non-Javadoc) - * - * @see - * com.vaadin.data.util.converter.Converter#convertToPresentation(java.lang - * .Object, java.util.Locale) - */ - @Override - public String convertToPresentation(Double value, Locale locale) - throws ConversionException { - if (value == null) { - return null; - } - - return getFormat(locale).format(value); + Number n = convertToNumber(value, locale); + return n == null ? null : n.doubleValue(); } /* @@ -110,13 +60,4 @@ public class StringToDoubleConverter implements Converter { return Double.class; } - /* - * (non-Javadoc) - * - * @see com.vaadin.data.util.converter.Converter#getPresentationType() - */ - @Override - public Class getPresentationType() { - return String.class; - } } diff --git a/server/src/com/vaadin/data/util/converter/StringToFloatConverter.java b/server/src/com/vaadin/data/util/converter/StringToFloatConverter.java index 1adfd87565..a207654358 100644 --- a/server/src/com/vaadin/data/util/converter/StringToFloatConverter.java +++ b/server/src/com/vaadin/data/util/converter/StringToFloatConverter.java @@ -17,7 +17,6 @@ package com.vaadin.data.util.converter; import java.text.NumberFormat; -import java.text.ParsePosition; import java.util.Locale; /** @@ -34,23 +33,8 @@ import java.util.Locale; * @author Vaadin Ltd * @since 7.0 */ -public class StringToFloatConverter implements Converter { - - /** - * Returns the format used by {@link #convertToPresentation(Float, Locale)} - * and {@link #convertToModel(String, Locale)}. - * - * @param locale - * The locale to use - * @return A NumberFormat instance - */ - protected NumberFormat getFormat(Locale locale) { - if (locale == null) { - locale = Locale.getDefault(); - } - - return NumberFormat.getNumberInstance(locale); - } +public class StringToFloatConverter extends + AbstractStringToNumberConverter { /* * (non-Javadoc) @@ -62,42 +46,8 @@ public class StringToFloatConverter implements Converter { @Override public Float convertToModel(String value, Locale locale) throws ConversionException { - if (value == null) { - return null; - } - - // Remove leading and trailing white space - value = value.trim(); - - ParsePosition parsePosition = new ParsePosition(0); - Number parsedValue = getFormat(locale).parse(value, parsePosition); - if (parsePosition.getIndex() != value.length()) { - throw new ConversionException("Could not convert '" + value - + "' to " + getModelType().getName()); - } - if (parsedValue == null) { - // Convert "" to null - return null; - } - - return parsedValue.floatValue(); - } - - /* - * (non-Javadoc) - * - * @see - * com.vaadin.data.util.converter.Converter#convertToPresentation(java.lang - * .Object, java.util.Locale) - */ - @Override - public String convertToPresentation(Float value, Locale locale) - throws ConversionException { - if (value == null) { - return null; - } - - return getFormat(locale).format(value); + Number n = convertToNumber(value, locale); + return n == null ? null : n.floatValue(); } /* @@ -110,13 +60,4 @@ public class StringToFloatConverter implements Converter { return Float.class; } - /* - * (non-Javadoc) - * - * @see com.vaadin.data.util.converter.Converter#getPresentationType() - */ - @Override - public Class getPresentationType() { - return String.class; - } } diff --git a/server/src/com/vaadin/data/util/converter/StringToIntegerConverter.java b/server/src/com/vaadin/data/util/converter/StringToIntegerConverter.java index 4bb933bcc8..4f34cf1cd3 100644 --- a/server/src/com/vaadin/data/util/converter/StringToIntegerConverter.java +++ b/server/src/com/vaadin/data/util/converter/StringToIntegerConverter.java @@ -17,7 +17,6 @@ package com.vaadin.data.util.converter; import java.text.NumberFormat; -import java.text.ParsePosition; import java.util.Locale; /** @@ -31,7 +30,8 @@ import java.util.Locale; * @author Vaadin Ltd * @since 7.0 */ -public class StringToIntegerConverter implements Converter { +public class StringToIntegerConverter extends + AbstractStringToNumberConverter { /** * Returns the format used by @@ -42,6 +42,7 @@ public class StringToIntegerConverter implements Converter { * The locale to use * @return A NumberFormat instance */ + @Override protected NumberFormat getFormat(Locale locale) { if (locale == null) { locale = Locale.getDefault(); @@ -49,50 +50,29 @@ public class StringToIntegerConverter implements Converter { return NumberFormat.getIntegerInstance(locale); } + /* + * (non-Javadoc) + * + * @see + * com.vaadin.data.util.converter.Converter#convertToModel(java.lang.Object, + * java.util.Locale) + */ @Override public Integer convertToModel(String value, Locale locale) throws ConversionException { - if (value == null) { - return null; - } - - // Remove leading and trailing white space - value = value.trim(); + Number n = convertToNumber(value, locale); + return n == null ? null : n.intValue(); - // Parse and detect errors. If the full string was not used, it is - // an error. - ParsePosition parsePosition = new ParsePosition(0); - Number parsedValue = getFormat(locale).parse(value, parsePosition); - if (parsePosition.getIndex() != value.length()) { - throw new ConversionException("Could not convert '" + value - + "' to " + getModelType().getName()); - } - - if (parsedValue == null) { - // Convert "" to null - return null; - } - return parsedValue.intValue(); - } - - @Override - public String convertToPresentation(Integer value, Locale locale) - throws ConversionException { - if (value == null) { - return null; - } - - return getFormat(locale).format(value); } + /* + * (non-Javadoc) + * + * @see com.vaadin.data.util.converter.Converter#getModelType() + */ @Override public Class getModelType() { return Integer.class; } - @Override - public Class getPresentationType() { - return String.class; - } - } diff --git a/server/src/com/vaadin/data/util/converter/StringToNumberConverter.java b/server/src/com/vaadin/data/util/converter/StringToNumberConverter.java index 99ff7007ad..eae73e4cfa 100644 --- a/server/src/com/vaadin/data/util/converter/StringToNumberConverter.java +++ b/server/src/com/vaadin/data/util/converter/StringToNumberConverter.java @@ -17,7 +17,6 @@ package com.vaadin.data.util.converter; import java.text.NumberFormat; -import java.text.ParsePosition; import java.util.Locale; /** @@ -30,23 +29,8 @@ import java.util.Locale; * @author Vaadin Ltd * @since 7.0 */ -public class StringToNumberConverter implements Converter { - - /** - * Returns the format used by {@link #convertToPresentation(Number, Locale)} - * and {@link #convertToModel(String, Locale)}. - * - * @param locale - * The locale to use - * @return A NumberFormat instance - */ - protected NumberFormat getFormat(Locale locale) { - if (locale == null) { - locale = Locale.getDefault(); - } - - return NumberFormat.getNumberInstance(locale); - } +public class StringToNumberConverter extends + AbstractStringToNumberConverter { /* * (non-Javadoc) @@ -58,44 +42,7 @@ public class StringToNumberConverter implements Converter { @Override public Number convertToModel(String value, Locale locale) throws ConversionException { - if (value == null) { - return null; - } - - // Remove leading and trailing white space - value = value.trim(); - - // Parse and detect errors. If the full string was not used, it is - // an error. - ParsePosition parsePosition = new ParsePosition(0); - Number parsedValue = getFormat(locale).parse(value, parsePosition); - if (parsePosition.getIndex() != value.length()) { - throw new ConversionException("Could not convert '" + value - + "' to " + getModelType().getName()); - } - - if (parsedValue == null) { - // Convert "" to null - return null; - } - return parsedValue; - } - - /* - * (non-Javadoc) - * - * @see - * com.vaadin.data.util.converter.Converter#convertToPresentation(java.lang - * .Object, java.util.Locale) - */ - @Override - public String convertToPresentation(Number value, Locale locale) - throws ConversionException { - if (value == null) { - return null; - } - - return getFormat(locale).format(value); + return convertToNumber(value, locale); } /* @@ -108,14 +55,4 @@ public class StringToNumberConverter implements Converter { return Number.class; } - /* - * (non-Javadoc) - * - * @see com.vaadin.data.util.converter.Converter#getPresentationType() - */ - @Override - public Class getPresentationType() { - return String.class; - } - } -- 2.39.5