package edu.kit.aifb.cumulus.cli; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.util.Iterator; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Option; import org.apache.commons.cli.Options; import org.openrdf.model.Statement; import org.openrdf.model.Value; import org.openrdf.rio.RDFFormat; import org.openrdf.rio.RDFWriter; import org.openrdf.rio.Rio; import edu.kit.aifb.cumulus.cli.log.MessageCatalog; import edu.kit.aifb.cumulus.store.QuadStore; import edu.kit.aifb.cumulus.store.Store; /** * Dumps the stored triples as NTriples file. * * @author Andreas Wagner * @author Andrea Gazzarini * @since 1.0 */ public class Dump extends Command{ @Override Options getOptions() { final Option inputO = new Option("o", "name of output file"); inputO.setArgs(1); inputO.setRequired(true); final Option inputS = new Option("s", "Storage layout (e.g. triple or quad; defaults to triple)"); inputS.setArgs(1); final Option batchF = new Option("f", "all common RDF formats (e.g., 'n-triples', 'n-quads', or 'rdf/xml') (default: 'n-triples')"); batchF.setArgs(1); final Option helpO = new Option("h", "print help"); final Options options = new Options(); options.addOption(inputO); options.addOption(batchF); options.addOption(helpO); return options; } @Override public void doExecute(final CommandLine commandLine, final Store store) { final String outputFilePath = commandLine.getOptionValue("o"); final File outputFile = new File(outputFilePath); if (!outputFile.canWrite()) { _log.error( MessageCatalog._00003_BAD_OUTPUTFILE, outputFile.getAbsolutePath()); } final String format = commandLine.hasOption("f") ? commandLine.getOptionValue("f") : "N-Quads"; final RDFFormat rdfFormat = RDFFormat.valueOf(format); if (rdfFormat == null) { _log.error(MessageCatalog._00002_BAD_FORMAT, format); return; } long start = System.currentTimeMillis(); int counter = 0; BufferedWriter outputWriter = null; try { outputWriter = new BufferedWriter(new FileWriter(outputFile)); final RDFWriter rdfWriter = Rio.createWriter(rdfFormat, outputWriter); _log.info(MessageCatalog._00013_DUMP_STARTS, outputFile.getAbsolutePath()); final boolean isQuad = store instanceof QuadStore; rdfWriter.startRDF(); for (final Iterator<Statement> iter = store.query( isQuad ? new Value[] { null, null, null, null } : new Value[] { null, null, null }); iter.hasNext();) { rdfWriter.handleStatement(iter.next()); if (++counter % 10000 == 0) { _log.info(MessageCatalog._00014_DUMP_CHUNK_DEBUG, counter); } } rdfWriter.endRDF(); } catch (final Exception exception) { _log.error(MessageCatalog._00026_NWS_SYSTEM_INTERNAL_FAILURE, exception); return; } finally { if (outputWriter != null) { // CHECKSTYLE:OFF try { outputWriter.flush(); } catch (Exception ignore) {}; try { outputWriter.close(); } catch (Exception ignore) {}; // CHECKSTYLE: ON } } if (counter != 0) { _log.info( MessageCatalog._00015_DUMP_REPORT, counter, outputFile.getAbsolutePath(), ((start - System.currentTimeMillis()) / 1000d)); } else { _log.info(MessageCatalog._00027_EMPTY_DUMP_REPORT); } } }