private Object convert()

in dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/Configurable.java [222:326]


        private Object convert(Type type, String key, Object value, boolean useImplicitDefault) throws Exception {
            if (type instanceof ParameterizedType) {
                return convertParameterizedType((ParameterizedType) type, key, value, useImplicitDefault);
            }
            if (type instanceof GenericArrayType) {
                return convertArray(((GenericArrayType) type).getGenericComponentType(), key, value, useImplicitDefault);
            }
            Class<?> resultType = (Class<?>) type;
            if (resultType.isArray()) {
                return convertArray(resultType.getComponentType(), key, value, useImplicitDefault);
            }
            if (resultType.isInstance(value)) {
                return value;
            }

            if (Boolean.class.equals(resultType) || Boolean.TYPE.equals(resultType)) {
                if (value == null) {
                    return useImplicitDefault && resultType.isPrimitive() ? DEFAULT_BOOLEAN : null;
                }
                return Boolean.valueOf(value.toString());
            }
            else if (Byte.class.equals(resultType) || Byte.TYPE.equals(resultType)) {
                if (value == null) {
                    return useImplicitDefault && resultType.isPrimitive() ? DEFAULT_BYTE : null;
                }
                if (value instanceof Number) {
                    return ((Number) value).byteValue();
                }
                return Byte.valueOf(value.toString());
            }
            else if (Short.class.equals(resultType) || Short.TYPE.equals(resultType)) {
                if (value == null) {
                    return useImplicitDefault && resultType.isPrimitive() ? DEFAULT_SHORT : null;
                }
                if (value instanceof Number) {
                    return ((Number) value).shortValue();
                }
                return Short.valueOf(value.toString());
            }
            else if (Integer.class.equals(resultType) || Integer.TYPE.equals(resultType)) {
                if (value == null) {
                    return useImplicitDefault && resultType.isPrimitive() ? DEFAULT_INT : null;
                }
                if (value instanceof Number) {
                    return ((Number) value).intValue();
                }
                return Integer.valueOf(value.toString());
            }
            else if (Long.class.equals(resultType) || Long.TYPE.equals(resultType)) {
                if (value == null) {
                    return useImplicitDefault && resultType.isPrimitive() ? DEFAULT_LONG : null;
                }
                if (value instanceof Number) {
                    return ((Number) value).longValue();
                }
                return Long.valueOf(value.toString());
            }
            else if (Float.class.equals(resultType) || Float.TYPE.equals(resultType)) {
                if (value == null) {
                    return useImplicitDefault && resultType.isPrimitive() ? DEFAULT_FLOAT : null;
                }
                if (value instanceof Number) {
                    return ((Number) value).floatValue();
                }
                return Float.valueOf(value.toString());
            }
            else if (Double.class.equals(resultType) || Double.TYPE.equals(resultType)) {
                if (value == null) {
                    return useImplicitDefault && resultType.isPrimitive() ? DEFAULT_DOUBLE : null;
                }
                if (value instanceof Number) {
                    return ((Number) value).doubleValue();
                }
                return Double.valueOf(value.toString());
            }
            else if (Number.class.equals(resultType)) {
                if (value == null) {
                    return null;
                }
                String numStr = value.toString();
                if (numStr.indexOf('.') > 0) {
                    return Double.valueOf(numStr);
                }
                return Long.valueOf(numStr);
            }
            else if (String.class.isAssignableFrom(resultType)) {
                return value == null ? null : value.toString();
            }
            else if (Enum.class.isAssignableFrom(resultType)) {
                if (value == null) {
                    return null;
                }
                Class<Enum> enumType = (Class<Enum>) resultType;
                return Enum.valueOf(enumType, value.toString().toUpperCase());
            }
            else if (resultType.isInterface()) {
                Map<?, ?> map = toMap(key, value);
                if (map == null) {
                	return useImplicitDefault ? create(resultType, Collections.emptyMap()) : null;
                }
                return create(resultType, map);
            }

            throw new RuntimeException("Unhandled type: " + type);
        }