package mil.nga.giat.geowave.core.cli.operations; import java.util.List; import java.util.SortedMap; import java.util.TreeMap; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.beust.jcommander.JCommander; import com.beust.jcommander.ParameterDescription; import com.beust.jcommander.Parameters; import mil.nga.giat.geowave.core.cli.annotations.GeowaveOperation; import mil.nga.giat.geowave.core.cli.api.Command; import mil.nga.giat.geowave.core.cli.api.DefaultOperation; import mil.nga.giat.geowave.core.cli.api.OperationParams; import mil.nga.giat.geowave.core.cli.parser.CommandLineOperationParams; @GeowaveOperation(name = "explain", parentOperation = GeowaveTopLevelSection.class) @Parameters(commandDescription = "See what arguments are missing and " + "what values will be used for GeoWave commands") public class ExplainCommand extends DefaultOperation implements Command { private static Logger LOGGER = LoggerFactory.getLogger(ExplainCommand.class); @Override public boolean prepare( OperationParams inputParams ) { super.prepare(inputParams); CommandLineOperationParams params = (CommandLineOperationParams) inputParams; params.setValidate(false); params.setAllowUnknown(true); // Prepared successfully. return true; } @Override public void execute( OperationParams inputParams ) { CommandLineOperationParams params = (CommandLineOperationParams) inputParams; StringBuilder builder = new StringBuilder(); // Sort first String nextCommand = "geowave"; JCommander commander = params.getCommander(); while (commander != null) { if (commander.getParameters() != null && commander.getParameters().size() > 0) { builder.append("Command: "); builder.append(nextCommand); builder.append(" [options]"); if (commander.getParsedCommand() != null) { builder.append(" <subcommand> ..."); } builder.append("\n\n"); builder.append(explainCommander(commander)); builder.append("\n"); } else if (commander.getMainParameter() != null) { builder.append("Command: "); builder.append(nextCommand); if (commander.getParsedCommand() != null) { builder.append(" <subcommand> ..."); } builder.append("\n\n"); builder.append(explainMainParameter(commander)); builder.append("\n"); } nextCommand = commander.getParsedCommand(); commander = commander.getCommands().get( nextCommand); } JCommander.getConsole().println( builder.toString().trim()); } /** * This function will explain the currently selected values for a * JCommander. * * @param commander */ public static StringBuilder explainCommander( JCommander commander ) { StringBuilder builder = new StringBuilder(); builder.append(" "); builder.append(String.format( "%1$20s", "VALUE")); builder.append(" "); builder.append("NEEDED "); builder.append(String.format( "%1$-40s", "PARAMETER NAMES")); builder.append("\n"); builder.append("----------------------------------------------\n"); // Sort first SortedMap<String, ParameterDescription> parameterDescs = new TreeMap<String, ParameterDescription>(); List<ParameterDescription> parameters = commander.getParameters(); for (ParameterDescription pd : parameters) { parameterDescs.put( pd.getLongestName(), pd); } // Then output for (ParameterDescription pd : parameterDescs.values()) { Object value = null; try { // value = tEntry.getParam().get(tEntry.getObject()); value = pd.getParameterized().get( pd.getObject()); } catch (Exception e) { LOGGER.warn( "Unable to set value", e); } boolean required = false; if (pd.getParameterized().getParameter() != null) { required = pd.getParameterized().getParameter().required(); } else if (pd.isDynamicParameter()) { required = pd.getParameter().getDynamicParameter().required(); } String names = pd.getNames(); boolean assigned = pd.isAssigned(); // Data we have: // required, assigned, value, names. builder.append("{"); if (value == null) { value = ""; } builder.append(String.format( "%1$20s", value)); builder.append("} "); if (required && !assigned) { builder.append("MISSING "); } else { builder.append(" "); } builder.append(String.format( "%1$-40s", StringUtils.join( names, ","))); builder.append("\n"); } if (commander.getMainParameter() != null) { builder.append("\n"); builder.append(explainMainParameter(commander)); } return builder; } /** * Output details about the main parameter, if there is one. * * @param commander * @return */ @SuppressWarnings("unchecked") public static StringBuilder explainMainParameter( JCommander commander ) { StringBuilder builder = new StringBuilder(); ParameterDescription mainParameter = commander.getMainParameter(); // Output the main parameter. if (mainParameter != null) { if (mainParameter.getDescription() != null && mainParameter.getDescription().length() > 0) { builder.append("Expects: "); builder.append(mainParameter.getDescription()); builder.append("\n"); } boolean assigned = mainParameter.isAssigned(); builder.append("Specified: "); List<String> mP = (List<String>) mainParameter.getParameterized().get( mainParameter.getObject()); if (!assigned || mP.size() == 0) { builder.append("<none specified>"); } else { builder.append(String.format( "%n%s", StringUtils.join( mP, " "))); } builder.append("\n"); } return builder; } }