package net.fortytwo.sesametools;
import info.aduna.iteration.CloseableIteration;
import org.openrdf.model.IRI;
import org.openrdf.model.Namespace;
import org.openrdf.model.Resource;
import org.openrdf.model.Statement;
import org.openrdf.model.Value;
import org.openrdf.query.BindingSet;
import org.openrdf.query.Dataset;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.algebra.TupleExpr;
import org.openrdf.query.impl.SimpleDataset;
import org.openrdf.sail.Sail;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.sail.helpers.AbstractSail;
import org.openrdf.sail.helpers.AbstractSailConnection;
/**
* A SailConnection which treats the wildcard context as a single, specific context,
* and disallows read and write access to all other contexts, including the default context.
* Namespaces may be set and retrieved without restriction.
*
* @author Joshua Shinavier (http://fortytwo.net)
*/
class SingleContextSailConnection extends AbstractSailConnection {
private SailConnection baseSailConnection;
private Resource singleContext;
public SingleContextSailConnection(final AbstractSail sail,
final Sail baseSail,
final Resource context) throws SailException {
super(sail);
baseSailConnection = baseSail.getConnection();
singleContext = context;
}
protected void addStatementInternal(final Resource subj, final IRI pred, final Value obj,
final Resource... contexts) throws SailException {
if (0 == contexts.length) {
baseSailConnection.addStatement(subj, pred, obj, singleContext);
} else {
for (Resource context : contexts) {
if (null != context && context.equals(singleContext)) {
baseSailConnection.addStatement(subj, pred, obj, singleContext);
break;
}
}
}
}
protected void clearInternal(final Resource... contexts) throws SailException {
if (0 == contexts.length) {
baseSailConnection.clear(singleContext);
} else {
for (Resource context : contexts) {
if (null != context && context.equals(singleContext)) {
baseSailConnection.clear(singleContext);
break;
}
}
}
}
protected void clearNamespacesInternal() throws SailException {
baseSailConnection.clearNamespaces();
}
protected void startTransactionInternal() throws SailException {
baseSailConnection.begin();
}
protected void closeInternal() throws SailException {
baseSailConnection.close();
}
protected void commitInternal() throws SailException {
baseSailConnection.commit();
}
protected CloseableIteration<? extends BindingSet, QueryEvaluationException> evaluateInternal(
final TupleExpr tupleExpr,
final Dataset dataSet,
final BindingSet bindingSet,
final boolean includeInferred) throws SailException {
// ignore the given dataset and restrict everything to the single context we have been setup with
SimpleDataset singleContextDataset = new SimpleDataset();
if (singleContext instanceof IRI) {
singleContextDataset.setDefaultInsertGraph((IRI) singleContext);
singleContextDataset.addDefaultGraph((IRI) singleContext);
singleContextDataset.addNamedGraph((IRI) singleContext);
singleContextDataset.addDefaultRemoveGraph((IRI) singleContext);
}
return baseSailConnection.evaluate(tupleExpr, singleContextDataset, bindingSet, includeInferred);
}
/*
public void executeUpdate(final UpdateExpr updateExpr, final Dataset dataSet, final BindingSet bindingSet,
final boolean includeInferred) throws SailException {
// ignore the given dataset and restrict everything to the single context we have been setup with
DatasetImpl singleContextDataset = new DatasetImpl();
if (singleContext instanceof URI) {
singleContextDataset.setDefaultInsertGraph((IRI) singleContext);
singleContextDataset.addDefaultGraph((IRI) singleContext);
singleContextDataset.addNamedGraph((IRI) singleContext);
singleContextDataset.addDefaultRemoveGraph((IRI) singleContext);
}
baseSailConnection.executeUpdate(updateExpr, singleContextDataset, bindingSet, includeInferred);
}*/
protected CloseableIteration<? extends Resource, SailException> getContextIDsInternal()
throws SailException {
return new SingleContextIteration();
}
protected String getNamespaceInternal(final String prefix) throws SailException {
return baseSailConnection.getNamespace(prefix);
}
protected CloseableIteration<? extends Namespace, SailException> getNamespacesInternal()
throws SailException {
return baseSailConnection.getNamespaces();
}
protected CloseableIteration<? extends Statement, SailException> getStatementsInternal(
final Resource subj,
final IRI pred,
final Value obj,
final boolean includeInferred,
final Resource... contexts) throws SailException {
if (0 == contexts.length) {
return baseSailConnection.getStatements(subj, pred, obj, includeInferred, singleContext);
} else {
for (Resource context : contexts) {
if (null != context && context.equals(singleContext)) {
return baseSailConnection.getStatements(subj, pred, obj, includeInferred, singleContext);
}
}
return new EmptyCloseableIteration<>();
}
}
protected void removeNamespaceInternal(final String prefix) throws SailException {
baseSailConnection.removeNamespace(prefix);
}
protected void removeStatementsInternal(final Resource subj, final IRI pred, final Value obj,
final Resource... contexts) throws SailException {
if (0 == contexts.length) {
baseSailConnection.removeStatements(subj, pred, obj, singleContext);
} else {
for (Resource context : contexts) {
if (null != context && context.equals(singleContext)) {
baseSailConnection.removeStatements(subj, pred, obj, singleContext);
break;
}
}
}
}
protected void rollbackInternal() throws SailException {
baseSailConnection.rollback();
}
protected void setNamespaceInternal(final String prefix, final String name) throws SailException {
baseSailConnection.setNamespace(prefix, name);
}
protected long sizeInternal(final Resource... contexts) throws SailException {
if (0 == contexts.length) {
return baseSailConnection.size(singleContext);
} else {
for (Resource context : contexts) {
if (null != context && context.equals(singleContext)) {
return baseSailConnection.size(singleContext);
}
}
return 0;
}
}
private class SingleContextIteration implements CloseableIteration<Resource, SailException> {
private Resource nextContext;
public SingleContextIteration() {
nextContext = singleContext;
}
public void close() throws SailException {
}
public boolean hasNext() throws SailException {
return null != nextContext;
}
public Resource next() throws SailException {
Resource r = nextContext;
nextContext = null;
return r;
}
public void remove() throws SailException {
}
}
}