All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.toilelibre.libe.curl.ReadArguments Maven / Gradle / Ivy

package org.toilelibre.libe.curl;

import org.apache.commons.cli.*;
import org.toilelibre.libe.curl.Curl.*;

import java.util.*;
import java.util.regex.*;
import java.util.stream.*;

import static java.lang.Integer.*;
import static java.util.Optional.*;

final class ReadArguments {
    private static final Pattern PLACEHOLDER_REGEX = Pattern.compile ("^\\$curl_placeholder_[0-9]+$");
    private static final Map> CACHED_ARGS_MATCHES = new HashMap<> ();

    static CommandLine getCommandLineFromRequest (final String requestCommand, final List placeholderValues) {
        return getCommandLineFromRequest (requestCommand, placeholderValues, CACHED_ARGS_MATCHES);
    }

    static CommandLine getCommandLineFromRequest (final String requestCommand, final List placeholderValues,
        final Map> argMatches) {

        // configure a parser
        final DefaultParser parser = new DefaultParser ();

        final String requestCommandWithoutBasename = requestCommand.replaceAll ("^[ ]*curl[ ]*", " ") + " ";
        final String[] args = ReadArguments.getArgsFromCommand (requestCommandWithoutBasename, placeholderValues, argMatches);
        final CommandLine commandLine;
        try {
            commandLine = parser.parse (Arguments.ALL_OPTIONS, args);
        } catch (final ParseException e) {
            new HelpFormatter ().printHelp ("curl [options] url", Arguments.ALL_OPTIONS);
            throw new CurlException (e);
        }
        return commandLine;
    }

    private static List asMatches (Pattern regex, String input) {
        Matcher matcher = regex.matcher (input);
        List result = new ArrayList<> ();
        while (matcher.find ()){
            result.add (matcher.group (1));
        }
        return result;
    }


    private static String[] getArgsFromCommand (final String requestCommandWithoutBasename,
                                                final List placeholderValues,
                                                final Map> argMatches) {
        final String requestCommandInput = requestCommandWithoutBasename.replaceAll ("\\s+-([a-zA-Z0-9])\\s+", " -$1 ");
        final List matches;
        if (argMatches.containsKey (requestCommandInput)) {
            matches = argMatches.get (requestCommandInput);
        }else{
            matches = asMatches (Arguments.ARGS_SPLIT_REGEX, requestCommandInput);
            argMatches.put (requestCommandInput, matches);
        }

        return ofNullable (matches).map (List :: stream).orElse (Stream.empty ()).map (match -> {
            String argument = ReadArguments.removeSlashes (match.trim ());
            if (PLACEHOLDER_REGEX.matcher (argument).matches ())
                return placeholderValues.get (parseInt (argument.substring ("$curl_placeholder_".length ())));
            else return argument;

        }).toArray (String[] ::new);
    }

    private static String removeSlashes (final String arg) {
        if (arg.length () == 0) {
            return arg;
        }
        if (arg.charAt (0) == '\"') {
            return arg.substring (1, arg.length () - 1).replaceAll ("\\\"", "\"");
        }
        if (arg.charAt (0) == '\'') {
            return arg.substring (1, arg.length () - 1).replaceAll ("\\\'", "\'");
        }
        return arg;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy