// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: MIT-0 package aws.proserve.bcs.dr.lambda.cmd; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * An abstract command which helps build a reified command. *

* The recursive generics of this class is to assist returning itself for chained invocation. */ public class CommandBase> implements Command { protected final Logger log = LogManager.getLogger(getClass()); private final List tokens = new ArrayList<>(); private final Map exports = new HashMap<>(); @Override public final List asList() { return Collections.unmodifiableList(tokens); } @Override public final String asString() { final var export = exports.isEmpty() ? "" : exports.entrySet().stream() .map(e -> String.format("export %s=%s; ", e.getKey(), e.getValue())) .collect(Collectors.joining()); return export + String.join(" ", asList()); } @Override public Map getExports() { return Collections.unmodifiableMap(exports); } /** * Exports a key-value pair. It would be exported by the Linux {@code export} keyword. * * @param key the key value * @param value the value to be exported */ public final T export(final String key, final String value) { exports.put(key, value); return (T) this; } /** * Adds a Boolean token. */ protected final T add(final boolean token) { return add(String.valueOf(token)); } /** * Adds a character token. */ protected final T add(final char token) { return add(String.valueOf(token)); } /** * Adds an integer token. */ protected final T add(final int token) { return add(String.valueOf(token)); } /** * Adds a long integer token. */ protected final T add(final long token) { return add(String.valueOf(token)); } /** * Adds a string token. */ protected final T add(final String token) { tokens.add(token); return (T) this; } /** * Adds a key-value pair with a Boolean value, separated by a space. */ protected final T add(final String key, final boolean value) { return add(key, String.valueOf(value)); } /** * Adds a key-value pair with an integer value, separated by a space. */ protected final T add(final String key, final int value) { return add(key, String.valueOf(value)); } /** * Adds a key-value pair with a long integer value, separated by a space. */ protected final T add(final String key, final long value) { return add(key, String.valueOf(value)); } /** * Adds a key-value pair with a string value, separated by a space. */ protected final T add(final String key, final String value) { return add(key).add(value); } /** * Adds a key-value pair with a Boolean value, separated by an equal sign. */ protected final T addWithEqual(final String key, final boolean value) { return addWithEqual(key, String.valueOf(value)); } /** * Adds a key-value pair with an integer value, separated by an equal sign. */ protected final T addWithEqual(final String key, final int value) { return addWithEqual(key, String.valueOf(value)); } /** * Adds a key-value pair with a long value, separated by an equal sign. */ protected final T addWithEqual(final String key, final long value) { return addWithEqual(key, String.valueOf(value)); } /** * Adds a key-value pair with a string value, separated by an equal sign. */ protected final T addWithEqual(final String key, final String value) { tokens.add(key + '=' + value); return (T) this; } /** * Creates a piped command with another command. * * @param command a command to receive the output in a piped way. */ public final T pipe(Command command) { return add('|').add(command.asString()); } @Override public final String toString() { return asString(); } }