001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018package org.apache.commons.beanutils2; 019 020/** 021 * <p> 022 * Utility methods for converting String scalar values to objects of the specified Class, String arrays to arrays of the specified Class. 023 * </p> 024 * 025 * <p> 026 * For more details, see {@code ConvertUtilsBean} which provides the implementations for these methods. 027 * </p> 028 * 029 * @see ConvertUtilsBean 030 */ 031public class ConvertUtils { 032 033 /** 034 * <p> 035 * Converts the specified value into a String. 036 * </p> 037 * 038 * <p> 039 * For more details see {@code ConvertUtilsBean}. 040 * </p> 041 * 042 * @param value Value to be converted (may be null) 043 * @return The converted String value or null if value is null 044 * @see ConvertUtilsBean#convert(Object) 045 */ 046 public static String convert(final Object value) { 047 return ConvertUtilsBean.getInstance().convert(value); 048 } 049 050 /** 051 * <p> 052 * Converts the value to an object of the specified class (if possible). 053 * </p> 054 * 055 * @param value Value to be converted (may be null) 056 * @param targetType Class of the value to be converted to (must not be null) 057 * @return The converted value 058 * @throws ConversionException if thrown by an underlying Converter 059 */ 060 public static Object convert(final Object value, final Class<?> targetType) { 061 return ConvertUtilsBean.getInstance().convert(value, targetType); 062 } 063 064 /** 065 * <p> 066 * Converts the specified value to an object of the specified class (if possible). Otherwise, return a String representation of the value. 067 * </p> 068 * 069 * <p> 070 * For more details see {@code ConvertUtilsBean}. 071 * </p> 072 * 073 * @param value Value to be converted (may be null) 074 * @param clazz Java class to be converted to (must not be null) 075 * @return The converted value 076 * @see ConvertUtilsBean#convert(String, Class) 077 */ 078 public static Object convert(final String value, final Class<?> clazz) { 079 return ConvertUtilsBean.getInstance().convert(value, clazz); 080 } 081 082 /** 083 * <p> 084 * Convert an array of specified values to an array of objects of the specified class (if possible). 085 * </p> 086 * 087 * <p> 088 * For more details see {@code ConvertUtilsBean}. 089 * </p> 090 * 091 * @param values Array of values to be converted 092 * @param clazz Java array or element class to be converted to (must not be null) 093 * @return The converted value 094 * @see ConvertUtilsBean#convert(String[], Class) 095 */ 096 public static Object convert(final String[] values, final Class<?> clazz) { 097 return ConvertUtilsBean.getInstance().convert(values, clazz); 098 } 099 100 /** 101 * <p> 102 * Remove all registered {@link Converter}s, and re-establish the standard Converters. 103 * </p> 104 * 105 * <p> 106 * For more details see {@code ConvertUtilsBean}. 107 * </p> 108 * 109 * @see ConvertUtilsBean#deregister() 110 */ 111 public static void deregister() { 112 ConvertUtilsBean.getInstance().deregister(); 113 } 114 115 /** 116 * <p> 117 * Remove any registered {@link Converter} for the specified destination {@code Class}. 118 * </p> 119 * 120 * <p> 121 * For more details see {@code ConvertUtilsBean}. 122 * </p> 123 * 124 * @param clazz Class for which to remove a registered Converter 125 * @see ConvertUtilsBean#deregister(Class) 126 */ 127 public static void deregister(final Class<?> clazz) { 128 ConvertUtilsBean.getInstance().deregister(clazz); 129 } 130 131 /** 132 * Look up and return any registered {@link Converter} for the specified source and destination class; if there is no registered Converter, return 133 * {@code null}. 134 * 135 * @param <T> The converter type. 136 * @param sourceType Class of the value being converted 137 * @param targetType Class of the value to be converted to 138 * @return The registered {@link Converter} or {@code null} if not found 139 */ 140 public static <T> Converter<T> lookup(final Class<?> sourceType, final Class<T> targetType) { 141 return ConvertUtilsBean.getInstance().lookup(sourceType, targetType); 142 } 143 144 /** 145 * <p> 146 * Look up and return any registered {@link Converter} for the specified destination class; if there is no registered Converter, return {@code null}. 147 * </p> 148 * 149 * <p> 150 * For more details see {@code ConvertUtilsBean}. 151 * </p> 152 * 153 * @param <T> The converter type. 154 * @param clazz Class for which to return a registered Converter 155 * @return The registered {@link Converter} or {@code null} if not found 156 * @see ConvertUtilsBean#lookup(Class) 157 */ 158 public static <T> Converter<T> lookup(final Class<T> clazz) { 159 return ConvertUtilsBean.getInstance().lookup(clazz); 160 } 161 162 /** 163 * Change primitive Class types to the associated wrapper class. This is useful for concrete converter implementations which typically treat primitive types 164 * like their corresponding wrapper types. 165 * 166 * @param <T> The type to be checked. 167 * @param type The class type to check. 168 * @return The converted type. 169 * @since 1.9 170 */ 171 // All type casts are safe because the TYPE members of the wrapper types 172 // return their own class. 173 @SuppressWarnings("unchecked") 174 public static <T> Class<T> primitiveToWrapper(final Class<T> type) { 175 if (type == null || !type.isPrimitive()) { 176 return type; 177 } 178 179 if (type == Integer.TYPE) { 180 return (Class<T>) Integer.class; 181 } 182 if (type == Double.TYPE) { 183 return (Class<T>) Double.class; 184 } 185 if (type == Long.TYPE) { 186 return (Class<T>) Long.class; 187 } 188 if (type == Boolean.TYPE) { 189 return (Class<T>) Boolean.class; 190 } 191 if (type == Float.TYPE) { 192 return (Class<T>) Float.class; 193 } 194 if (type == Short.TYPE) { 195 return (Class<T>) Short.class; 196 } 197 if (type == Byte.TYPE) { 198 return (Class<T>) Byte.class; 199 } 200 if (type == Character.TYPE) { 201 return (Class<T>) Character.class; 202 } 203 return type; 204 } 205 206 /** 207 * <p> 208 * Register a custom {@link Converter} for the specified destination {@code Class}, replacing any previously registered Converter. 209 * </p> 210 * 211 * <p> 212 * For more details see {@code ConvertUtilsBean}. 213 * </p> 214 * 215 * @param <T> The converter type. 216 * @param converter Converter to be registered 217 * @param clazz Destination class for conversions performed by this Converter 218 * @see ConvertUtilsBean#register(Converter, Class) 219 */ 220 public static <T> void register(final Converter<T> converter, final Class<T> clazz) { 221 ConvertUtilsBean.getInstance().register(converter, clazz); 222 } 223}