in juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java [247:324]
private <T> T parseAnything(ClassMeta<T> eType, UonReader r, Object outer) throws IOException, ParseException, ExecutableException {
if (eType == null)
eType = (ClassMeta<T>)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));
int c = r.peekSkipWs();
if (c == '?')
r.read();
Object o;
if (sType.isObject()) {
JsonMap m = new JsonMap(this);
parseIntoMap2(r, m, getClassMeta(Map.class, String.class, Object.class), outer);
if (m.containsKey("_value"))
o = m.get("_value");
else
o = cast(m, null, eType);
} else if (sType.isMap()) {
Map m = (sType.canCreateNewInstance() ? (Map)sType.newInstance() : newGenericMap(sType));
o = parseIntoMap2(r, m, sType, m);
} 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.isCollection() || sType.isArray() || sType.isArgs()) {
// ?1=foo&2=bar...
Collection c2 = ((sType.isArray() || sType.isArgs()) || ! sType.canCreateNewInstance(outer)) ? new JsonList(this) : (Collection)sType.newInstance();
Map<Integer,Object> m = new TreeMap<>();
parseIntoMap2(r, m, sType, c2);
c2.addAll(m.values());
if (sType.isArray())
o = ArrayUtils.toArray(c2, sType.getElementType().getInnerClass());
else if (sType.isArgs())
o = c2.toArray(new Object[c2.size()]);
else
o = c2;
} else {
// It could be a non-bean with _type attribute.
JsonMap m = new JsonMap(this);
parseIntoMap2(r, m, getClassMeta(Map.class, String.class, Object.class), outer);
if (m.containsKey(getBeanTypePropertyName(eType)))
o = cast(m, null, eType);
else if (m.containsKey("_value"))
o = convertToType(m.get("_value"), sType);
else if (sType.getProxyInvocationHandler() != null) {
o = newBeanMap(outer, sType.getInnerClass()).load(m).getBean();
} else {
if (sType.getNotABeanReason() != null)
throw new ParseException(this, "Class ''{0}'' could not be instantiated as application/x-www-form-urlencoded. Reason: ''{1}''", sType, sType.getNotABeanReason());
throw new ParseException(this, "Malformed application/x-www-form-urlencoded input for class ''{0}''.", sType);
}
}
if (swap != null && o != null)
o = unswap(swap, o, eType);
if (outer != null)
setParent(eType, o, outer);
return (T)o;
}