package core.framework.impl.web.request;
import core.framework.api.util.Exceptions;
import core.framework.api.util.JSON;
import core.framework.api.util.Strings;
import core.framework.api.web.exception.BadRequestException;
/**
* @author neo
*/
public class URLParamParser { // parse query param and path param
@SuppressWarnings("unchecked")
static <T> T parse(String param, Class<T> valueClass) {
if (String.class.equals(valueClass)) {
return (T) param;
} else if (Integer.class.equals(valueClass)) {
return (T) toInt(param);
} else if (Long.class.equals(valueClass)) {
return (T) toLong(param);
} else if (Boolean.class.equals(valueClass)) {
return (T) toBoolean(param);
} else if (valueClass.isEnum()) {
return (T) toEnum(param, (Class<? extends Enum<?>>) valueClass);
}
throw Exceptions.error("not supported path param type, please contact arch team, type={}", valueClass.getCanonicalName());
}
private static <T extends Enum<?>> T toEnum(String value, Class<T> valueClass) {
try {
return JSON.fromEnumValue(valueClass, value);
} catch (IllegalArgumentException e) {
throw new BadRequestException(Strings.format("failed to parse enum, enumClass={}, value={}", valueClass.getCanonicalName(), value), BadRequestException.DEFAULT_ERROR_CODE, e);
}
}
private static Long toLong(String value) {
try {
return Long.parseLong(value);
} catch (NumberFormatException e) {
throw new BadRequestException(Strings.format("failed to parse long, value={}", value), BadRequestException.DEFAULT_ERROR_CODE, e);
}
}
private static Integer toInt(String value) {
try {
return Integer.parseInt(value);
} catch (NumberFormatException e) {
throw new BadRequestException(Strings.format("failed to parse int, value={}", value), BadRequestException.DEFAULT_ERROR_CODE, e);
}
}
private static Boolean toBoolean(String value) {
try {
return Boolean.valueOf(value);
} catch (NumberFormatException e) {
throw new BadRequestException(Strings.format("failed to parse boolean, value={}", value), BadRequestException.DEFAULT_ERROR_CODE, e);
}
}
}