@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; }
private MappedClass resolveMappedClass(MappedClass mappedClass, PropertiesMap properties) { for (STMT stmt : properties.getDirect().get(RDF.type)) { if (stmt.getObject().isURI()) { List<MappedClass> mappedClasses = configuration.getMappedClasses(stmt.getObject().asURI()); for (MappedClass mc : mappedClasses) { if (!mc.equals(mappedClass) && mappedClass.getJavaClass().isAssignableFrom(mc.getJavaClass())) { return mc; } } } } return mappedClass; }
private Set<NODE> findPathValues(ID resource, MappedPath path, int index, PropertiesMap properties, UID context) { MappedPredicate predicate = path.get(index); if (predicate.getContext() != null) { context = predicate.getContext(); } Set<NODE> values; if (!predicate.inv() && properties.getDirect() != null) { values = findValues(predicate.getUID(), properties.getDirect(), context, predicate.inv()); } else if (predicate.inv() && properties.getInverse() != null) { values = findValues(predicate.getUID(), properties.getInverse(), null, predicate.inv()); } else { values = findValues(resource, predicate.getUID(), predicate.inv(), predicate.includeInferred(), context); } if (path.size() > index + 1) { Set<NODE> nestedValues = new LinkedHashSet<NODE>(); for (NODE value : values) { if (value.isResource()) { nestedValues.addAll(findPathValues((ID) value, path, index + 1, new PropertiesMap(null, null), context)); } } return nestedValues; } return values; }
bindDynamicProperties(subject, properties.getDirect(), beanMap, mappedClass);