package net.fortytwo.sesametools.mappingsail; import info.aduna.iteration.CloseableIteration; import org.openrdf.model.IRI; import org.openrdf.model.Resource; import org.openrdf.model.Statement; import org.openrdf.model.Value; import org.openrdf.model.ValueFactory; import org.openrdf.sail.SailConnection; import org.openrdf.sail.SailException; import org.openrdf.sail.helpers.SailConnectionWrapper; /** * @author Joshua Shinavier (http://fortytwo.net) */ class MappingSailConnection extends SailConnectionWrapper { private final MappingSchema rewriters; private final ValueFactory valueFactory; public MappingSailConnection(final SailConnection baseConnection, final MappingSchema rewriters, final ValueFactory valueFactory) { super(baseConnection); this.rewriters = rewriters; this.valueFactory = valueFactory; } @Override public CloseableIteration<? extends Statement, SailException> getStatements( Resource subj, IRI pred, Value obj, final boolean includeInferred, Resource... contexts) throws SailException { if (subj instanceof IRI) { subj = rewriters.getRewriter( MappingSchema.PartOfSpeech.SUBJECT, MappingSchema.Direction.INBOUND).rewrite((IRI) subj); } pred = rewriters.getRewriter( MappingSchema.PartOfSpeech.PREDICATE, MappingSchema.Direction.INBOUND).rewrite(pred); if (obj instanceof IRI) { obj = rewriters.getRewriter( MappingSchema.PartOfSpeech.OBJECT, MappingSchema.Direction.INBOUND).rewrite((IRI) obj); } for (int i = 0; i < contexts.length; i++) { if (contexts[i] instanceof IRI) { contexts[i] = rewriters.getRewriter( MappingSchema.PartOfSpeech.CONTEXT, MappingSchema.Direction.INBOUND).rewrite((IRI) contexts[i]); } } return new RewritingStatementIteration( this.getWrappedConnection().getStatements(subj, pred, obj, includeInferred, contexts)); } private class RewritingStatementIteration implements CloseableIteration<Statement, SailException> { private final CloseableIteration<? extends Statement, SailException> baseIteration; public RewritingStatementIteration(final CloseableIteration<? extends Statement, SailException> baseIteration) { this.baseIteration = baseIteration; } public void close() throws SailException { baseIteration.close(); } public boolean hasNext() throws SailException { return baseIteration.hasNext(); } public Statement next() throws SailException { Statement st = baseIteration.next(); Resource subject = st.getSubject(); IRI predicate = st.getPredicate(); Value object = st.getObject(); Resource context = st.getContext(); if (subject instanceof IRI) { subject = rewriters.getRewriter( MappingSchema.PartOfSpeech.SUBJECT, MappingSchema.Direction.OUTBOUND) .rewrite((IRI) subject); } predicate = rewriters.getRewriter( MappingSchema.PartOfSpeech.PREDICATE, MappingSchema.Direction.OUTBOUND) .rewrite(predicate); if (object instanceof IRI) { object = rewriters.getRewriter( MappingSchema.PartOfSpeech.OBJECT, MappingSchema.Direction.OUTBOUND) .rewrite((IRI) object); } if (null != context && context instanceof IRI) { context = rewriters.getRewriter( MappingSchema.PartOfSpeech.CONTEXT, MappingSchema.Direction.OUTBOUND) .rewrite((IRI) context); } return valueFactory.createStatement(subject, predicate, object, context); } public void remove() throws SailException { baseIteration.remove(); } } }