/*
* NOTE: This copyright does *not* cover user programs that use HQ
* program services by normal system calls through the application
* program interfaces provided as part of the Hyperic Plug-in Development
* Kit or the Hyperic Client Development Kit - this is merely considered
* normal use of the program, and does *not* fall under the heading of
* "derived work".
*
* Copyright (C) [2004, 2005, 2006], Hyperic, Inc.
* This file is part of HQ.
*
* HQ is free software; you can redistribute it and/or modify
* it under the terms version 2 of the GNU General Public License as
* published by the Free Software Foundation. This program is distributed
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*/
package org.hyperic.util.shell;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.hyperic.util.PrintfFormat;
public class MultiwordShellCommand extends ShellCommandBase {
private Map itsSubHandlerMap = new TreeMap();
public ShellCommandHandler getSubHandler ( String subName ) {
return (ShellCommandHandler) itsSubHandlerMap.get(subName);
}
public Set getHandlerNames(){
return this.itsSubHandlerMap.keySet();
}
public void registerSubHandler ( String subName,
ShellCommandHandler handler )
throws ShellCommandInitException {
if ( !itsSubHandlerMap.containsValue(handler) ) {
// Only init the handler if it has not been added yet.
// We do this because a single handler could be
// registered for multiple subName's (as in the case
// of aliasing).
handler.init(getCommandName() + " " + subName, getShell());
}
itsSubHandlerMap.put(subName, handler);
}
public void processCommand(String[] args)
throws ShellCommandUsageException, ShellCommandExecException
{
String cmdName = getCommandName();
ShellCommandHandler handler;
String[] subArgs;
if(args.length < 1){
throw new ShellCommandUsageException(cmdName + " command " +
"requires an argument.");
}
handler = (ShellCommandHandler)
itsSubHandlerMap.get(args[0].toLowerCase());
if ( handler == null ) {
throw new ShellCommandUsageException("don't know how to " +cmdName+
" " + args[0]);
}
subArgs = new String[args.length - 1];
System.arraycopy(args, 1, subArgs, 0, subArgs.length);
handler.processCommand(subArgs);
}
public String getSyntaxArgs(){
StringBuffer res = new StringBuffer();
res.append("<");
for(Iterator i=this.getHandlerNames().iterator(); i.hasNext(); ){
res.append((String)i.next());
if(i.hasNext())
res.append(" | ");
}
res.append(">");
return res.toString();
}
public String getUsageHelp(String[] args) {
ShellCommandHandler handler;
String[] subArgs;
if(args.length == 0){
StringBuffer res = new StringBuffer();
Object[] fArgs = new Object[2];
PrintfFormat fmt;
String fmtStr;
int maxLen;
res.append(" " + this.getUsageShort());
res.append(".\n For further help on each subcommand, ");
res.append("type 'help ");
res.append(this.getCommandName() + " <subcommand>'\n\n");
maxLen = 0;
for(Iterator i=this.getHandlerNames().iterator(); i.hasNext(); ){
String cmdName = (String)i.next();
if(cmdName.length() > maxLen)
maxLen = cmdName.length();
}
fmtStr = " %-" + (maxLen + 1) + "s %s";
fmt = new PrintfFormat(fmtStr);
for(Iterator i=this.getHandlerNames().iterator(); i.hasNext(); ){
String cmdName = (String)i.next();
ShellCommandHandler sub = this.getSubHandler(cmdName);
fArgs[0] = cmdName + ":";
fArgs[1] = sub.getUsageShort();
res.append(fmt.sprintf(fArgs));
if(i.hasNext())
res.append("\n");
}
return res.toString();
}
if((handler = getSubHandler(args[0].toLowerCase())) == null)
return null;
subArgs = new String[args.length - 1];
System.arraycopy(args, 1, subArgs, 0, subArgs.length);
return handler.getUsageHelp(subArgs);
}
}