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

liquibase.command.AbstractCliWrapperCommandStep Maven / Gradle / Ivy

There is a newer version: 4.30.0
Show newest version
package liquibase.command;

import liquibase.exception.CommandExecutionException;
import liquibase.integration.commandline.Main;

import java.io.OutputStream;
import java.io.PrintStream;
import java.util.*;

/**
 * Convenience base class for {@link CommandStep}s that simply wrap calls to {@link liquibase.integration.commandline.Main}
 *
 * @deprecated
 */
public abstract class AbstractCliWrapperCommandStep extends AbstractCommandStep {

    @Override
    public final void run(CommandResultsBuilder resultsBuilder) throws Exception {
        preRunCheck(resultsBuilder);

        final OutputStream outputStream = resultsBuilder.getOutputStream();
        PrintStream printStream = null;

        if (outputStream != null) {
            printStream = new PrintStream(outputStream);
            Main.setOutputStream(printStream);
        }

        final CommandScope commandScope = resultsBuilder.getCommandScope();

        String[] args = collectArguments(commandScope);
        int statusCode = Main.run(args);
        if (statusCode != 0) {
            throw new CommandExecutionException("Unexpected error running liquibase");
        }
        resultsBuilder.addResult("statusCode", statusCode);

        if (printStream != null) {
            printStream.close();
        }
    }

    protected void preRunCheck(CommandResultsBuilder resultsBuilder) {

    }

    /**
     * Called by {@link #run(CommandResultsBuilder)} to create the actual arguments passed to {@link Main#run(String[])}.
     * 

* Implementations should generally call {@link #collectArguments(CommandScope, List, String)} * and possibly {@link #removeArgumentValues(String[], String...)} */ protected abstract String[] collectArguments(CommandScope commandScope) throws CommandExecutionException; /** * Collects the values from commandScope into an argument array to pass to {@link Main}. * All arguments will values in commandScope will be passed as global arguments EXCEPT for ones listed in the commandArguments. * If main takes a "positional argument" like `liquibase tag tagName`, specify the commandScope argument that should be converted to a positional argument in "positionalArgumentName". * * @see #removeArgumentValues(String[], String...) If any arguments should not have a value (like a --verbose flag), see */ protected String[] collectArguments(CommandScope commandScope, List commandArguments, String positionalArgumentName) throws CommandExecutionException { if (commandArguments == null) { commandArguments = Collections.emptyList(); } final List finalLegacyCommandArguments = commandArguments; List argsList = new ArrayList<>(); Map> arguments = commandScope.getCommand().getArguments(); arguments.forEach((key, value) -> { if (value.getHidden()) { // This may impact tests that use the legacy Main class. Previously hidden arguments were not being hidden when executing. return; } if (finalLegacyCommandArguments.contains(key)) { return; } if (positionalArgumentName != null && positionalArgumentName.equalsIgnoreCase(key)) { return; } Object argumentValue = commandScope.getArgumentValue(value); String argValue = (argumentValue != null ? argumentValue.toString() : null); if (argValue != null) { argsList.add("--" + key); argsList.add(argumentValue.toString()); } }); argsList.add(commandScope.getCommand().getName()[0]); arguments.forEach((key, value) -> { if (key.equalsIgnoreCase(positionalArgumentName)) { Object argumentValue = commandScope.getArgumentValue(value); String argValue = (argumentValue != null ? argumentValue.toString() : null); if (argValue != null) { argsList.add(argValue); } return; } if (!finalLegacyCommandArguments.contains(key)) { return; } Object argumentValue = commandScope.getArgumentValue(value); String argValue = (argumentValue != null ? argumentValue.toString() : null); if (argValue != null) { argsList.add("--" + key); argsList.add(argumentValue.toString()); } }); String[] args = new String[argsList.size()]; argsList.toArray(args); return args; } protected String[] removeArgumentValues(String[] allArguments, String... argumentsThatTakeNoValue) { List returnArgs = new ArrayList<>(); Set argsToStrip = new HashSet<>(Arrays.asList(argumentsThatTakeNoValue)); final Iterator iterator = Arrays.asList(allArguments).iterator(); while (iterator.hasNext()) { final String arg = iterator.next(); returnArgs.add(arg); if (argsToStrip.contains(arg.replace("--", ""))) { if (iterator.hasNext()) { iterator.next(); } } } return returnArgs.toArray(new String[0]); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy