package com.mysema.rdfbean.sparql;
import java.io.IOException;
import java.io.Writer;
import java.util.Map;
import com.mysema.commons.fluxml.XMLWriter;
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 XMLResultProducer extends AbstractResultProducer {
private static final String SPARQL_NS = "http://www.w3.org/2005/sparql-results#";
@Override
public void stream(SPARQLQuery query, Writer w) throws IOException {
XMLWriter writer = new XMLWriter(w);
if (query.getResultType().equals(SPARQLQuery.ResultType.BOOLEAN)) {
streamBoolean(query, writer);
} else {
streamTuple(query, writer);
}
}
private void streamBoolean(SPARQLQuery query, XMLWriter writer) throws IOException {
writer.begin("sparql");
writer.attribute("xmlns", SPARQL_NS);
writer.element("head");
writer.begin("results");
writer.element("boolean", query.getBoolean());
writer.end("results");
writer.end("sparql");
}
private void streamTuple(SPARQLQuery query, XMLWriter writer) throws IOException {
writer.begin("sparql");
writer.attribute("xmlns", SPARQL_NS);
writer.begin("head");
for (String var : query.getVariables()) {
writer.begin("variable").attribute("name", var).end("variable");
}
writer.end("head");
writer.begin("results");
CloseableIterator<Map<String, NODE>> rows = query.getTuples();
while (rows.hasNext()) {
Map<String, NODE> row = rows.next();
writer.begin("result");
for (Map.Entry<String, NODE> entry : row.entrySet()) {
writer.begin("binding").attribute("name", entry.getKey());
String type = getNodeType(entry.getValue());
writer.begin(type);
if (entry.getValue().isLiteral()) {
LIT literal = entry.getValue().asLiteral();
if (literal.getLang() != null) {
writer.attribute("xml:lang", LocaleUtil.toLang(literal.getLang()));
} else if (!literal.getDatatype().equals(RDF.text)) {
writer.attribute("datatype", literal.getDatatype().getValue());
}
}
writer.print(entry.getValue().getValue());
writer.end(type);
writer.end("binding");
}
writer.end("result");
}
writer.end("results");
writer.end("sparql");
}
}