org.openanzo.client.cli.RdfIOCommand.java Source code

Java tutorial

Introduction

Here is the source code for org.openanzo.client.cli.RdfIOCommand.java

Source

/*******************************************************************************
 * 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.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URISyntaxException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.TreeSet;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.openanzo.exceptions.AnzoException;
import org.openanzo.exceptions.AnzoRuntimeException;
import org.openanzo.exceptions.LogUtils;
import org.openanzo.rdf.Constants;
import org.openanzo.rdf.RDFFormat;
import org.openanzo.rdf.URI;
import org.openanzo.rdf.utils.Pair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

abstract class RdfIOCommand implements SubCommand {
    private static final Logger log = LoggerFactory.getLogger(RdfIOCommand.class);

    protected static final Option VERBOSE = new Option("v", "verbose", false, "Display filenames being uploaded");

    protected static final Option RECURSE = new Option("r", "recurse", false, "Recurse directories");

    RDFFormat getFormatOption(CommandLine cl, Option option) throws AnzoException {
        RDFFormat format = null;
        if (cl.hasOption(option.getOpt())) {
            String formatString = cl.getOptionValue(option.getOpt());
            format = RDFFormat.forFileName("." + formatString);
            if (format == null) {
                throw new InvalidArgumentException("unsupported format: " + formatString);
            }
        }
        return format;
    }

    RDFFormat getFormatOption(CommandLine cl, Option option, String defaultFormat) throws AnzoException {
        String formatString = cl.getOptionValue(option.getOpt(), defaultFormat);

        RDFFormat format = RDFFormat.forFileName("." + formatString);
        if (format == null) {
            throw new InvalidArgumentException("unrecognized rdf format: " + formatString);
        }

        return format;
    }

    protected String getEncodingOption(CommandLine cl, Option option) throws AnzoException {
        String charsetName = cl.getOptionValue(option.getOpt());
        if (charsetName == null)
            return Constants.byteEncoding;
        if (!Charset.isSupported(charsetName))
            throw new InvalidArgumentException("unsupported charset: " + charsetName);
        return charsetName;
    }

    protected void printOnConnectionSuccess(CommandContext context) {
        if (context.getRequireLogin()) {
            context.writeOutput("\nAuthentication Successful\n");
        }
    }

    protected Pair<File, RDFFormat> getFileArgument(CommandContext context, String arg, RDFFormat formatOverride,
            boolean exists) throws AnzoException {
        File file = new File(arg);
        if (exists && !file.isFile()) {
            throw new InvalidArgumentException("file not found: " + file.getAbsolutePath());
        }
        RDFFormat format = null;
        try {
            format = formatOverride != null ? formatOverride : RDFFormat.forFileName(file.getName());
        } catch (AnzoRuntimeException ae) {
            log.debug(LogUtils.INTERNAL_MARKER, "Error getting rdf format for:" + arg, ae);
        }
        return new Pair<File, RDFFormat>(file, format);
    }

    Collection<RdfInputArgument> getArgumentsAsStreams(CommandLine cl, CommandContext context, String[] args,
            int start, int end, RDFFormat formatOverride, String charsetName) throws AnzoException {
        List<RdfInputArgument> results = new ArrayList<RdfInputArgument>();
        for (int i = start; i < end; i++) {
            String arg = args[i];
            if (new File(arg).exists() && new File(arg).isDirectory()) {
                Collection<File> files = getFiles(new File(arg), cl.hasOption(RECURSE.getOpt()));
                for (File file : files) {
                    try {
                        RDFFormat.forFileName(file.getName());
                        results.add(getArgumentAsInputStream(context, file.getAbsolutePath(), formatOverride,
                                charsetName));
                        if (cl.hasOption(VERBOSE.getOpt())) {
                            context.writeOutput("Adding file: " + file.getAbsolutePath());
                        }
                    } catch (AnzoRuntimeException e) {
                        log.debug("Skipping file: " + file.getAbsolutePath());
                    }
                }
            } else {
                RdfInputArgument entry = getArgumentAsInputStream(context, arg, formatOverride, charsetName);
                results.add(entry);
            }
        }
        return results;
    }

    Collection<File> getFiles(File dir, boolean recurse) {
        TreeSet<File> files = new TreeSet<File>();
        for (File file : dir.listFiles()) {
            if (file.isDirectory()) {
                if (recurse) {
                    files.addAll(getFiles(file, recurse));
                }
            } else {
                files.add(file);
            }
        }
        return files;
    }

    RdfInputArgument getArgumentAsInputStream(CommandContext context, String arg, RDFFormat formatOverride,
            String charsetName) throws AnzoException {
        if (!new File(arg).exists() && (context.isURI(arg) || context.isCURIE(arg))) {
            try {
                URI uri = context.getURI(arg);
                return getInputStreamForURIArgument(uri, charsetName);
            } catch (URISyntaxException e) {
                throw new InvalidArgumentException("URI Syntax Exception: " + arg + "\n" + e.getMessage());
            }
        }
        Pair<File, RDFFormat> file = getFileArgument(context, arg, formatOverride, true);

        try {
            return new RdfInputArgument(new FileInputStream(file.first), file.second, file.first.getAbsolutePath(),
                    null, charsetName);
        } catch (FileNotFoundException e) {
            throw new InvalidArgumentException("file not found: " + file.first.getName());
        }
    }

    Pair<Writer, RDFFormat> getFileArgumentAsOutputStream(CommandContext context, String arg,
            RDFFormat formatOverride) throws AnzoException {
        Pair<File, RDFFormat> file = getFileArgument(context, arg, formatOverride, false);

        try {
            return new Pair<Writer, RDFFormat>(
                    new OutputStreamWriter(new FileOutputStream(file.first), Constants.byteEncoding), file.second);
        } catch (FileNotFoundException e) {
            throw new InvalidArgumentException("file not found: " + file.first.getName());
        } catch (IOException e) {
            throw new InvalidArgumentException("file not found: " + file.first.getName());
        }
    }

    RdfInputArgument getRdfInputOption(CommandContext context, CommandLine cl, Option option,
            RDFFormat formatOverride, String charsetName) throws AnzoException {
        String fileOption = cl.getOptionValue(option.getOpt());
        if (fileOption == null)
            return null;
        return getArgumentAsInputStream(context, fileOption, formatOverride, charsetName);
    }

    Pair<File, RDFFormat> getFileOption(CommandLine cl, Option option, RDFFormat formatOverride, boolean exists)
            throws AnzoException {
        String fileOption = cl.getOptionValue(option.getOpt());
        File file = null;
        RDFFormat format = null;
        if (fileOption != null) {
            file = new File(fileOption);
            if (exists && !file.isFile()) {
                throw new InvalidArgumentException("File not found:" + file);
            }
            format = formatOverride != null ? formatOverride : RDFFormat.forFileName(file.getName());
        }

        return file == null ? null : new Pair<File, RDFFormat>(file, format);
    }

    URI getURIOption(CommandLine cl, Option option, CommandContext context) throws AnzoException {
        URI uri = null;
        if (cl.hasOption(option.getOpt())) {
            String uriString = cl.getOptionValue(option.getOpt());
            try {
                uri = context.getURI(uriString);
            } catch (URISyntaxException e) {
                throw new InvalidArgumentException("illegal URI: " + uriString);
            }
        }
        return uri;
    }

    RdfInputArgument getInputStreamForURIArgument(URI uri, String charsetName) throws AnzoException {
        try {
            HttpClient client = new HttpClient();
            GetMethod get = new GetMethod(uri.toString());
            get.addRequestHeader("Accept", RDFFormat.RDFXML.getDefaultMIMEType());
            get.setFollowRedirects(true); // handles See Also headers
            client.executeMethod(get);
            int statusCode = get.getStatusCode();
            if (statusCode == HttpStatus.SC_OK) {
                Header contentType = get.getResponseHeader("Content-Type");
                RDFFormat format;
                if (contentType == null) {
                    format = RDFFormat.RDFXML;
                } else {
                    String type = contentType.getValue();
                    format = RDFFormat.forMIMEType(type);
                    format = format == null ? RDFFormat.RDFXML : format;
                }

                InputStream input = get.getResponseBodyAsStream();
                return new RdfInputArgument(input, format, uri.toString(), uri, charsetName);

            } else {
                throw new CommandException("Error retrieving data from URI: " + uri);
            }
        } catch (IOException e) {
            throw new CommandException("Error retrieving data from URI: " + uri);
        } catch (IllegalStateException e) {
            throw new CommandException(e, "Error retrieving data from URI: " + uri);
        }

    }

    URI getURIArgument(String arg, CommandContext context) throws AnzoException {
        URI uri = null;
        try {
            uri = context.getURI(arg);
        } catch (URISyntaxException e) {
            throw new InvalidArgumentException("Invalid (1) URI: " + arg);
        }
        return uri;
    }

    List<URI> getURIArguments(String[] args, int start, int end, CommandContext context) throws AnzoException {
        List<URI> uris = new ArrayList<URI>();
        for (int i = start; i < end; i++) {
            String uriString = args[i];
            try {
                if (context.isURI(uriString)) {
                    uris.add(context.getURI(uriString));
                } else {
                    throw new InvalidArgumentException("Invalid (2) URI: " + uriString);
                }
            } catch (URISyntaxException e) {
                throw new InvalidArgumentException("Invalid (3) URI: " + uriString);
            }
        }
        return uris;
    }

    boolean isFlagSet(CommandLine cl, Option option) {
        return cl.hasOption(option.getOpt());
    }

}