in juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java [301:453]
public <T> T parseAnything(ClassMeta<?> eType, UonReader r, Object outer, boolean isUrlParamValue, BeanPropertyMeta pMeta) throws IOException, ParseException, ExecutableException {
if (eType == null)
eType = object();
ObjectSwap<T,Object> swap = (ObjectSwap<T,Object>)eType.getSwap(this);
BuilderSwap<T,Object> builder = (BuilderSwap<T,Object>)eType.getBuilderSwap(this);
ClassMeta<?> sType = null;
if (builder != null)
sType = builder.getBuilderClassMeta(this);
else if (swap != null)
sType = swap.getSwapClassMeta(this);
else
sType = eType;
if (sType.isOptional())
return (T)optional(parseAnything(eType.getElementType(), r, outer, isUrlParamValue, pMeta));
setCurrentClass(sType);
Object o = null;
int c = r.peekSkipWs();
if (c == -1 || c == AMP) {
// If parameter is blank and it's an array or collection, return an empty list.
if (sType.isCollectionOrArray())
o = sType.newInstance();
else if (sType.isString() || sType.isObject())
o = "";
else if (sType.isPrimitive())
o = sType.getPrimitiveDefault();
// Otherwise, leave null.
} else if (sType.isVoid()) {
String s = parseString(r, isUrlParamValue);
if (s != null)
throw new ParseException(this, "Expected ''null'' for void value, but was ''{0}''.", s);
} else if (sType.isObject()) {
if (c == '(') {
JsonMap m = new JsonMap(this);
parseIntoMap(r, m, string(), object(), pMeta);
o = cast(m, pMeta, eType);
} else if (c == '@') {
Collection l = new JsonList(this);
o = parseIntoCollection(r, l, sType, isUrlParamValue, pMeta);
} else {
String s = parseString(r, isUrlParamValue);
if (c != '\'') {
if ("true".equals(s) || "false".equals(s))
o = Boolean.valueOf(s);
else if (! "null".equals(s)) {
if (isNumeric(s))
o = StringUtils.parseNumber(s, Number.class);
else
o = s;
}
} else {
o = s;
}
}
} else if (sType.isBoolean()) {
o = parseBoolean(r);
} else if (sType.isCharSequence()) {
o = parseString(r, isUrlParamValue);
} else if (sType.isChar()) {
o = parseCharacter(parseString(r, isUrlParamValue));
} else if (sType.isNumber()) {
o = parseNumber(r, (Class<? extends Number>)sType.getInnerClass());
} else if (sType.isMap()) {
Map m = (sType.canCreateNewInstance(outer) ? (Map)sType.newInstance(outer) : newGenericMap(sType));
o = parseIntoMap(r, m, sType.getKeyType(), sType.getValueType(), pMeta);
} else if (sType.isCollection()) {
if (c == '(') {
JsonMap m = new JsonMap(this);
parseIntoMap(r, m, string(), object(), pMeta);
// Handle case where it's a collection, but serialized as a map with a _type or _value key.
if (m.containsKey(getBeanTypePropertyName(sType)))
o = cast(m, pMeta, eType);
// Handle case where it's a collection, but only a single value was specified.
else {
Collection l = (
sType.canCreateNewInstance(outer)
? (Collection)sType.newInstance(outer)
: new JsonList(this)
);
l.add(m.cast(sType.getElementType()));
o = l;
}
} else {
Collection l = (
sType.canCreateNewInstance(outer)
? (Collection)sType.newInstance(outer)
: new JsonList(this)
);
o = parseIntoCollection(r, l, sType, isUrlParamValue, pMeta);
}
} else if (builder != null) {
BeanMap m = toBeanMap(builder.create(this, eType));
m = parseIntoBeanMap(r, m);
o = m == null ? null : builder.build(this, m.getBean(), eType);
} else if (sType.canCreateNewBean(outer)) {
BeanMap m = newBeanMap(outer, sType.getInnerClass());
m = parseIntoBeanMap(r, m);
o = m == null ? null : m.getBean();
} else if (sType.canCreateNewInstanceFromString(outer)) {
String s = parseString(r, isUrlParamValue);
if (s != null)
o = sType.newInstanceFromString(outer, s);
} else if (sType.isArray() || sType.isArgs()) {
if (c == '(') {
JsonMap m = new JsonMap(this);
parseIntoMap(r, m, string(), object(), pMeta);
// Handle case where it's an array, but serialized as a map with a _type or _value key.
if (m.containsKey(getBeanTypePropertyName(sType)))
o = cast(m, pMeta, eType);
// Handle case where it's an array, but only a single value was specified.
else {
ArrayList l = list(1);
l.add(m.cast(sType.getElementType()));
o = toArray(sType, l);
}
} else {
ArrayList l = (ArrayList)parseIntoCollection(r, list(), sType, isUrlParamValue, pMeta);
o = toArray(sType, l);
}
} else if (c == '(') {
// It could be a non-bean with _type attribute.
JsonMap m = new JsonMap(this);
parseIntoMap(r, m, string(), object(), pMeta);
if (m.containsKey(getBeanTypePropertyName(sType)))
o = cast(m, pMeta, eType);
else if (sType.getProxyInvocationHandler() != null)
o = newBeanMap(outer, sType.getInnerClass()).load(m).getBean();
else
throw new ParseException(this, "Class ''{0}'' could not be instantiated. Reason: ''{1}''",
sType.getInnerClass().getName(), sType.getNotABeanReason());
} else if (c == 'n') {
r.read();
parseNull(r);
} else {
throw new ParseException(this, "Class ''{0}'' could not be instantiated. Reason: ''{1}''",
sType.getInnerClass().getName(), sType.getNotABeanReason());
}
if (o == null && sType.isPrimitive())
o = sType.getPrimitiveDefault();
if (swap != null && o != null)
o = unswap(swap, o, eType);
if (outer != null)
setParent(eType, o, outer);
return (T)o;
}