package com.oreilly.rdf.tenuki.jaxrs; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import org.openjena.atlas.lib.Sink; import org.openjena.riot.RiotReader; import org.openjena.riot.lang.LangNQuads; import com.hp.hpl.jena.sdb.store.StoreLoaderPlus; import com.hp.hpl.jena.sparql.core.DatasetGraph; import com.hp.hpl.jena.sparql.core.Quad; @Path("/bulk") public class BulkLoadResource extends DatasetAccessResource { public class SDBBulkSink implements Sink<Quad> { private StoreLoaderPlus loader; public SDBBulkSink(StoreLoaderPlus loader){ this.loader = loader; loader.setChunkSize(100000); loader.startBulkUpdate(); } @Override public void flush() { } @Override public void send(Quad q) { loader.addQuad(q.getGraph(), q.getSubject(), q.getPredicate(), q.getObject()); } @Override public void close() { loader.finishBulkUpdate(); } } @Path("") @POST @Consumes("text/x-nquads") public Response bulkLoad(@Context HttpServletRequest r) { StoreLoaderPlus loader = (StoreLoaderPlus) getStore().getLoader(); SDBBulkSink sink = new SDBBulkSink(loader); try { LangNQuads parser = RiotReader.createParserNQuads(r.getInputStream(), sink); parser.parse(); } catch (IOException e) { throw new RuntimeException(e); } finally { sink.close(); } return Response.noContent().build(); } @Path("dump") @GET @Produces("text/x-nquads") public DatasetGraph dump() { return getDataset().asDatasetGraph(); } }