package org.infoobject.openrdf.util;
import org.openrdf.model.*;
import org.openrdf.query.*;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.List;
import java.util.LinkedList;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.repository.Repository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.repository.RepositoryConnection;
/**
*
*/
public class OpenRdfTemplate{
protected Repository repository;
private final ThreadLocal<RepositoryConnection> connection = new ThreadLocal<RepositoryConnection>();
public void setRepository(Repository repository) {
this.repository = repository;
}
public void add(Iterable<Statement> statements) throws RdfException{
RepositoryConnection repositoryConnection = null;
try {
repositoryConnection = getConnection();
repositoryConnection.setAutoCommit(false);
repositoryConnection.add(statements);
} catch (RepositoryException e) {
throw new RdfException(e);
}
}
public void withConnection(ConnectionCallback clb) throws RdfException {
RepositoryConnection cnx = null;
try{
cnx = getConnection();
clb.doInConnection(cnx);
} catch (Exception ex){
throw new RdfException(ex);
}
}
public RepositoryConnection getConnection(){
if (this.connection.get() == null){
try {
this.connection.set(repository.getConnection());
this.connection.get().setAutoCommit(false);
} catch (RepositoryException e) {
throw new IllegalStateException(e);
}
}
return connection.get();
}
/**
*
* @param queryString
* @param mapper
* @return
* @throws RdfException
*/
public<T> List<T> queryList(String queryString, BindingSetMapper<T> mapper) throws RdfException{
RepositoryConnection repositoryConnection = null;
TupleQueryResult result = null;
List<T> objects = new LinkedList<T>();
try{
repositoryConnection = getConnection();
TupleQuery query = repositoryConnection.prepareTupleQuery(QueryLanguage.SPARQL, queryString);
result = query.evaluate();
int row = 0;
while (result.hasNext()){
final T mapped = mapper.map(result.next(), row++);
if (mapped != null){
objects.add(mapped);
}
}
} catch (RepositoryException e) {
throw new RdfException(e);
} catch (MalformedQueryException e) {
throw new RdfException(e);
} catch (QueryEvaluationException e) {
throw new RdfException(e);
} finally{
cleanup(result);
}
return objects;
}
public void commit(){
if (this.connection.get() == null) throw new IllegalStateException("No Connection to commit!");
else {
try {
this.connection.get().commit();
this.connection.get().close();
this.connection.set(null);
} catch (RepositoryException e) {
throw new IllegalStateException(e);
}
}
}
public ValueFactory getValueFactory() {
return repository.getValueFactory();
}
public URI createURI(String s) {
return getValueFactory().createURI(s);
}
public URI createURI(String s, String s1) {
return getValueFactory().createURI(s, s1);
}
public BNode createBNode() {
return getValueFactory().createBNode();
}
public BNode createBNode(String s) {
return getValueFactory().createBNode(s);
}
public Literal createLiteral(String s) {
return getValueFactory().createLiteral(s);
}
public Literal createLiteral(String s, String s1) {
return getValueFactory().createLiteral(s, s1);
}
public Literal createLiteral(String s, URI uri) {
return getValueFactory().createLiteral(s, uri);
}
public Literal createLiteral(boolean b) {
return getValueFactory().createLiteral(b);
}
public Literal createLiteral(byte b) {
return getValueFactory().createLiteral(b);
}
public Literal createLiteral(short i) {
return getValueFactory().createLiteral(i);
}
public Literal createLiteral(int i) {
return getValueFactory().createLiteral(i);
}
public Literal createLiteral(long l) {
return getValueFactory().createLiteral(l);
}
public Literal createLiteral(float v) {
return getValueFactory().createLiteral(v);
}
public Literal createLiteral(double v) {
return getValueFactory().createLiteral(v);
}
public Literal createLiteral(XMLGregorianCalendar xmlGregorianCalendar) {
return getValueFactory().createLiteral(xmlGregorianCalendar);
}
public Statement createStatement(Resource resource, URI uri, Value value) {
return getValueFactory().createStatement(resource, uri, value);
}
public Statement createStatement(Resource resource, URI uri, Value value, Resource resource1) {
return getValueFactory().createStatement(resource, uri, value, resource1);
}
private void cleanup(TupleQueryResult result) {
try{
if (result != null){
result.close();
}
}
catch(Exception ex){
throw new IllegalStateException(ex);
}
}
}