package eu.lod2.rsine.changesetstore;
import org.openrdf.OpenRDFException;
import org.openrdf.model.Graph;
import org.openrdf.model.Statement;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.repository.Repository;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFHandlerException;
import org.openrdf.rio.turtle.TurtleWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
@Component
public class ChangeSetStore {
private final Logger logger = LoggerFactory.getLogger(ChangeSetStore.class);
@Autowired
private Repository changeSetRepo;
public synchronized void persistChangeSet(Graph changeSet) throws RepositoryException {
RepositoryConnection repCon = changeSetRepo.getConnection();
repCon.add(changeSet);
repCon.close();
logger.debug("created changeset: " +formatChangeSet(changeSet));
}
private String formatChangeSet(Graph changeSet) {
StringWriter sw = new StringWriter();
TurtleWriter turtleWriter = new TurtleWriter(sw);
try {
turtleWriter.startRDF();
Iterator<Statement> statementIterator = changeSet.iterator();
while (statementIterator.hasNext()) {
turtleWriter.handleStatement(statementIterator.next());
}
turtleWriter.endRDF();
}
catch (RDFHandlerException e) {
return "Could not format changeset";
}
return sw.toString();
}
public synchronized Collection<BindingSet> evaluateQuery(String query) throws OpenRDFException {
Collection<BindingSet> bindingSets = new ArrayList<BindingSet>();
RepositoryConnection repCon = changeSetRepo.getConnection();
try {
TupleQueryResult result = repCon.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate();
while (result.hasNext()) {
bindingSets.add(result.next());
}
result.close();
return bindingSets;
}
finally {
repCon.close();
}
}
}