package org.cyclopsgroup.jmxterm.cc;
import java.util.Collections;
import java.util.Map;
import org.apache.commons.lang.Validate;
import org.cyclopsgroup.jmxterm.Command;
import org.cyclopsgroup.jmxterm.CommandFactory;
/**
* CommandFactory implementation based on a Map of command types
*
* @author <a href="mailto:jiaqi.guo@gmail.com">Jiaqi Guo</a>
*/
public class TypeMapCommandFactory
implements CommandFactory
{
private final Map<String, Class<? extends Command>> commandTypes;
/**
* @param commandTypes Map of command types
*/
public TypeMapCommandFactory( Map<String, Class<? extends Command>> commandTypes )
{
Validate.notNull( commandTypes, "Command type can't be NULL" );
this.commandTypes = Collections.unmodifiableMap( commandTypes );
}
/**
* @inheritDoc
*/
public Command createCommand( String commandName )
{
Validate.notNull( commandName, "commandName can't be NULL" );
Class<? extends Command> commandType = commandTypes.get( commandName );
if ( commandType == null )
{
throw new IllegalArgumentException( "Command " + commandName
+ " isn't valid, run help to see available commands" );
}
try
{
return commandType.newInstance();
}
catch ( InstantiationException e )
{
throw new RuntimeException( "Can't instantiate instance", e );
}
catch ( IllegalAccessException e )
{
throw new RuntimeException( "Illegal access", e );
}
}
/**
* @inheritDoc
*/
public Map<String, Class<? extends Command>> getCommandTypes()
{
return commandTypes;
}
}