package org.cyclopsgroup.jmxterm.cc;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.commons.lang.Validate;
import org.cyclopsgroup.jcli.ArgumentProcessor;
import org.cyclopsgroup.jcli.annotation.Argument;
import org.cyclopsgroup.jcli.annotation.Cli;
import org.cyclopsgroup.jcli.annotation.MultiValue;
import org.cyclopsgroup.jmxterm.Command;
import org.cyclopsgroup.jmxterm.io.RuntimeIOException;
/**
* Command that display a help message
*
* @author <a href="mailto:jiaqi.guo@gmail.com">Jiaqi Guo</a>
*/
@Cli( name = "help", description = "Display available commands or usage of a command", note = "Run \"help [command1] [command2] ...\" to display usage or certain command(s). Help without argument shows list of available commands" )
public class HelpCommand
extends Command
{
private List<String> argNames = Collections.emptyList();
private CommandCenter commandCenter = null;
/**
* @inheritDoc
*/
@Override
public void execute()
{
Validate.notNull( commandCenter, "Command center hasn't been set yet" );
if ( argNames.isEmpty() )
{
List<String> commandNames = new ArrayList<String>( commandCenter.getCommandNames() );
Collections.sort( commandNames );
getSession().output.printMessage( "following commands are available to use:" );
for ( String commandName : commandNames )
{
Class<? extends Command> commandType = commandCenter.getCommandType( commandName );
org.cyclopsgroup.jcli.spi.Cli cli =
ArgumentProcessor.newInstance( commandType ).createParsingContext().cli();
getSession().output.println( String.format( "%-8s - %s", commandName, cli.getDescription() ) );
}
}
else
{
for ( String argName : argNames )
{
Class<? extends Command> commandType = commandCenter.getCommandType( argName );
if ( commandType == null )
{
throw new IllegalArgumentException( "Command " + argName + " is not found" );
}
ArgumentProcessor<Command> ap = ArgumentProcessor.newInstance( commandType );
try
{
ap.printHelp( new PrintWriter( System.out, true ) );
}
catch ( IOException e )
{
throw new RuntimeIOException( "Can't print help message", e );
}
}
}
}
/**
* @param argNames Array of arguments
*/
@MultiValue( listType = ArrayList.class )
@Argument
public final void setArgNames( List<String> argNames )
{
Validate.notNull( argNames, "argNames can't be NULL" );
this.argNames = argNames;
}
/**
* @param commandCenter CommandCenter object that calls this help command
*/
final void setCommandCenter( CommandCenter commandCenter )
{
Validate.notNull( commandCenter, "commandCenter can't be NULL" );
this.commandCenter = commandCenter;
}
}