package com.mysema.rdfbean.sesame;
import java.io.Writer;
import java.util.List;
import java.util.Map;
import org.openrdf.model.Model;
import org.openrdf.model.Statement;
import org.openrdf.model.util.ModelOrganizer;
import org.openrdf.query.GraphQuery;
import org.openrdf.result.GraphResult;
import org.openrdf.rio.RDFFormat;
import org.openrdf.rio.RDFHandlerException;
import org.openrdf.rio.RDFWriter;
import org.openrdf.rio.Rio;
import org.openrdf.store.StoreException;
import com.mysema.commons.lang.CloseableIterator;
import com.mysema.rdfbean.model.NODE;
import com.mysema.rdfbean.model.RepositoryException;
import com.mysema.rdfbean.model.SPARQLQuery;
import com.mysema.rdfbean.model.STMT;
/**
* @author tiwe
*
*/
public class GraphQueryImpl implements SPARQLQuery {
private final SesameDialect dialect;
private final GraphQuery graphQuery;
public GraphQueryImpl(GraphQuery graphQuery, SesameDialect dialect) {
this.graphQuery = graphQuery;
this.dialect = dialect;
}
@Override
public boolean getBoolean() {
throw new UnsupportedOperationException();
}
@Override
public ResultType getResultType() {
return ResultType.TRIPLES;
}
@Override
public CloseableIterator<STMT> getTriples() {
try {
return new GraphResultIterator(graphQuery.evaluate(), dialect);
} catch (StoreException e) {
throw new RepositoryException(e);
}
}
@Override
public CloseableIterator<Map<String, NODE>> getTuples() {
throw new UnsupportedOperationException();
}
@Override
public List<String> getVariables() {
throw new UnsupportedOperationException();
}
@Override
public void streamTriples(Writer writer, String contentType) {
try {
GraphResult result = graphQuery.evaluate();
Model model = result.asModel();
model = new ModelOrganizer(model).organize();
RDFFormat targetFormat = RDFFormat.forMIMEType(contentType);
if (targetFormat == null) {
targetFormat = RDFFormat.RDFXML;
}
RDFWriter rdfWriter = Rio.createWriter(targetFormat, writer);
rdfWriter.startRDF();
for (String prefix : model.getNamespaces().keySet()) {
rdfWriter.handleNamespace(prefix, model.getNamespace(prefix));
}
for (Statement st : model) {
rdfWriter.handleStatement(st);
}
rdfWriter.endRDF();
} catch (StoreException e) {
throw new RepositoryException(e);
} catch (RDFHandlerException e) {
throw new RepositoryException(e);
}
}
@Override
public void setBinding(String variable, NODE node) {
graphQuery.setBinding(variable, dialect.getNode(node));
}
@Override
public void setMaxQueryTime(int secs) {
graphQuery.setMaxQueryTime(secs);
}
}