/******************************************************************************* * Copyright (c) 2008 Cambridge Semantics Incorporated. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Cambridge Semantics Incorporated *******************************************************************************/ package org.openanzo.client.cli; import java.io.Reader; import java.util.Collection; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Option; import org.apache.commons.cli.Options; import org.openanzo.client.AnzoClient; import org.openanzo.client.INamedGraphInitializer; import org.openanzo.exceptions.AnzoException; import org.openanzo.exceptions.AnzoRuntimeException; import org.openanzo.rdf.RDFFormat; import org.openanzo.rdf.Statement; import org.openanzo.rdf.URI; import org.openanzo.rdf.utils.IStatementsHandler; import org.openanzo.rdf.utils.ReadWriteUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Imports statement into the server. * * @author Joe Betz <jpbetz@cambridgesemantics.com> * */ class ImportCommand extends RdfUploadCommand { private static final Logger log = LoggerFactory.getLogger(ImportCommand.class); private static final Option TEMPLATE_OPTION = new Option("l", "template", true, "Template File."); private static final Option VERBOSE_OPTION = new Option("v", "verbose", false, "Verbose output during import."); private static final Option ENCODING = new Option("e", "encoding", true, "Override the default charset for uploading RDF files."); private static final Option BATCH_SIZE = new Option("s", "batch", true, "Batch size for import operation."); static { TEMPLATE_OPTION.setArgName("file | URI"); } @Override public Options getOptions() { Options options = super.getOptions(); options.addOption(TEMPLATE_OPTION); options.addOption(VERBOSE_OPTION); options.addOption(ENCODING); options.addOption(BATCH_SIZE); return options; } public String getName() { return "import"; } private class VerboseHandler implements IStatementsHandler { long totalHandled = 0; long last10kPrinted = 0; public void handleStatements(Collection<Statement> statements) throws AnzoException { totalHandled += statements.size(); if (totalHandled / 10000 != last10kPrinted) { last10kPrinted = totalHandled / 10000; System.out.println(" [" + totalHandled + "] statements imported"); } else { System.out.print("."); System.out.flush(); } } } @Override protected int update(CommandLine cl, CommandContext context, AnzoClient client, Collection<RdfInputArgument> inputs, URI defaultNamedGraphUri, URI base, boolean nonRevisioned) throws AnzoException { RDFFormat templateFormat = getFormatOption(cl, INPUT_FORMAT); boolean verbose = cl.hasOption(VERBOSE_OPTION.getOpt()); String charsetName = getEncodingOption(cl, ENCODING); if (defaultNamedGraphUri == null && inputs.size() == 1) { defaultNamedGraphUri = inputs.iterator().next().getDefaultGraphURI(); } RdfInputArgument templateInput = getRdfInputOption(context, cl, TEMPLATE_OPTION, templateFormat, charsetName); Collection<Statement> templateStatements = null; if (templateInput != null) { templateStatements = ReadWriteUtils.loadStatements(templateInput.getReader(), templateInput.getFormat(), (base != null) ? base.toString() : null); } int batchSize = 20000; if (cl.hasOption(BATCH_SIZE.getOpt())) { String bs = cl.getOptionValue(BATCH_SIZE.getOpt()); try { batchSize = Integer.parseInt(bs); } catch (NumberFormatException nfe) { } } int result = 1; boolean owns = false; try { owns = !client.isConnected(); if (owns) { client.connect(); printOnConnectionSuccess(context); } for (RdfInputArgument input : inputs) { try { if (verbose && input.inputName != null) System.out.println("Importing: " + input.inputName); Reader in = input.getReader(); RDFFormat fileFormat = input.getFormat(); URI inputBase = base; if (inputBase == null) { inputBase = input.getDefaultGraphURI(); } if (!fileFormat.supportsNamedGraphs() && defaultNamedGraphUri == null) { throw new InvalidArgumentException(GRAPH.getLongOpt() + " option must be set for format " + fileFormat + " since this format does not support named graphs"); } if (templateStatements != null) { client.importStatements(in, fileFormat, (base != null) ? base.toString() : null, defaultNamedGraphUri, batchSize, templateStatements, ((verbose) ? new VerboseHandler() : null)); } else { client.importStatements(in, fileFormat, (base != null) ? base.toString() : null, defaultNamedGraphUri, batchSize, ((verbose) ? new VerboseHandler() : null), getNamedGraphInitializers(nonRevisioned)); } if (verbose) System.out.println(); } catch (AnzoException e) { context.writeError("Error loading RDF Input: " + input.inputName); context.getConsoleWriter().printException(e, context.getShowTrace()); throw e; } } result = 0; return result; } finally { try { if (owns) client.close(); } catch (AnzoRuntimeException e) { log.error("Error closing connection", e); } } } public void printHelp(IConsole consoleWriter) { String header = "Imports statements into the repository, creating graphs in the repository as needed. Reads from the arguments or from STDIN if no input arguments are provided."; String syntax = "anzo import [options] [RDF-INPUT-FILE-OR-URI...]"; String footer = "RDF format options are: " + CommandLineInterface.getRDFFormatOptionsString(); Options options = getOptions(); CommandLineInterface.appendGlobalOptions(options); consoleWriter.printHelp( syntax, header, options, footer); } @Override public INamedGraphInitializer[] getNamedGraphInitializers() { return new INamedGraphInitializer[] {}; } }