@Nullable
private <T> T getMappedObject(MappedClass mappedClass, ID subject, Class<T> requiredClass, PropertiesMap properties, boolean polymorphic, UID context, boolean bind) {
T instance = null;
if (polymorphic) {
Collection<ID> mappedTypes = findMappedTypes(subject, context, properties.getDirect());
if (!mappedTypes.isEmpty()) {
instance = createInstance(subject, requiredClass, mappedTypes, properties);
} else if (properties.getDirect().containsKey(RDF.rest)) {
Map<String, NODE> values = new HashMap<String, NODE>();
values.put(RDF.rest.ln(), properties.getDirect().get(RDF.rest).iterator().next().getObject());
if (properties.getDirect().containsKey(RDF.first)) {
values.put(RDF.first.ln(), properties.getDirect().get(RDF.first).iterator().next().getObject());
}
listCache.put(subject, values);
} else {
logger.error("got no type for " + subject.getId());
}
} else {
instance = createInstance(subject, requiredClass, Collections.<ID> emptyList(), properties);
}
if (instance != null) {
put(subject, instance);
if (bind) {
bind(mappedClass, subject, instance, properties);
}
}
return instance;
}