package com.mysema.rdfbean.sparql;
import java.io.IOException;
import java.io.Writer;
import java.util.Map;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import com.mysema.commons.l10n.support.LocaleUtil;
import com.mysema.commons.lang.CloseableIterator;
import com.mysema.rdfbean.model.LIT;
import com.mysema.rdfbean.model.NODE;
import com.mysema.rdfbean.model.RDF;
import com.mysema.rdfbean.model.SPARQLQuery;
/**
* @author tiwe
*
*/
public class JSONResultProducer extends AbstractResultProducer {
private final JsonFactory jsonFactory = new JsonFactory();
@Override
public void stream(SPARQLQuery query, Writer writer) throws IOException {
JsonGenerator generator = jsonFactory.createJsonGenerator(writer);
if (query.getResultType().equals(SPARQLQuery.ResultType.BOOLEAN)) {
streamBoolean(query, generator);
} else {
streamTuple(query, generator);
}
generator.flush();
}
private void streamBoolean(SPARQLQuery query, JsonGenerator generator) throws IOException {
generator.writeStartObject();
generator.writeNullField("head");
generator.writeBooleanField("boolean", query.getBoolean());
generator.writeEndObject();
}
private void streamTuple(SPARQLQuery query, JsonGenerator generator) throws IOException {
generator.writeStartObject();
generator.writeObjectFieldStart("head");
generator.writeArrayFieldStart("vars");
for (String var : query.getVariables()) {
generator.writeString(var);
}
generator.writeEndArray(); // vars
generator.writeEndObject(); // head
generator.writeObjectFieldStart("results");
generator.writeArrayFieldStart("bindings");
CloseableIterator<Map<String, NODE>> rows = query.getTuples();
while (rows.hasNext()) {
Map<String, NODE> row = rows.next();
generator.writeStartObject();
for (Map.Entry<String, NODE> entry : row.entrySet()) {
generator.writeObjectFieldStart(entry.getKey());
generator.writeStringField("type", getNodeType(entry.getValue()));
if (entry.getValue().isLiteral()) {
LIT literal = entry.getValue().asLiteral();
if (literal.getLang() != null) {
generator.writeStringField("xml:lang", LocaleUtil.toLang(literal.getLang()));
} else if (!literal.getDatatype().equals(RDF.text)) {
generator.writeStringField("datatype", literal.getDatatype().getValue());
}
}
generator.writeStringField("value", entry.getValue().getValue());
generator.writeEndObject();
}
generator.writeEndObject();
}
rows.close();
generator.writeEndArray(); // bindings
generator.writeEndObject(); // results
generator.writeEndObject(); // root
}
}