Change-Id: I53e413f8e9c8754915d80c30d3dca97eb1881c74tags/7.1.0
@@ -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. | |||
* <p> | |||
* Override and overwrite {@link #getFormat(Locale)} to use a different format. | |||
* </p> | |||
* | |||
* @author Vaadin Ltd | |||
* @since 7.1 | |||
*/ | |||
public abstract class AbstractStringToNumberConverter<T> implements | |||
Converter<String, T> { | |||
/** | |||
* 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<String> getPresentationType() { | |||
return String.class; | |||
} | |||
} |
@@ -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<String, Double> { | |||
/** | |||
* 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<Double> { | |||
/* | |||
* (non-Javadoc) | |||
@@ -62,42 +46,8 @@ public class StringToDoubleConverter implements Converter<String, Double> { | |||
@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<String, Double> { | |||
return Double.class; | |||
} | |||
/* | |||
* (non-Javadoc) | |||
* | |||
* @see com.vaadin.data.util.converter.Converter#getPresentationType() | |||
*/ | |||
@Override | |||
public Class<String> getPresentationType() { | |||
return String.class; | |||
} | |||
} |
@@ -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<String, Float> { | |||
/** | |||
* 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<Float> { | |||
/* | |||
* (non-Javadoc) | |||
@@ -62,42 +46,8 @@ public class StringToFloatConverter implements Converter<String, Float> { | |||
@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<String, Float> { | |||
return Float.class; | |||
} | |||
/* | |||
* (non-Javadoc) | |||
* | |||
* @see com.vaadin.data.util.converter.Converter#getPresentationType() | |||
*/ | |||
@Override | |||
public Class<String> getPresentationType() { | |||
return String.class; | |||
} | |||
} |
@@ -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<String, Integer> { | |||
public class StringToIntegerConverter extends | |||
AbstractStringToNumberConverter<Integer> { | |||
/** | |||
* Returns the format used by | |||
@@ -42,6 +42,7 @@ public class StringToIntegerConverter implements Converter<String, Integer> { | |||
* 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<String, Integer> { | |||
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<Integer> getModelType() { | |||
return Integer.class; | |||
} | |||
@Override | |||
public Class<String> getPresentationType() { | |||
return String.class; | |||
} | |||
} |
@@ -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<String, Number> { | |||
/** | |||
* 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<Number> { | |||
/* | |||
* (non-Javadoc) | |||
@@ -58,44 +42,7 @@ public class StringToNumberConverter implements Converter<String, Number> { | |||
@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<String, Number> { | |||
return Number.class; | |||
} | |||
/* | |||
* (non-Javadoc) | |||
* | |||
* @see com.vaadin.data.util.converter.Converter#getPresentationType() | |||
*/ | |||
@Override | |||
public Class<String> getPresentationType() { | |||
return String.class; | |||
} | |||
} |