package org.aksw.jena_sparql_api.mapper.model;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.function.BiFunction;
import org.aksw.jena_sparql_api.beans.model.PropertyOps;
import org.aksw.jena_sparql_api.concepts.Relation;
import org.aksw.jena_sparql_api.concepts.RelationUtils;
import org.aksw.jena_sparql_api.mapper.impl.type.EntityFragment;
import org.aksw.jena_sparql_api.mapper.impl.type.PathFragment;
import org.aksw.jena_sparql_api.mapper.impl.type.PlaceholderInfo;
import org.aksw.jena_sparql_api.mapper.impl.type.PopulationTask;
import org.aksw.jena_sparql_api.mapper.impl.type.ResourceFragment;
import org.aksw.jena_sparql_api.shape.ResourceShapeBuilder;
import org.apache.jena.graph.Node;
import org.apache.jena.rdf.model.Property;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.Statement;
public class RdfMapperPropertySingle
extends RdfMapperPropertyBase
{
public RdfMapperPropertySingle(
PropertyOps propertyOps,
Property predicate,
RdfType targetRdfType,
BiFunction<Object, Object, Node> createTargetIri) { // String fetchMode) {
super(propertyOps, predicate, targetRdfType, createTargetIri);
}
@Override
public void exposeFragment(ResourceFragment out, Resource priorState, Object entity) {
// TODO Auto-generated method stub
super.exposeFragment(out, priorState, entity);
}
//
// @Override
// public void emitTriples(RdfEmitterContext emitterContext, Object entity, Node subject, Graph shapeGraph, Consumer<Triple> outSink) {
// Object value = propertyOps.getValue(entity);
//
// if(value != null) {
// Supplier<Node> defaultNodeGenerator = createTargetNode == null
// ? null
// : () -> createTargetNode.apply(entity, value);
//
// Node o = emitterContext.requestResolution(value);//, targetRdfType, defaultNodeGenerator);
// Triple t = new Triple(subject, predicate, o);
// outSink.accept(t);
//
// // maybe we should write triples to the emitter context, as references
// // need to be resolved anyway
// //emitterContext.accept(t);
// }
// }
@Override
public void populate(EntityFragment out, Resource shape, Object entity) {
Statement stmt = shape.getProperty(predicate);
RDFNode o = stmt == null ? null : stmt.getObject();
List<PlaceholderInfo> pis = Arrays.asList(new PlaceholderInfo(null, targetRdfType, entity, null, propertyOps, null, o, this));
//out.getPropertyInfos().put(key, value);
out.getTasks().add(new PopulationTask() {
@Override
public List<PlaceholderInfo> getPlaceholders() {
return pis;
}
@Override
public Collection<PopulationTask> resolve(List<Object> resolutions) {
propertyOps.setValue(entity, resolutions.get(0));
return Collections.emptyList();
}
});
}
// @Override
// public void populateEntity(RdfPersistenceContext persistenceContext, Object entity, Graph inGraph, Node subject, Consumer<Triple> outSink) {
// List<Triple> triples = inGraph.find(subject, predicate, Node.ANY).toList();
//
// Triple t = Iterables.getFirst(triples, null);
//
// Node node;
// if(t != null) {
// node = t.getObject();
// outSink.accept(t);
// } else {
// node = null;
// }
//
// if(node == null) {
// if(createTargetNode != null) {
// Object childEntity = propertyOps.getValue(entity);
// if(childEntity != null) {
// node = createTargetNode.apply(entity, childEntity);
// }
// }
// }
//
// if(node != null) {
// persistenceContext.requestResolution(propertyOps, entity, node);
// }
//
// //persistenceContext.requestResolution(entity, propertyOps, subject, rdfType);
//
//
//// Object value = node == null
//// ? null
//// : persistenceContext.entityFor(new TypedNode(targetRdfType, node))
//// ;//rdfType.createJavaObject(node);
////
////
//// // We cannot set property values of primitive types to null
//// Class<?> valueType = propertyOps.getType();
//// if(value == null && valueType.isPrimitive()) {
//// value = Defaults.defaultValue(valueType);
//// }
//// propertyOps.setValue(entity, value);
// }
//
@Override
public void exposeShape(ResourceShapeBuilder shapeBuilder) {
shapeBuilder.out(predicate);
// ResourceShapeBuilder targetShape = shapeBuilder.outgoing(predicate);
// if("eager".equals(fetchMode)) {
// targetRdfType.build(targetShape);
// }
}
@Override
public String toString() {
return "RdfPopulatorPropertySingle [propertyName=" + propertyOps.getName()
+ ", predicate=" + predicate + ", targetRdfType="
+ targetRdfType + "]";
}
@Override
public PropertyOps getPropertyOps() {
return propertyOps;
}
@Override
public PathFragment resolve(String propertyName) {
PathFragment result = this.propertyOps.getName().equals(propertyName)
? new PathFragment(RelationUtils.createRelation(predicate.asNode(), false), propertyOps.getType(), targetRdfType, null)
: null;
return result;
}
// @Override
// public Object readPropertyValue(Graph graph, Node subject) {
// // TODO Auto-generated method stub
// return null;
// }
}