br.usp.poli.lta.cereda.macro.util.CLIParser.java Source code

Java tutorial

Introduction

Here is the source code for br.usp.poli.lta.cereda.macro.util.CLIParser.java

Source

/**
* ------------------------------------------------------
*    Laboratrio de Linguagens e Tcnicas Adaptativas
*       Escola Politcnica, Universidade So Paulo
* ------------------------------------------------------
* 
* 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.
* 
**/
package br.usp.poli.lta.cereda.macro.util;

import br.usp.poli.lta.cereda.macro.model.Pair;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.Parser;
import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * Implementa um analisador de linha de comando.
 * @author Paulo Roberto Massa Cereda
 * @version 1.0
 * @since 1.0
 */
public class CLIParser {

    // logger para gerenciamento do processo de expanso das macros
    private static final Logger logger = LogManager.getLogger(CLIParser.class);

    // vetor de argumentos de linha de comando
    private final String[] arguments;

    private boolean editor = false;

    /**
     * Construtor.
     * @param arguments Argumentos de linha de comando.
     */
    public CLIParser(String[] arguments) {
        this.arguments = arguments;
    }

    /**
     * Realiza a anlise dos argumentos de linha de comando e retorna um par
     * contendo o texto a ser expandido e o arquivo de sada.
     * @return Um par contendo o texto a ser expandido e o arquivo de sada.
     * @throws IOException Um dos arquivos de entrada no existe.
     */
    public Pair<String, File> parse() throws IOException {

        // opo de entrada
        Option input = OptionBuilder.withLongOpt("input").hasArgs().withArgName("lista de arquivos")
                .withDescription("arquivos de entrada").create("i");

        // opo de sada
        Option output = OptionBuilder.withLongOpt("output").hasArg().withArgName("arquivo")
                .withDescription("arquivo de sada").create("o");

        // opo do editor embutido
        Option ui = OptionBuilder.withLongOpt("editor").withDescription("editor grfico").create("e");

        Options options = new Options();
        options.addOption(input);
        options.addOption(output);
        options.addOption(ui);

        try {

            // parsing dos argumentos
            Parser parser = new BasicParser();
            CommandLine line = parser.parse(options, arguments);

            // verifica se  uma chamada ao editor e retorna em caso positivo
            if (line.hasOption("e")) {
                editor = true;
                return null;
            }

            // se no  uma chamada ao editor de macros,  necessrio verificar
            // se existe um arquivo de entrada
            if (!line.hasOption("i")) {
                throw new ParseException("");
            }

            // existem argumentos restantes, o que representa situao de erro
            if (!line.getArgList().isEmpty()) {
                throw new ParseException("");
            }

            String text = "";
            File out = line.hasOption("output") ? new File(line.getOptionValue("output")) : null;

            if (out == null) {
                logger.info("A sada ser gerada no terminal.");
            } else {
                logger.info("A sada ser gerada no arquivo '{}'.", out.getName());
            }

            // faz a leitura de todos os arquivos e concatena seu contedo em
            // uma varivel
            logger.info("Iniciando a leitura dos arquivos de entrada.");
            String[] files = line.getOptionValues("input");
            for (String file : files) {
                logger.info("Lendo arquivo '{}'.", file);
                text = text.concat(FileUtils.readFileToString(new File(file), Charset.forName("UTF-8")));
            }

            // retorna o par da varivel contendo o texto de todos os arquivos
            // e a referncia ao arquivo de sada (podendo este ser nulo)
            return new Pair<>(text, out);

        } catch (ParseException exception) {

            // imprime a ajuda
            HelpFormatter help = new HelpFormatter();
            help.printHelp("expander ( --editor | --input <lista de arquivos>" + " [ --output <arquivo> ] )",
                    options);
        }

        // retorna um valor invlido indicando para no prosseguir com o
        // processo de expanso
        return null;

    }

    /**
     * Verifica se  uma chamada ao editor embutido.
     * @return Valor lgico que indica se  uma chamada ao editor de macros.
     */
    public boolean isEditor() {
        return editor;
    }

}