in juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParserSession.java [204:360]
private <T> T parseAnything(ClassMeta<?> eType, MsgPackInputStream is, Object outer, 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(), is, outer, pMeta));
setCurrentClass(sType);
Object o = null;
DataType dt = is.readDataType();
int length = (int)is.readLength();
if (dt != DataType.NULL) {
if (dt == BOOLEAN)
o = is.readBoolean();
else if (dt == INT)
o = is.readInt();
else if (dt == LONG)
o = is.readLong();
else if (dt == FLOAT)
o = is.readFloat();
else if (dt == DOUBLE)
o = is.readDouble();
else if (dt == STRING)
o = trim(is.readString());
else if (dt == BIN)
o = is.readBinary();
else if (dt == ARRAY && sType.isObject()) {
JsonList jl = new JsonList(this);
for (int i = 0; i < length; i++)
jl.add(parseAnything(object(), is, outer, pMeta));
o = jl;
} else if (dt == MAP && sType.isObject()) {
JsonMap jm = new JsonMap(this);
for (int i = 0; i < length; i++)
jm.put((String)parseAnything(string(), is, outer, pMeta), parseAnything(object(), is, jm, pMeta));
o = cast(jm, pMeta, eType);
}
if (sType.isObject()) {
// Do nothing.
} else if (sType.isBoolean() || sType.isCharSequence() || sType.isChar() || sType.isNumber() || sType.isByteArray()) {
o = convertToType(o, sType);
} else if (sType.isMap()) {
if (dt == MAP) {
Map m = (sType.canCreateNewInstance(outer) ? (Map)sType.newInstance(outer) : newGenericMap(sType));
for (int i = 0; i < length; i++) {
Object key = parseAnything(sType.getKeyType(), is, outer, pMeta);
ClassMeta<?> vt = sType.getValueType();
Object value = parseAnything(vt, is, m, pMeta);
setName(vt, value, key);
m.put(key, value);
}
o = m;
} else {
throw new ParseException(this, "Invalid data type {0} encountered for parse type {1}", dt, sType);
}
} else if (builder != null || sType.canCreateNewBean(outer)) {
if (dt == MAP) {
BeanMap m = builder == null ? newBeanMap(outer, sType.getInnerClass()) : toBeanMap(builder.create(this, eType));
for (int i = 0; i < length; i++) {
String pName = parseAnything(string(), is, m.getBean(false), null);
BeanPropertyMeta bpm = m.getPropertyMeta(pName);
if (bpm == null) {
if (pName.equals(getBeanTypePropertyName(eType)))
parseAnything(string(), is, null, null);
else
onUnknownProperty(pName, m, parseAnything(string(), is, null, null));
} else {
ClassMeta<?> cm = bpm.getClassMeta();
Object value = parseAnything(cm, is, m.getBean(false), bpm);
setName(cm, value, pName);
try {
bpm.set(m, pName, value);
} catch (BeanRuntimeException e) {
onBeanSetterException(pMeta, e);
throw e;
}
}
}
o = builder == null ? m.getBean() : builder.build(this, m.getBean(), eType);
} else {
throw new ParseException(this, "Invalid data type {0} encountered for parse type {1}", dt, sType);
}
} else if (sType.canCreateNewInstanceFromString(outer) && dt == STRING) {
o = sType.newInstanceFromString(outer, o == null ? "" : o.toString());
} else if (sType.isCollection()) {
if (dt == MAP) {
JsonMap m = new JsonMap(this);
for (int i = 0; i < length; i++)
m.put((String)parseAnything(string(), is, outer, pMeta), parseAnything(object(), is, m, pMeta));
o = cast(m, pMeta, eType);
} else if (dt == ARRAY) {
Collection l = (
sType.canCreateNewInstance(outer)
? (Collection)sType.newInstance()
: new JsonList(this)
);
for (int i = 0; i < length; i++)
l.add(parseAnything(sType.getElementType(), is, l, pMeta));
o = l;
} else {
throw new ParseException(this, "Invalid data type {0} encountered for parse type {1}", dt, sType);
}
} else if (sType.isArray() || sType.isArgs()) {
if (dt == MAP) {
JsonMap m = new JsonMap(this);
for (int i = 0; i < length; i++)
m.put((String)parseAnything(string(), is, outer, pMeta), parseAnything(object(), is, m, pMeta));
o = cast(m, pMeta, eType);
} else if (dt == ARRAY) {
Collection l = (
sType.isCollection() && sType.canCreateNewInstance(outer)
? (Collection)sType.newInstance()
: new JsonList(this)
);
for (int i = 0; i < length; i++)
l.add(parseAnything(sType.isArgs() ? sType.getArg(i) : sType.getElementType(), is, l, pMeta));
o = toArray(sType, l);
} else {
throw new ParseException(this, "Invalid data type {0} encountered for parse type {1}", dt, sType);
}
} else if (dt == MAP) {
JsonMap m = new JsonMap(this);
for (int i = 0; i < length; i++)
m.put((String)parseAnything(string(), is, outer, pMeta), parseAnything(object(), is, m, pMeta));
if (m.containsKey(getBeanTypePropertyName(eType)))
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 {
throw new ParseException(this, "Invalid data type {0} encountered for parse type {1}", dt, sType);
}
}
if (swap != null && o != null)
o = unswap(swap, o, eType);
if (outer != null)
setParent(eType, o, outer);
return (T)o;
}