package org.cyclopsgroup.jmxterm;
import java.io.IOException;
import java.util.List;
import javax.management.JMException;
import org.apache.commons.lang.Validate;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.cyclopsgroup.jcli.AutoCompletable;
import org.cyclopsgroup.jcli.annotation.Option;
/**
* Base class of all commands. Command is executed in single thread. Extending classes don't need to worry about
* concurrency. Command is transient, every command in console creates a new instance of Command object which is
* disposed after execution finishes.
*
* @author <a href="mailto:jiaqi.guo@gmail.com">Jiaqi Guo</a>
*/
public abstract class Command
implements AutoCompletable
{
private static final Log LOG = LogFactory.getLog( Command.class );
private boolean help;
private Session session;
/**
* Provide a list of possible arguments for auto completion. This method returns list of arguments(not option) and
* is called when user presses tab key.
*
* @return List of possible arguments used by auto completion or NULL
* @throws IOException IO errors
* @throws JMException JMX problemo
*/
protected List<String> doSuggestArgument()
throws IOException, JMException
{
return null;
}
/**
* Provide a list of possible option values for auto completion
*
* @param optionName Name of option
* @return List of possible arguments used by auto completion or NULL
* @throws IOException Network communication errors
* @throws JMException JMX errors
*/
protected List<String> doSuggestOption( String optionName )
throws IOException, JMException
{
return null;
}
/**
* Execute command
*
* @throws IOException IO errors
* @throws JMException JMX errors
*/
public abstract void execute()
throws IOException, JMException;
/**
* @return Session where command runs
*/
public final Session getSession()
{
return session;
}
/**
* @return True if help option is on
*/
public final boolean isHelp()
{
return help;
}
/**
* @param help True to display usage
*/
@Option( name = "h", longName = "help", description = "Display usage" )
public final void setHelp( boolean help )
{
this.help = help;
}
/**
* @param session Session where command runs
*/
public final void setSession( Session session )
{
Validate.notNull( session, "Session can't be NULL" );
this.session = session;
}
/**
* @inheritDoc
*/
public final List<String> suggestArgument( String partialArg )
{
if ( partialArg != null )
{
return null;
}
try
{
return doSuggestArgument();
}
catch ( IOException e )
{
if ( LOG.isDebugEnabled() )
{
LOG.debug( "Couldn't suggest option", e );
}
return null;
}
catch ( JMException e )
{
if ( LOG.isDebugEnabled() )
{
LOG.debug( "Couldn't suggest option", e );
}
return null;
}
}
/**
* @inheritDoc
*/
public final List<String> suggestOption( String name, String partialValue )
{
if ( partialValue != null )
{
return null;
}
try
{
return doSuggestOption( name );
}
catch ( IOException e )
{
if ( LOG.isDebugEnabled() )
{
LOG.debug( "Couldn't suggest option", e );
}
return null;
}
catch ( JMException e )
{
if ( LOG.isDebugEnabled() )
{
LOG.debug( "Couldn't suggest option", e );
}
return null;
}
}
}