aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorrac61@labyrinth.cl.cam.ac.uk <rac61@labyrinth.cl.cam.ac.uk>2003-07-03 15:01:39 +0000
committerrac61@labyrinth.cl.cam.ac.uk <rac61@labyrinth.cl.cam.ac.uk>2003-07-03 15:01:39 +0000
commit9ef2e22b2beb3e8676fe4b92d2266e35607accb4 (patch)
tree64b24b92ac2d6a6f568a2894b0e96d84167e045f /tools
parente754439838ee86462679c3082bc4573b57855ba7 (diff)
downloadxen-9ef2e22b2beb3e8676fe4b92d2266e35607accb4.tar.gz
xen-9ef2e22b2beb3e8676fe4b92d2266e35607accb4.tar.bz2
xen-9ef2e22b2beb3e8676fe4b92d2266e35607accb4.zip
bitkeeper revision 1.263 (3f044553Casub9OwqMoobhkY4qWGpQ)
Apply Composite pattern to add recursive command parsing; this allows commands to be in groups so that the user interface isn't quite so unwieldy. In order to make this sensible, rename the domain classes to indicate better what they are.
Diffstat (limited to 'tools')
-rw-r--r--tools/control/src/org/xenoserver/cmdline/CommandParser.java73
-rw-r--r--tools/control/src/org/xenoserver/cmdline/Main.java58
-rw-r--r--tools/control/src/org/xenoserver/cmdline/ParseDomainDestroy.java (renamed from tools/control/src/org/xenoserver/cmdline/ParseDestroy.java)11
-rw-r--r--tools/control/src/org/xenoserver/cmdline/ParseDomainList.java (renamed from tools/control/src/org/xenoserver/cmdline/ParseList.java)11
-rw-r--r--tools/control/src/org/xenoserver/cmdline/ParseDomainNew.java (renamed from tools/control/src/org/xenoserver/cmdline/ParseNew.java)11
-rw-r--r--tools/control/src/org/xenoserver/cmdline/ParseDomainStart.java (renamed from tools/control/src/org/xenoserver/cmdline/ParseStart.java)11
-rw-r--r--tools/control/src/org/xenoserver/cmdline/ParseDomainStop.java (renamed from tools/control/src/org/xenoserver/cmdline/ParseStop.java)11
-rw-r--r--tools/control/src/org/xenoserver/cmdline/ParseGroup.java77
-rw-r--r--tools/control/src/org/xenoserver/cmdline/ParseHelp.java32
-rw-r--r--tools/control/src/org/xenoserver/control/CommandDomainDestroy.java (renamed from tools/control/src/org/xenoserver/control/CommandDestroy.java)6
-rw-r--r--tools/control/src/org/xenoserver/control/CommandDomainList.java (renamed from tools/control/src/org/xenoserver/control/CommandList.java)6
-rw-r--r--tools/control/src/org/xenoserver/control/CommandDomainNew.java (renamed from tools/control/src/org/xenoserver/control/CommandNew.java)6
-rw-r--r--tools/control/src/org/xenoserver/control/CommandDomainStart.java (renamed from tools/control/src/org/xenoserver/control/CommandStart.java)6
-rw-r--r--tools/control/src/org/xenoserver/control/CommandDomainStop.java (renamed from tools/control/src/org/xenoserver/control/CommandStop.java)6
14 files changed, 209 insertions, 116 deletions
diff --git a/tools/control/src/org/xenoserver/cmdline/CommandParser.java b/tools/control/src/org/xenoserver/cmdline/CommandParser.java
index 3f4fc85032..e5dc21b658 100644
--- a/tools/control/src/org/xenoserver/cmdline/CommandParser.java
+++ b/tools/control/src/org/xenoserver/cmdline/CommandParser.java
@@ -1,5 +1,9 @@
package org.xenoserver.cmdline;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
import org.xenoserver.control.Command;
import org.xenoserver.control.CommandFailedException;
import org.xenoserver.control.Defaults;
@@ -20,51 +24,64 @@ public abstract class CommandParser {
* @throws ParseFailedException if the arguments are not suitable.
* @throws CommandFailedException if the command did not execute successfully.
*/
- public abstract void parse(Defaults d, String args[]) throws ParseFailedException, CommandFailedException;
+ public abstract void parse(Defaults d, LinkedList args)
+ throws ParseFailedException, CommandFailedException;
- /** Return the command name which will be matched on the command line. */
- public abstract String getName();
+ /** Return the command name which will be matched on the command line. */
+ public abstract String getName();
/** Return a usage string for this command. */
public abstract String getUsage();
/** Return the help text for this command. */
public abstract String getHelpText();
-
- public String getStringParameter(String args[], char key, String def)
+
+ /** Print a usage string for this command. */
+ public void printUsage(String prefix)
+ {
+ String name = getName();
+ if ( prefix != null )
+ name = prefix + " " + name;
+ String usage = getUsage();
+ while (name.length() < 16)
+ name = name + " ";
+ System.out.println(" " + name + usage);
+ }
+
+ /** Prints the help text for this command. */
+ public void printHelpText(LinkedList args)
{
- String r = getParameter (args, key);
+ System.out.println(getName() + " " + getUsage());
+ System.out.println();
+ System.out.println(getHelpText());
+ }
+
+ public String getStringParameter(List args, char key, String def) {
+ String r = getParameter(args, key);
return (r == null) ? def : r;
}
- public int getIntParameter(String args[], char key, int def)
- {
- String r = getParameter (args, key);
- return (r == null) ? def : (Integer.parseInt (r));
+ public int getIntParameter(List args, char key, int def) {
+ String r = getParameter(args, key);
+ return (r == null) ? def : (Integer.parseInt(r));
}
- public boolean getFlagParameter(String args[], char key)
- {
- String r = getParameter (args, key);
+ public boolean getFlagParameter(List args, char key) {
+ String r = getParameter(args, key);
return (r == null) ? false : true;
}
- protected String getParameter (String args[], char key)
- {
- int i;
+ protected String getParameter(List args, char key) {
String result = null;
- for (i = 0; i < args.length; i ++)
- {
- if (args[i].startsWith("-" + key))
- {
- if (args[i].length() > 2)
- {
- result = args[i].substring(2, args[i].length());
+ Iterator i = args.iterator();
+ while ( i.hasNext() ) {
+ String arg = (String) i.next();
+ if (arg.startsWith("-" + key)) {
+ if (arg.length() > 2) {
+ result = arg.substring(2);
+ } else {
+ result = "";
}
- else
- {
- result = "";
- }
- }
}
+ }
return result;
}
}
diff --git a/tools/control/src/org/xenoserver/cmdline/Main.java b/tools/control/src/org/xenoserver/cmdline/Main.java
index a85c1923a7..b21aba57b3 100644
--- a/tools/control/src/org/xenoserver/cmdline/Main.java
+++ b/tools/control/src/org/xenoserver/cmdline/Main.java
@@ -1,46 +1,46 @@
package org.xenoserver.cmdline;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
import org.xenoserver.control.CommandFailedException;
import org.xenoserver.control.Defaults;
public class Main {
- private static ParseHelp help = new ParseHelp();
- static CommandParser commands[] =
+ static final ParseHelp help = new ParseHelp();
+ static final CommandParser domaincommands[] =
+ { new ParseDomainNew(),
+ new ParseDomainStart(),
+ new ParseDomainStop(),
+ new ParseDomainDestroy(),
+ new ParseDomainList()
+ };
+ static final CommandParser commands[] =
{ help,
- new ParseNew(),
- new ParseStart(),
- new ParseStop(),
- new ParseDestroy(),
- new ParseList() };
+ new ParseGroup( "domain", domaincommands )
+ };
+ static final CommandParser parser = new ParseGroup( null, commands );
public static void main(String[] args) {
Defaults d = new Defaults();
int ec = -1;
+ LinkedList arglist = new LinkedList();
+ for ( int i=0; i<args.length; i++ )
+ arglist.add( args[i] );
if (args.length == 0) {
- help.parse(d, args);
+ help.parse(d, arglist);
} else {
- String c = args[0];
- int i;
- for (i = 0; i < commands.length; i++) {
- if (commands[i].getName().equals(c)) {
- if (commands[i].getFlagParameter(args, '?')) {
- help.doHelpFor(commands[i]);
- } else {
- try {
- commands[i].parse(d, args);
- ec = 0;
- } catch (ParseFailedException e) {
- System.err.println( e.getMessage() );
- } catch (CommandFailedException e) {
- System.err.println( e.getMessage() );
- }
- }
- break;
- }
- }
- if (i == commands.length) {
- System.out.println("Unknown command " + c);
+ try
+ {
+ parser.parse(d, arglist);
+ ec = 0;
+ } catch (ParseFailedException e) {
+ System.err.println( e.getMessage() );
+ } catch (CommandFailedException e) {
+ System.err.println( e.getMessage() );
}
}
diff --git a/tools/control/src/org/xenoserver/cmdline/ParseDestroy.java b/tools/control/src/org/xenoserver/cmdline/ParseDomainDestroy.java
index 4368c9d3da..ffbe324161 100644
--- a/tools/control/src/org/xenoserver/cmdline/ParseDestroy.java
+++ b/tools/control/src/org/xenoserver/cmdline/ParseDomainDestroy.java
@@ -1,12 +1,15 @@
package org.xenoserver.cmdline;
+import java.util.LinkedList;
+import java.util.List;
+
import org.xenoserver.control.Command;
-import org.xenoserver.control.CommandDestroy;
+import org.xenoserver.control.CommandDomainDestroy;
import org.xenoserver.control.CommandFailedException;
import org.xenoserver.control.Defaults;
-public class ParseDestroy extends CommandParser {
- public void parse(Defaults d, String[] args) throws ParseFailedException, CommandFailedException {
+public class ParseDomainDestroy extends CommandParser {
+ public void parse(Defaults d, LinkedList args) throws ParseFailedException, CommandFailedException {
int domain_id = getIntParameter(args, 'n', 0);
boolean force = getFlagParameter(args, 'f');
@@ -14,7 +17,7 @@ public class ParseDestroy extends CommandParser {
throw new ParseFailedException("Expected -n<domain_id>");
}
- String output = new CommandDestroy(d, domain_id, force).execute();
+ String output = new CommandDomainDestroy(d, domain_id, force).execute();
if ( output != null )
System.out.println( output );
}
diff --git a/tools/control/src/org/xenoserver/cmdline/ParseList.java b/tools/control/src/org/xenoserver/cmdline/ParseDomainList.java
index 72d81c5af4..193d5ac0c8 100644
--- a/tools/control/src/org/xenoserver/cmdline/ParseList.java
+++ b/tools/control/src/org/xenoserver/cmdline/ParseDomainList.java
@@ -1,15 +1,18 @@
package org.xenoserver.cmdline;
+import java.util.LinkedList;
+import java.util.List;
+
import org.xenoserver.control.Command;
import org.xenoserver.control.CommandFailedException;
-import org.xenoserver.control.CommandList;
+import org.xenoserver.control.CommandDomainList;
import org.xenoserver.control.Defaults;
import org.xenoserver.control.Domain;
-public class ParseList extends CommandParser {
+public class ParseDomainList extends CommandParser {
- public void parse(Defaults d, String[] args) throws ParseFailedException, CommandFailedException {
- CommandList list = new CommandList(d);
+ public void parse(Defaults d, LinkedList args) throws ParseFailedException, CommandFailedException {
+ CommandDomainList list = new CommandDomainList(d);
String output = list.execute();
if ( output != null )
System.out.println( output );
diff --git a/tools/control/src/org/xenoserver/cmdline/ParseNew.java b/tools/control/src/org/xenoserver/cmdline/ParseDomainNew.java
index 5ddfd7a3cf..bab3778fce 100644
--- a/tools/control/src/org/xenoserver/cmdline/ParseNew.java
+++ b/tools/control/src/org/xenoserver/cmdline/ParseDomainNew.java
@@ -1,13 +1,16 @@
package org.xenoserver.cmdline;
+import java.util.LinkedList;
+import java.util.List;
+
import org.xenoserver.control.Command;
import org.xenoserver.control.CommandFailedException;
-import org.xenoserver.control.CommandNew;
+import org.xenoserver.control.CommandDomainNew;
import org.xenoserver.control.Defaults;
-public class ParseNew extends CommandParser {
+public class ParseDomainNew extends CommandParser {
- public void parse(Defaults d, String[] args) throws ParseFailedException, CommandFailedException {
+ public void parse(Defaults d, LinkedList args) throws ParseFailedException, CommandFailedException {
String name = getStringParameter(args, 'n', d.domainName);
int size = getIntParameter(args, 'k', d.domainSizeKB);
String image = getStringParameter(args, 'i', d.domainImage);
@@ -24,7 +27,7 @@ public class ParseNew extends CommandParser {
d.describe();
- CommandNew c = new CommandNew(d, name, size, image, initrd, vifs,
+ CommandDomainNew c = new CommandDomainNew(d, name, size, image, initrd, vifs,
bargs, root_dev, nfs_root_path,
nw_ip, nw_gw, nw_mask, nw_nfs_server, nw_host);
c.execute();
diff --git a/tools/control/src/org/xenoserver/cmdline/ParseStart.java b/tools/control/src/org/xenoserver/cmdline/ParseDomainStart.java
index 435e36a1f2..b615907d1e 100644
--- a/tools/control/src/org/xenoserver/cmdline/ParseStart.java
+++ b/tools/control/src/org/xenoserver/cmdline/ParseDomainStart.java
@@ -1,20 +1,23 @@
package org.xenoserver.cmdline;
+import java.util.LinkedList;
+import java.util.List;
+
import org.xenoserver.control.Command;
import org.xenoserver.control.CommandFailedException;
-import org.xenoserver.control.CommandStart;
+import org.xenoserver.control.CommandDomainStart;
import org.xenoserver.control.Defaults;
-public class ParseStart extends CommandParser {
+public class ParseDomainStart extends CommandParser {
- public void parse(Defaults d, String[] args) throws ParseFailedException, CommandFailedException {
+ public void parse(Defaults d, LinkedList args) throws ParseFailedException, CommandFailedException {
int domain_id = getIntParameter(args, 'n', 0);
if (domain_id == 0) {
throw new ParseFailedException("Expected -n<domain_id>");
}
- String output = new CommandStart(d, domain_id).execute();
+ String output = new CommandDomainStart(d, domain_id).execute();
if ( output != null )
System.out.println( output );
}
diff --git a/tools/control/src/org/xenoserver/cmdline/ParseStop.java b/tools/control/src/org/xenoserver/cmdline/ParseDomainStop.java
index 30aeadbdec..40bc152f58 100644
--- a/tools/control/src/org/xenoserver/cmdline/ParseStop.java
+++ b/tools/control/src/org/xenoserver/cmdline/ParseDomainStop.java
@@ -1,20 +1,23 @@
package org.xenoserver.cmdline;
+import java.util.LinkedList;
+import java.util.List;
+
import org.xenoserver.control.Command;
import org.xenoserver.control.CommandFailedException;
-import org.xenoserver.control.CommandStop;
+import org.xenoserver.control.CommandDomainStop;
import org.xenoserver.control.Defaults;
-public class ParseStop extends CommandParser {
+public class ParseDomainStop extends CommandParser {
- public void parse(Defaults d, String[] args) throws ParseFailedException, CommandFailedException {
+ public void parse(Defaults d, LinkedList args) throws ParseFailedException, CommandFailedException {
int domain_id = getIntParameter(args, 'n', 0);
if (domain_id == 0) {
throw new ParseFailedException("Expected -n<domain_id>");
}
- String output = new CommandStop(d, domain_id).execute();
+ String output = new CommandDomainStop(d, domain_id).execute();
if ( output != null )
System.out.println( output );
}
diff --git a/tools/control/src/org/xenoserver/cmdline/ParseGroup.java b/tools/control/src/org/xenoserver/cmdline/ParseGroup.java
new file mode 100644
index 0000000000..1903dc4b2d
--- /dev/null
+++ b/tools/control/src/org/xenoserver/cmdline/ParseGroup.java
@@ -0,0 +1,77 @@
+package org.xenoserver.cmdline;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.xenoserver.control.CommandFailedException;
+import org.xenoserver.control.Defaults;
+
+public class ParseGroup extends CommandParser {
+ private final String name;
+ private final CommandParser[] commands;
+
+ /**
+ * Constructor for ParseGroup.
+ * @param name Name of this group of commands
+ * @param commands Array of commands to include
+ */
+ public ParseGroup(String name, CommandParser[] commands) {
+ this.name = name;
+ this.commands = commands;
+ }
+
+ public void parse(Defaults d, LinkedList args) throws ParseFailedException, CommandFailedException {
+ int i;
+ String c = (String) args.removeFirst();
+ for (i = 0; i < commands.length; i++) {
+ if (commands[i].getName().equals(c)) {
+ if (getFlagParameter(args, '?')) {
+ commands[i].printHelpText(null);
+ } else {
+ commands[i].parse(d, args);
+ }
+ break;
+ }
+ }
+ if (i == commands.length) {
+ throw new ParseFailedException("Unknown command " + c);
+ }
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getUsage() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String getHelpText() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public void printUsage(String prefix) {
+ if ( prefix == null )
+ prefix = name;
+ else
+ prefix += " " + name;
+ for ( int i=0; i<commands.length; i++ )
+ commands[i].printUsage(prefix);
+ }
+
+ public void printHelpText(LinkedList args) {
+ if ( name != null )
+ System.out.print( name + " " );
+ int i;
+ String c = (String) args.removeFirst();
+ for (i = 0; i < commands.length; i++) {
+ if (commands[i].getName().equals(c)) {
+ commands[i].printHelpText(args);
+ break;
+ }
+ }
+ }
+}
diff --git a/tools/control/src/org/xenoserver/cmdline/ParseHelp.java b/tools/control/src/org/xenoserver/cmdline/ParseHelp.java
index 0a8362e53d..4d204c8ba4 100644
--- a/tools/control/src/org/xenoserver/cmdline/ParseHelp.java
+++ b/tools/control/src/org/xenoserver/cmdline/ParseHelp.java
@@ -1,41 +1,25 @@
package org.xenoserver.cmdline;
+import java.util.LinkedList;
+import java.util.List;
+
import org.xenoserver.control.Command;
import org.xenoserver.control.Defaults;
public class ParseHelp extends CommandParser {
- public void parse(Defaults d, String[] args) {
- if (args.length <= 1) {
+ public void parse(Defaults d, LinkedList args) {
+ if (args.size() == 0) {
System.out.println("Usage:");
- for (int i = 0; i < Main.commands.length; i++) {
- String name = Main.commands[i].getName();
- String usage = Main.commands[i].getUsage();
- while (name.length() < 12)
- name = name + " ";
- System.out.println(" " + name + usage);
- }
+ Main.parser.printUsage(null);
} else {
- for (int i = 0; i < Main.commands.length; i++) {
- String name = Main.commands[i].getName();
- String usage = Main.commands[i].getUsage();
- if (name.equals(args[1])) {
- doHelpFor(Main.commands[i]);
- break;
- }
- }
+ System.out.print("xenctl ");
+ Main.parser.printHelpText(args);
}
System.out.println("");
}
- public void doHelpFor(CommandParser c)
- {
- System.out.println ("xenctl " + c.getName() + " " + c.getUsage());
- System.out.println ();
- System.out.println (c.getHelpText ());
- }
-
public String getName()
{
return "help";
diff --git a/tools/control/src/org/xenoserver/control/CommandDestroy.java b/tools/control/src/org/xenoserver/control/CommandDomainDestroy.java
index bc1f65e193..6bb66167ae 100644
--- a/tools/control/src/org/xenoserver/control/CommandDestroy.java
+++ b/tools/control/src/org/xenoserver/control/CommandDomainDestroy.java
@@ -3,19 +3,19 @@ package org.xenoserver.control;
/**
* Destroys a domain.
*/
-public class CommandDestroy extends Command {
+public class CommandDomainDestroy extends Command {
private Defaults d;
private int domain_id;
private boolean force;
/**
- * Constructor for CommandDestroy.
+ * Constructor for CommandDomainDestroy.
*
* @param d Defaults object to use.
* @param domain_id Domain ID number to destroy.
* @param force Force destruction.
*/
- public CommandDestroy(Defaults d, int domain_id, boolean force) {
+ public CommandDomainDestroy(Defaults d, int domain_id, boolean force) {
this.d = d;
this.domain_id = domain_id;
this.force = force;
diff --git a/tools/control/src/org/xenoserver/control/CommandList.java b/tools/control/src/org/xenoserver/control/CommandDomainList.java
index af2622553f..39ccd383e1 100644
--- a/tools/control/src/org/xenoserver/control/CommandList.java
+++ b/tools/control/src/org/xenoserver/control/CommandDomainList.java
@@ -9,15 +9,15 @@ import java.util.Vector;
* Lists details of all domains. After execute() has been called, call
* domains() to get the array of domains.
*/
-public class CommandList extends Command {
+public class CommandDomainList extends Command {
private Defaults d;
private Domain[] array;
/**
- * Constructor for CommandList.
+ * Constructor for CommandDomainList.
* @param d Defaults object to use.
*/
- public CommandList(Defaults d) {
+ public CommandDomainList(Defaults d) {
this.d = d;
}
diff --git a/tools/control/src/org/xenoserver/control/CommandNew.java b/tools/control/src/org/xenoserver/control/CommandDomainNew.java
index 4f32e97b64..50fa6da5dc 100644
--- a/tools/control/src/org/xenoserver/control/CommandNew.java
+++ b/tools/control/src/org/xenoserver/control/CommandDomainNew.java
@@ -14,7 +14,7 @@ import java.util.zip.GZIPInputStream;
* Creates a new domain. As this command returns a multi-line result,
* call output() to get an array of strings.
*/
-public class CommandNew extends Command {
+public class CommandDomainNew extends Command {
private Defaults d;
private String name;
private int size;
@@ -36,7 +36,7 @@ public class CommandNew extends Command {
}
/**
- * Constructor for CommandNew.
+ * Constructor for CommandDomainNew.
* @param d Defaults object to use.
* @param name Name for the domain.
* @param size Memory size for the domain.
@@ -52,7 +52,7 @@ public class CommandNew extends Command {
* @param nw_nfs_server NFS server to be used by the domain.
* @param nw_host Hostname to be used by the domain.
*/
- public CommandNew(
+ public CommandDomainNew(
Defaults d,
String name,
int size,
diff --git a/tools/control/src/org/xenoserver/control/CommandStart.java b/tools/control/src/org/xenoserver/control/CommandDomainStart.java
index 7722ccd5af..1719da233e 100644
--- a/tools/control/src/org/xenoserver/control/CommandStart.java
+++ b/tools/control/src/org/xenoserver/control/CommandDomainStart.java
@@ -3,16 +3,16 @@ package org.xenoserver.control;
/**
* Starts a domain.
*/
-public class CommandStart extends Command {
+public class CommandDomainStart extends Command {
private Defaults d;
private int domain_id;
/**
- * Constructor for CommandStart.
+ * Constructor for CommandDomainStart.
* @param d Defaults object to use.
* @param domain_id Domain to start.
*/
- public CommandStart(Defaults d, int domain_id) {
+ public CommandDomainStart(Defaults d, int domain_id) {
this.d = d;
this.domain_id = domain_id;
}
diff --git a/tools/control/src/org/xenoserver/control/CommandStop.java b/tools/control/src/org/xenoserver/control/CommandDomainStop.java
index d280875dfb..b66fae6ee1 100644
--- a/tools/control/src/org/xenoserver/control/CommandStop.java
+++ b/tools/control/src/org/xenoserver/control/CommandDomainStop.java
@@ -3,16 +3,16 @@ package org.xenoserver.control;
/**
* Stops a domain.
*/
-public class CommandStop extends Command {
+public class CommandDomainStop extends Command {
private Defaults d;
private int domain_id;
/**
- * Constructor for CommandStop.
+ * Constructor for CommandDomainStop.
* @param d The defaults object to use.
* @param domain_id The domain to stop.
*/
- public CommandStop(Defaults d, int domain_id) {
+ public CommandDomainStop(Defaults d, int domain_id) {
this.d = d;
this.domain_id = domain_id;
}