/** * Copyright (c) 2009 - 2012 Red Hat, Inc. * * This software is licensed to you under the GNU General Public License, * version 2 (GPLv2). There is NO WARRANTY for this software, express or * implied, including the implied warranties of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 * along with this software; if not, see * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * * Red Hat trademarks are not licensed under GPLv2. No permission is * granted to use or replicate Red Hat trademarks that are incorporated * in this software or its documentation. */ package org.candlepin.common.config; import org.apache.commons.lang.BooleanUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Constructor; import java.math.BigInteger; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; /** * PropertyConverter. Inspired by * org.apache.commons.configuration.PropertyConverter. */ public class PropertyConverter { private static Logger log = LoggerFactory.getLogger(PropertyConverter.class); private static final String HEX_PREFIX = "0x"; private static final int HEX_RADIX = 16; private static final String BIN_PREFIX = "0b"; private static final int BIN_RADIX = 2; /** Constant for the argument classes of the Number constructor that takes a String. */ private static final Class<?>[] CONSTR_ARGS = {String.class}; protected static final String ERROR_MESSAGE = "The value %s can not be converted to a %s object."; private PropertyConverter() { // This class only provides static methods. } private static String formatErrorMessage(Object value, Class<?> clazz) { return String.format(ERROR_MESSAGE, value, clazz.getName()); } public static Boolean toBoolean(Object value) throws ConversionException { if (value instanceof Boolean) { return (Boolean) value; } else if (value instanceof String) { if ("1".equalsIgnoreCase((String) value) || "y".equalsIgnoreCase((String) value)) { return true; } return BooleanUtils.toBoolean((String) value); } else { String msg = formatErrorMessage(value, Boolean.class); log.warn(msg); throw new ConversionException(msg); } } public static Integer toInteger(Object value) throws ConversionException { Number n = toNumber(value, Integer.class); if (n instanceof Integer) { return (Integer) n; } else { return new Integer(n.intValue()); } } public static Long toLong(Object value) throws ConversionException { Number n = toNumber(value, Long.class); if (n instanceof Long) { return (Long) n; } else { return new Long(n.longValue()); } } public static BigInteger toBigInteger(Object value) throws ConversionException { Number n = toNumber(value, BigInteger.class); if (n instanceof BigInteger) { return (BigInteger) n; } else { return BigInteger.valueOf(n.longValue()); } } protected static Number toNumber(Object value, Class<?> clazz) throws ConversionException { if (value instanceof Number) { return (Number) value; } else { String str = value.toString(); if (str.startsWith(HEX_PREFIX)) { try { return new BigInteger(str.substring(HEX_PREFIX.length()), HEX_RADIX); } catch (NumberFormatException nex) { String msg = formatErrorMessage(value, clazz); log.warn(msg); throw new ConversionException(msg, nex); } } if (str.startsWith(BIN_PREFIX)) { try { return new BigInteger(str.substring(BIN_PREFIX.length()), BIN_RADIX); } catch (NumberFormatException nex) { String msg = formatErrorMessage(value, clazz); log.warn(msg); throw new ConversionException(msg, nex); } } try { Constructor<?> constr = clazz.getConstructor(CONSTR_ARGS); return (Number) constr.newInstance(new Object[] { str }); } catch (Exception ex) { // Treat all possible exceptions the same way String msg = formatErrorMessage(value, clazz); log.warn(msg); throw new ConversionException(msg, ex); } } } public static List<String> toList(Object value) { if (value instanceof String) { String[] parts = ((String) value).split("\\s*,\\s*"); return Arrays.asList(parts); } else { String msg = formatErrorMessage(value, List.class); log.warn(msg); throw new ConversionException(msg); } } public static Set<String> toSet(Object value) { if (value instanceof String) { String[] parts = ((String) value).split("\\s*,\\s*"); return new HashSet<String>(Arrays.asList(parts)); } else { String msg = formatErrorMessage(value, Set.class); log.warn(msg); throw new ConversionException(msg); } } }