/*******************************************************************************
* 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.apache.commons.lang.ObjectUtils;
import org.openanzo.client.AnzoClient;
import org.openanzo.exceptions.AnzoException;
import org.openanzo.rdf.Dataset;
import org.openanzo.rdf.IDataset;
import org.openanzo.rdf.INamedGraph;
import org.openanzo.rdf.RDFFormat;
import org.openanzo.rdf.URI;
import org.openanzo.rdf.utils.ReadWriteUtils;
/**
* Unions together RDF from files and STDIN.
*
* @author Joe Betz <jpbetz@cambridgesemantics.com>
*
*/
class UnionCommand extends RdfIOCommand {
private static final Option BASE = new Option("b", "base", true, "Set the base URI of the input RDF file(s) or URI(s)");
private static final Option INPUT_FORMAT = new Option("i", "input-format", true, "Overide the default RDF format associated with RDF input(s).");
private static final Option OUTPUT_FORMAT = new Option("o", "output-format", true, "Overide the default RDF format associated with the RDF output(s)");
private static final Option GRAPH = new Option("g", "graph", true, "Named graph uri to use for rdf inputs that do not support named graph serialization");
private static final Option READ_STDIN = new Option("s", "--read-stdin", false, "Read RDF from STDIN in addition to files and URIs.");
private static final Option ENCODING = new Option("e", "encoding", true, "Override the default charset for uploading RDF files.");
static {
BASE.setArgName("URI");
INPUT_FORMAT.setArgName("format");
OUTPUT_FORMAT.setArgName("format");
GRAPH.setArgName("URI");
}
public String getName() {
return "union";
}
public Options getOptions() {
Options options = new Options();
options.addOption(BASE);
options.addOption(INPUT_FORMAT);
options.addOption(OUTPUT_FORMAT);
options.addOption(GRAPH);
options.addOption(READ_STDIN);
options.addOption(ENCODING);
return options;
}
public int invoke(CommandLine cl, CommandContext context, AnzoClient client) throws AnzoException {
String[] args = cl.getArgs();
RDFFormat inputFormatOverride = getFormatOption(cl, INPUT_FORMAT);
RDFFormat outputFormat = getFormatOption(cl, OUTPUT_FORMAT, CommandLineInterface.DEFAULT_RDF_FORMAT);
String charsetName = getEncodingOption(cl, ENCODING);
Collection<RdfInputArgument> inputs = getArgumentsAsStreams(cl, context, args, 0, args.length, inputFormatOverride, charsetName);
URI defaultNamedGraphUri = getURIOption(cl, GRAPH, context);
URI base = getURIOption(cl, BASE, context);
if (args.length == 0) {
if (inputFormatOverride == null) {
inputs.add(new RdfInputArgument(System.in, RDFFormat.forFileName("." + CommandLineInterface.DEFAULT_RDF_FORMAT), charsetName));
} else {
inputs.add(new RdfInputArgument(System.in, inputFormatOverride, charsetName));
}
}
return union(context, client, inputs, outputFormat, defaultNamedGraphUri, base);
}
public int union(CommandContext context, AnzoClient client, Collection<RdfInputArgument> inputs, RDFFormat outputFormat, URI defaultNamedGraphUri, URI base) throws AnzoException {
IDataset store = new Dataset();
INamedGraph defaultNamedGraph = null;
if (defaultNamedGraphUri == null && inputs.size() == 1) {
defaultNamedGraphUri = inputs.iterator().next().getDefaultGraphURI();
}
if (defaultNamedGraphUri != null) {
store.addNamedGraph(defaultNamedGraphUri);
defaultNamedGraph = store.getNamedGraph(defaultNamedGraphUri);
}
for (RdfInputArgument input : inputs) {
Reader in = input.getReader();
RDFFormat fileFormat = input.getFormat();
URI inputBase = base;
if (inputBase == null) {
inputBase = input.getDefaultGraphURI();
}
if (!fileFormat.supportsNamedGraphs()) {
INamedGraph inputNamedGraph = defaultNamedGraph;
if (inputNamedGraph == null) {
URI uri = input.getDefaultGraphURI();
if (uri != null) {
store.addNamedGraph(uri);
inputNamedGraph = store.getNamedGraph(uri);
}
}
if (inputNamedGraph == null) {
throw new InvalidArgumentException(GRAPH.getLongOpt() + " option must be set for format " + fileFormat + " since this format does not support named graphs");
}
ReadWriteUtils.loadGraph(inputNamedGraph, in, fileFormat, ObjectUtils.toString(inputBase));
} else {
ReadWriteUtils.loadQuadStore(store, in, fileFormat, ObjectUtils.toString(inputBase));
}
}
context.outputRdf(store, outputFormat);
return 0;
}
public void printHelp(IConsole consoleWriter) {
String header = "Unions RDF from the arguments and optionally from STDIN as well.";
String syntax = "anzo union [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);
}
}