package com.mysema.rdfbean.jena;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;
import com.hp.hpl.jena.n3.N3TurtleJenaWriter;
import com.hp.hpl.jena.n3.turtle.TurtleReader;
import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.rdf.arp.JenaReader;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.RDFReader;
import com.hp.hpl.jena.rdf.model.RDFWriter;
import com.hp.hpl.jena.rdf.model.impl.NTripleWriter;
import com.hp.hpl.jena.sparql.core.DatasetGraph;
import com.hp.hpl.jena.xmloutput.impl.Basic;
import com.mysema.commons.lang.Assert;
import com.mysema.rdfbean.Namespaces;
import com.mysema.rdfbean.model.Format;
import com.mysema.rdfbean.model.RDFConnectionCallback;
import com.mysema.rdfbean.model.RDFConnection;
import com.mysema.rdfbean.model.Repository;
import com.mysema.rdfbean.model.RepositoryException;
import com.mysema.rdfbean.model.UID;
import com.mysema.rdfbean.model.io.RDFSource;
/**
* @author tiwe
*
*/
public class JenaRepository implements Repository {
protected final DatasetGraph graph;
protected final Dataset dataset;
private final JenaDialect dialect = new JenaDialect();
private RDFSource[] sources;
private boolean initialized = false;
public JenaRepository(DatasetGraph graph, Dataset dataset) {
this.graph = graph;
this.dataset = dataset;
}
public JenaRepository(Dataset dataset) {
this.graph = dataset.asDatasetGraph();
this.dataset = dataset;
}
@Override
public void close() {
graph.close();
}
@Override
public <RT> RT execute(RDFConnectionCallback<RT> operation) {
RDFConnection connection = openConnection();
try {
// if (graph.getTransactionHandler().transactionsSupported()){
// RDFBeanTransaction tx = connection.beginTransaction(false,
// RDFBeanTransaction.TIMEOUT,
// RDFBeanTransaction.ISOLATION);
// try{
// RT retVal = operation.execute(connection);
// tx.commit();
// return retVal;
// }catch(IOException io){
// tx.rollback();
// throw new RepositoryException(io);
// }
// }else{
try {
return operation.doInConnection(connection);
} catch (IOException io) {
throw new RepositoryException(io);
}
// }
} finally {
connection.close();
}
}
@Override
public void export(Format format, Map<String, String> ns2prefix, UID context, OutputStream os) {
RDFWriter writer;
if (format == Format.RDFXML) {
Basic w = new Basic();
for (Map.Entry<String, String> entry : ns2prefix.entrySet()) {
w.setNsPrefix(entry.getValue(), entry.getKey());
}
writer = w;
} else if (format == Format.NTRIPLES) {
writer = new NTripleWriter();
} else if (format == Format.TURTLE || format == Format.N3) {
writer = new N3TurtleJenaWriter();
} else {
throw new IllegalArgumentException(format.toString());
}
if (context != null) {
writer.write(dataset.getNamedModel(context.getId()), os, null);
} else {
// TODO : export also other models
writer.write(dataset.getDefaultModel(), os, null);
}
}
@Override
public void export(Format format, UID context, OutputStream os) {
export(format, Namespaces.DEFAULT, context, os);
}
@Override
public void initialize() {
if (!initialized) {
if (sources != null) {
try {
for (RDFSource source : sources) {
load(source.getFormat(), source.openStream(), new UID(source.getContext()), false);
}
} catch (IOException e) {
throw new RepositoryException(e);
}
}
initialized = true;
}
}
@Override
public void load(Format format, InputStream is, UID context, boolean replace) {
RDFReader reader;
if (format == Format.RDFXML) {
reader = new JenaReader();
} else if (format == Format.TURTLE || format == Format.NTRIPLES) {
reader = new TurtleReader();
} else {
throw new IllegalArgumentException(format.toString());
}
Model model = context == null ? dataset.getDefaultModel() : dataset.getNamedModel(context.getId());
Assert.notNull(model, "model");
reader.read(model, is, context != null ? context.getId() : null);
}
@Override
public RDFConnection openConnection() {
return new JenaConnection(graph, dataset, dialect);
}
public void setSources(RDFSource... sources) {
this.sources = sources;
}
}