org.bitrepository.commandline.utils.CommandLineArgumentsHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.bitrepository.commandline.utils.CommandLineArgumentsHandler.java

Source

/*
 * #%L
 * Bitrepository Command Line
 * %%
 * Copyright (C) 2010 - 2012 The State and University Library, The Royal Library and The State Archives, Denmark
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as 
 * published by the Free Software Foundation, either version 2.1 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 Lesser Public License for more details.
 * 
 * You should have received a copy of the GNU General Lesser Public 
 * License along with this program.  If not, see
 * <http://www.gnu.org/licenses/lgpl-2.1.html>.
 * #L%
 */
package org.bitrepository.commandline.utils;

import java.util.Collection;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import org.bitrepository.client.CommandLineSettingsProvider;
import org.bitrepository.commandline.Constants;
import org.bitrepository.common.ArgumentValidator;
import org.bitrepository.common.settings.Settings;
import org.bitrepository.common.settings.SettingsProvider;
import org.bitrepository.common.settings.XMLFileSettingsLoader;
import org.bitrepository.common.utils.SettingsUtils;
import org.bitrepository.protocol.security.BasicMessageAuthenticator;
import org.bitrepository.protocol.security.BasicMessageSigner;
import org.bitrepository.protocol.security.BasicOperationAuthorizor;
import org.bitrepository.protocol.security.BasicSecurityManager;
import org.bitrepository.protocol.security.MessageAuthenticator;
import org.bitrepository.protocol.security.MessageSigner;
import org.bitrepository.protocol.security.OperationAuthorizor;
import org.bitrepository.protocol.security.PermissionStore;

/**
 * Interface for handling the command line arguments.
 */
public class CommandLineArgumentsHandler {
    /** The parser of the command line arguments.*/
    protected final CommandLineParser parser;
    /** The options for the command line arguments*/
    protected final Options options;
    /** The command line. */
    protected CommandLine cmd = null;
    /** The settings.*/
    protected Settings settings = null;

    /**
     * Constructor.
     */
    public CommandLineArgumentsHandler() {
        parser = new PosixParser();
        options = new Options();
    }

    /**
     * Parses the commandline arguments.
     * @param args The command line arguments to pass.
     * @throws ParseException If the arguments does not parse. E.g. arguments missing or too many arguments.
     */
    public void parseArguments(String... args) throws ParseException {
        cmd = parser.parse(options, args, Constants.NOT_ALLOWING_UNDEFINED_ARGUMENTS);
    }

    /**
     * For validating that the command line has been instantiated.
     */
    private void ensureThatCmdHasBeenInitialised() {
        ArgumentValidator.checkNotNull(cmd, "No argument has been parsed from the command line.");
    }

    /**
     * Creates the default options for the command line arguments for the clients.
     */
    public void createDefaultOptions() {
        Option settingsOption = new Option(Constants.SETTINGS_ARG, true,
                "The path to the directory with the settings " + "files for the client");
        settingsOption.setRequired(Constants.ARGUMENT_IS_REQUIRED);
        options.addOption(settingsOption);

        Option privateKeyOption = new Option(Constants.PRIVATE_KEY_ARG, true,
                "The path to the file containing " + "the private key.");
        privateKeyOption.setRequired(Constants.ARGUMENT_IS_NOT_REQUIRED);
        options.addOption(privateKeyOption);

        Option verbosity = new Option(Constants.VERBOSITY_ARG, false, "Makes the client more verbose");
        verbosity.setRequired(Constants.ARGUMENT_IS_NOT_REQUIRED);
        options.addOption(verbosity);
    }

    /**
     * @param option The option to add to the command line.
     */
    public void addOption(Option option) {
        options.addOption(option);
    }

    /**
     * @param optionName The name of the option to extract the value for.
     * @return The value corresponding to the given option name.
     */
    public String getOptionValue(String optionName) {
        ensureThatCmdHasBeenInitialised();
        return cmd.getOptionValue(optionName);
    }

    /**
     * @param optionName The name of the option to validate whether exists.
     * @return Whether any arguments for the options have been given.
     */
    public boolean hasOption(String optionName) {
        ensureThatCmdHasBeenInitialised();
        return cmd.hasOption(optionName);
    }

    /**
     * @return Lists the possible arguments in a human readable format.
     */
    @SuppressWarnings("unchecked")
    public String listArguments() {
        StringBuilder res = new StringBuilder();
        res.append("Takes the following arguments:\n");
        for (Option option : (Collection<Option>) options.getOptions()) {
            res.append("-" + option.getOpt() + " " + option.getDescription() + "\n");
        }
        return res.toString();
    }

    /**
     * Method for retrieving the settings for the launcher.
     * This will be based on the argument for the path to the settings.
     * @return The settings.
     */
    public Settings loadSettings() {
        ensureThatCmdHasBeenInitialised();
        if (settings == null) {
            SettingsProvider settingsLoader = new CommandLineSettingsProvider(
                    new XMLFileSettingsLoader(cmd.getOptionValue(Constants.SETTINGS_ARG)));
            settings = settingsLoader.getSettings();
        }
        SettingsUtils.initialize(settings);
        return settings;
    }

    /**
     * Instantiates the security manager based on the settings and argument for the path to the key file.
     * @param settings The settings.
     * @return The security manager.
     */
    public BasicSecurityManager loadSecurityManager(Settings settings) {
        ArgumentValidator.checkNotNull(settings, "Settings settings");
        ensureThatCmdHasBeenInitialised();
        String privateKeyFile = cmd.getOptionValue(Constants.PRIVATE_KEY_ARG, "");

        PermissionStore permissionStore = new PermissionStore();
        MessageAuthenticator authenticator = new BasicMessageAuthenticator(permissionStore);
        MessageSigner signer = new BasicMessageSigner();
        OperationAuthorizor authorizer = new BasicOperationAuthorizor(permissionStore);
        return new BasicSecurityManager(settings.getRepositorySettings(), privateKeyFile, authenticator, signer,
                authorizer, permissionStore, settings.getComponentID());
    }
}