package org.xenei.jdbc4sparql.config;
import java.io.IOException;
import java.util.Iterator;
import java.util.Properties;
import java.util.zip.ZipInputStream;
import org.xenei.jdbc4sparql.impl.AbstractDatasetProducer;
import com.hp.hpl.jena.graph.compose.MultiUnion;
import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.query.DatasetFactory;
import com.hp.hpl.jena.query.LabelExistsException;
import com.hp.hpl.jena.query.ReadWrite;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.shared.Lock;
import com.hp.hpl.jena.sparql.core.DatasetGraph;
import com.hp.hpl.jena.sparql.util.Context;
public class MemDatasetProducer extends AbstractDatasetProducer {
private static class MetaDS implements Dataset {
Dataset ds;
MultiUnion g;
Model m;
public MetaDS(final Dataset ds) {
this.ds = ds;
rescan();
}
@Override
public void abort() {
ds.abort();
}
@Override
public void addNamedModel(final String uri, final Model model)
throws LabelExistsException {
ds.addNamedModel(uri, model);
g.addGraph(ds.getNamedModel(uri).getGraph());
}
@Override
public DatasetGraph asDatasetGraph() {
return ds.asDatasetGraph();
}
@Override
public void begin(final ReadWrite readWrite) {
ds.begin(readWrite);
}
@Override
public void close() {
ds.close();
}
@Override
public void commit() {
ds.commit();
}
@Override
public boolean containsNamedModel(final String uri) {
return "urn:x-arq:UnionGraph".equals(uri) ? true : ds
.containsNamedModel(uri);
}
@Override
public void end() {
ds.end();
}
@Override
public Context getContext() {
return ds.getContext();
}
@Override
public Model getDefaultModel() {
return ds.getDefaultModel();
}
@Override
public Lock getLock() {
return ds.getLock();
}
@Override
public Model getNamedModel(final String uri) {
if ("urn:x-arq:UnionGraph".equals(uri)) {
return m;
}
final boolean hasModel = ds.containsNamedModel(uri);
final Model model = ds.getNamedModel(uri);
if (!hasModel) {
g.addGraph(model.getGraph());
}
return model;
}
@Override
public boolean isInTransaction() {
return ds.isInTransaction();
}
@Override
public Iterator<String> listNames() {
return ds.listNames();
}
@Override
public void removeNamedModel(final String uri) {
g.removeGraph(ds.getNamedModel(uri).getGraph());
ds.removeNamedModel(uri);
}
@Override
public void replaceNamedModel(final String uri, final Model model) {
g.removeGraph(ds.getNamedModel(uri).getGraph());
ds.replaceNamedModel(uri, model);
g.addGraph(ds.getNamedModel(uri).getGraph());
}
public void rescan() {
g = new MultiUnion();
final Iterator<String> iter = ds.listNames();
while (iter.hasNext()) {
g.addGraph(ds.getNamedModel(iter.next()).getGraph());
}
m = ModelFactory.createModelForGraph(g);
}
@Override
public void setDefaultModel(final Model model) {
ds.setDefaultModel(model);
}
@Override
public boolean supportsTransactions() {
return ds.supportsTransactions();
}
}
public MemDatasetProducer() {
this(new Properties());
}
public MemDatasetProducer(final Properties props) {
super(props, new MetaDS(DatasetFactory.createMem()), DatasetFactory
.createMem());
}
public MemDatasetProducer(final Properties props, final ZipInputStream zis)
throws IOException {
super(props, new MetaDS(DatasetFactory.createMem()), DatasetFactory
.createMem());
load(zis);
((MetaDS) getMetaDataset()).rescan();
}
}