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);
}