package de.unikiel.inf.comsys.neo4j.http.streams; /* * #%L * neo4j-sparql-extension * %% * Copyright (C) 2014 Niclas Hoyer * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import org.openrdf.model.Resource; import org.openrdf.model.Statement; import org.openrdf.repository.RepositoryConnection; import org.openrdf.repository.RepositoryException; import org.openrdf.rio.RDFHandler; import org.openrdf.rio.RDFHandlerException; /** * A {@link RDFHandler} implementation that accepts {@link Statement}s and * commits them in chunks to a repository. */ public class ChunkedCommitHandler implements RDFHandler { private final RepositoryConnection conn; private final long size; private final Resource dctx; private long count; /** * Create a new chunked commit handler with given chunk size that * commits to the given graph and connection. * * @param conn the connection to commit to * @param size the chunk size * @param dctx the graph in that the triples should be stored */ public ChunkedCommitHandler( RepositoryConnection conn, long size, Resource dctx) { this.conn = conn; this.size = size; this.dctx = dctx; this.count = 0; } /** * Marks the beginning of RDF data. * * @throws RDFHandlerException */ @Override public void startRDF() throws RDFHandlerException { this.count = 0; } /** * Marks the end of RDF data. * * @throws RDFHandlerException */ @Override public void endRDF() throws RDFHandlerException { } /** * Handles a namespace (ignored). * @param string * @param string1 * @throws org.openrdf.rio.RDFHandlerException */ @Override public void handleNamespace(String string, String string1) throws RDFHandlerException { } /** * Handles a statement. * * The statements will be added up until chunk size is reached. * After a chunk of statements is added the transaction will be committed * and new transaction will be started. * @param stmnt * @throws RDFHandlerException */ @Override public void handleStatement(Statement stmnt) throws RDFHandlerException { try { // check if triple should be added to a specific graph if (dctx != null) { conn.add(stmnt, dctx); } else { conn.add(stmnt); } // check if chunk size is reached and transaction should be // committed count++; if (count >= size) { count = 0; conn.commit(); conn.begin(); } } catch (RepositoryException ex) { throw new RDFHandlerException(ex); } } /** * Handles a comment (ignored). * @param string the comment * @throws RDFHandlerException */ @Override public void handleComment(String string) throws RDFHandlerException { } }