package org.openprovenance.prov.rdf;
import org.openprovenance.prov.model.ProvFactory;
import org.openprovenance.prov.model.QualifiedName;
import org.openprovenance.prov.model.NamespacePrefixMapper;
import org.openprovenance.prov.model.QualifiedNameUtils;
import org.openrdf.model.Resource;
import org.openrdf.model.impl.BNodeImpl;
import org.openrdf.model.impl.LiteralImpl;
import org.openrdf.model.impl.StatementImpl;
import org.openrdf.model.impl.URIImpl;
import org.openrdf.repository.contextaware.ContextAwareRepository;
/** This class is a Sesame-based rdf graph builder. Ideally, it should
* be abstracted in a generic interface and specific implementations that
* are based on sesame/jena/other
*/
/**
* @author lavm
*
*/
public class SesameGraphBuilder implements GraphBuilder<Resource,LiteralImpl,org.openrdf.model.Statement> {
final ContextAwareRepository manager;
private final ProvFactory pFactory;
final QualifiedNameUtils qnU;
public SesameGraphBuilder(ContextAwareRepository manager, ProvFactory pFactory) {
this.manager = manager;
this.pFactory=pFactory;
this.qnU=new QualifiedNameUtils();
}
/* (non-Javadoc)
* @see org.openprovenance.prov.rdf.GraphBuilder#assertStatement(org.openrdf.model.Statement)
*/
@Override
public void assertStatement(org.openrdf.model.Statement stmnt) {
try {
if (currentContext==null) {
manager.getConnection().add(stmnt);
} else {
manager.getConnection().add(stmnt, currentContext);
}
} catch (org.openrdf.repository.RepositoryException e) {
}
}
/* (non-Javadoc)
* @see org.openprovenance.prov.rdf.GraphBuilder#createDataProperty(java.lang.Object, org.openprovenance.prov.model.QualifiedName, java.lang.Object)
*/
@Override
public org.openrdf.model.Statement createDataProperty(org.openrdf.model.Resource r,
QualifiedName pred,
LiteralImpl literalImpl) {
return new StatementImpl(r, qualifiedNameToURI(pred), literalImpl);
}
/* (non-Javadoc)
* @see org.openprovenance.prov.rdf.GraphBuilder#createDataProperty(org.openprovenance.prov.model.QualifiedName, org.openprovenance.prov.model.QualifiedName, java.lang.Object)
*/
@Override
public org.openrdf.model.Statement createDataProperty(QualifiedName subject,
QualifiedName pred,
LiteralImpl literalImpl) {
return createDataProperty(qualifiedNameToResource(subject), pred, literalImpl);
}
/* (non-Javadoc)
* @see org.openprovenance.prov.rdf.GraphBuilder#createObjectProperty(java.lang.Object, org.openprovenance.prov.model.QualifiedName, org.openprovenance.prov.model.QualifiedName)
*/
@Override
public org.openrdf.model.Statement createObjectProperty(org.openrdf.model.Resource r,
QualifiedName pred,
QualifiedName object) {
return new StatementImpl(r, qualifiedNameToURI(pred), qualifiedNameToURI(object));
}
/* (non-Javadoc)
* @see org.openprovenance.prov.rdf.GraphBuilder#createObjectProperty(org.openprovenance.prov.model.QualifiedName, org.openprovenance.prov.model.QualifiedName, org.openprovenance.prov.model.QualifiedName)
*/
@Override
public org.openrdf.model.Statement createObjectProperty(QualifiedName subject,
QualifiedName pred,
QualifiedName object) {
return new StatementImpl(qualifiedNameToResource(subject),
qualifiedNameToURI(pred),
qualifiedNameToResource(object));
}
/* (non-Javadoc)
* @see org.openprovenance.prov.rdf.GraphBuilder#qualifiedNameToURI(org.openprovenance.prov.model.QualifiedName)
*/
@Override
public URIImpl qualifiedNameToURI(QualifiedName name) {
String unescapedLocalName = qnU.unescapeProvLocalName(name.getLocalPart());
return new URIImpl(name.getNamespaceURI() + unescapedLocalName);
}
/* (non-Javadoc)
* @see org.openprovenance.prov.rdf.GraphBuilder#qualifiedNameToResource(org.openprovenance.prov.model.QualifiedName)
*/
@Override
public Resource qualifiedNameToResource(QualifiedName name) {
String unescapedLocalName = qnU.unescapeProvLocalName(name.getLocalPart());
if (isBlankName(name)) {
return new BNodeImpl(unescapedLocalName);
} else {
return new URIImpl(name.getNamespaceURI() + unescapedLocalName);
}
}
boolean isBlankName(QualifiedName name) {
return name.getNamespaceURI().equals(NamespacePrefixMapper.TOOLBOX_NS)
&& name.getPrefix().equals("_");
}
static int blankCounter = 0;
/* (non-Javadoc)
* @see org.openprovenance.prov.rdf.GraphBuilder#newBlankName()
*/
@Override
public QualifiedName newBlankName() {
blankCounter++;
return newToolboxQualifiedName("blank" + blankCounter);
}
public QualifiedName newToolboxQualifiedName(String local) {
return pFactory.newQualifiedName(NamespacePrefixMapper.TOOLBOX_NS, local, "_");
}
public void setContext() {
currentContext=null;
}
private Resource currentContext=null;
public void setContext(Resource uri) {
currentContext=uri;
}
@Override
public LiteralImpl newLiteral(String value, QualifiedName type) {
return new LiteralImpl(value,
qualifiedNameToURI(type));
}
@Override
public LiteralImpl newLiteral(String value, String lang) {
return new LiteralImpl(value,lang);
}
}