/* * Copyright (c) 2001-2007, Inversoft Inc., All Rights Reserved * * 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 org.primeframework.mvc.parameter.convert.converters; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Map; import org.primeframework.mvc.config.MVCConfiguration; import org.primeframework.mvc.parameter.convert.ConversionException; import org.primeframework.mvc.parameter.convert.ConverterStateException; import org.primeframework.mvc.parameter.convert.annotation.GlobalConverter; import com.google.inject.Inject; /** * This is the type converter for primitives and wrapper classes of numbers. * * @author Brian Pontarelli */ @GlobalConverter public class NumberConverter extends AbstractPrimitiveConverter { @Inject public NumberConverter(MVCConfiguration configuration) { super(configuration); } /** * Returns 0 for everything but in the correct wrapper classes. */ protected Object defaultPrimitive(Class convertTo, Map<String, String> attributes) throws ConversionException, ConverterStateException { if (convertTo == Byte.TYPE || convertTo == Byte.class) { return (byte) 0; } else if (convertTo == Short.TYPE || convertTo == Short.class) { return (short) 0; } else if (convertTo == Integer.TYPE || convertTo == Integer.class) { return 0; } else if (convertTo == Long.TYPE || convertTo == Long.class) { return 0l; } else if (convertTo == Float.TYPE || convertTo == Float.class) { return 0.0f; } else if (convertTo == BigInteger.class) { return BigInteger.ZERO; } else if (convertTo == BigDecimal.class) { return new BigDecimal(0.0d); } else if (convertTo == Double.TYPE || convertTo == Double.class) { return 0.0d; } throw new ConverterStateException("Invalid type for NumberConverter [" + convertTo + "]"); } /** * Uses the valueOf methods in the wrapper classes based on the convertTo type. */ protected Object stringToPrimitive(String value, Class convertTo, Map<String, String> attributes) throws ConversionException, ConverterStateException { try { if (convertTo == Byte.TYPE || convertTo == Byte.class) { return Byte.valueOf(value); } else if (convertTo == Short.TYPE || convertTo == Short.class) { return Short.valueOf(value); } else if (convertTo == Integer.TYPE || convertTo == Integer.class) { return Integer.valueOf(value); } else if (convertTo == Long.TYPE || convertTo == Long.class) { return Long.valueOf(value); } else if (convertTo == Float.TYPE || convertTo == Float.class) { return Float.valueOf(value); } else if (convertTo == Double.TYPE || convertTo == Double.class) { return Double.valueOf(value); } else if (convertTo == BigInteger.class) { return new BigInteger(value); } else if (convertTo == BigDecimal.class) { return new BigDecimal(value); } throw new ConverterStateException("Invalid type for NumberConverter [" + convertTo + "]"); } catch (NumberFormatException e) { throw new ConversionException(e); } } protected String primitiveToString(Object value, Class convertFrom, Map<String, String> attributes) throws ConversionException, ConverterStateException { return value.toString(); // TODO add precision support // if (convertFrom == Byte.TYPE || convertFrom == Byte.class || // convertFrom == Short.TYPE || convertFrom == Short.class || // convertFrom == Integer.TYPE || convertFrom == Integer.class || // convertFrom == Long.TYPE || convertFrom == Long.class) { // return value.toString(); // } else if (convertFrom == Float.TYPE || convertFrom == Float.class || // convertFrom == Double.TYPE || convertFrom == Double.class) { // return Double.valueOf(value); // } else if (convertFrom == BigInteger.class) { // return new BigInteger(value); // } else if (convertFrom == BigDecimal.class) { // return new BigDecimal(value); // } } }