in juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java [380:521]
private <T> T parseAnything(ClassMeta<?> eType, RDFNode n, Object outer, BeanPropertyMeta pMeta) throws ParseException {
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(), n, outer, pMeta));
setCurrentClass(sType);
if (! sType.canCreateNewInstance(outer)) {
if (n.isResource()) {
Statement st = n.asResource().getProperty(pType);
if (st != null) {
String c = st.getLiteral().getString();
ClassMeta tcm = getClassMeta(c, pMeta, eType);
if (tcm != null)
sType = eType = tcm;
}
}
}
Object o = null;
if (n.isResource() && n.asResource().getURI() != null && n.asResource().getURI().equals(RDF_NIL)) {
// Do nothing. Leave o == null.
} else if (sType.isObject()) {
if (n.isLiteral()) {
o = n.asLiteral().getValue();
if (o instanceof String) {
o = decodeString(o);
}
}
else if (n.isResource()) {
Resource r = n.asResource();
if (! urisVisited.add(r))
o = r.getURI();
else if (r.getProperty(pValue) != null) {
o = parseAnything(object(), n.asResource().getProperty(pValue).getObject(), outer, null);
} else if (isSeq(r)) {
o = new JsonList(this);
parseIntoCollection(r.as(Seq.class), (Collection)o, sType, pMeta);
} else if (isBag(r)) {
o = new JsonList(this);
parseIntoCollection(r.as(Bag.class), (Collection)o, sType, pMeta);
} else if (r.canAs(RDFList.class)) {
o = new JsonList(this);
parseIntoCollection(r.as(RDFList.class), (Collection)o, sType, pMeta);
} else {
// If it has a URI and no child properties, we interpret this as an
// external resource, and convert it to just a URL.
String uri = r.getURI();
if (uri != null && ! r.listProperties().hasNext()) {
o = r.getURI();
} else {
JsonMap m2 = new JsonMap(this);
parseIntoMap(r, m2, null, null, pMeta);
o = cast(m2, pMeta, eType);
}
}
} else {
throw new ParseException(this, "Unrecognized node type ''{0}'' for object", n);
}
} else if (sType.isBoolean()) {
o = convertToType(getValue(n, outer), boolean.class);
} else if (sType.isCharSequence()) {
o = decodeString(getValue(n, outer));
} else if (sType.isChar()) {
o = parseCharacter(decodeString(getValue(n, outer)));
} else if (sType.isNumber()) {
o = parseNumber(getValue(n, outer).toString(), (Class<? extends Number>)sType.getInnerClass());
} else if (sType.isMap()) {
Resource r = n.asResource();
if (! urisVisited.add(r))
return null;
Map m = (sType.canCreateNewInstance(outer) ? (Map)sType.newInstance(outer) : newGenericMap(sType));
o = parseIntoMap(r, m, eType.getKeyType(), eType.getValueType(), pMeta);
} else if (sType.isCollectionOrArray() || sType.isArgs()) {
if (sType.isArray() || sType.isArgs())
o = list();
else
o = (sType.canCreateNewInstance(outer) ? (Collection<?>)sType.newInstance(outer) : new JsonList(this));
Resource r = n.asResource();
if (! urisVisited.add(r))
return null;
if (isSeq(r)) {
parseIntoCollection(r.as(Seq.class), (Collection)o, sType, pMeta);
} else if (isBag(r)) {
parseIntoCollection(r.as(Bag.class), (Collection)o, sType, pMeta);
} else if (r.canAs(RDFList.class)) {
parseIntoCollection(r.as(RDFList.class), (Collection)o, sType, pMeta);
} else {
throw new ParseException(this, "Unrecognized node type ''{0}'' for collection", n);
}
if (sType.isArray() || sType.isArgs())
o = toArray(sType, (Collection)o);
} else if (builder != null) {
Resource r = n.asResource();
if (! urisVisited.add(r))
return null;
BeanMap<?> bm = toBeanMap(builder.create(this, eType));
o = builder.build(this, parseIntoBeanMap(r, bm).getBean(), eType);
} else if (sType.canCreateNewBean(outer)) {
Resource r = n.asResource();
if (! urisVisited.add(r))
return null;
BeanMap<?> bm = newBeanMap(outer, sType.getInnerClass());
o = parseIntoBeanMap(r, bm).getBean();
} else if (sType.isUri() && n.isResource()) {
o = sType.newInstanceFromString(outer, decodeString(n.asResource().getURI()));
} else if (sType.canCreateNewInstanceFromString(outer)) {
o = sType.newInstanceFromString(outer, decodeString(getValue(n, outer)));
} else if (n.isResource()) {
Resource r = n.asResource();
Map m = newGenericMap(sType);
parseIntoMap(r, m, sType.getKeyType(), sType.getValueType(), pMeta);
if (m.containsKey(getBeanTypePropertyName(eType)))
o = cast((JsonMap)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, "Class ''{0}'' could not be instantiated. Reason: ''{1}''", sType.getInnerClass().getName(), sType.getNotABeanReason());
}
if (swap != null && o != null)
o = unswap(swap, o, eType);
if (outer != null)
setParent(eType, o, outer);
return (T)o;
}