001: /*
002: * Options.java
003: *
004: * Copyright (C) 2007 Ferran Busquets
005: *
006: * This program is free software: you can redistribute it and/or modify
007: * it under the terms of the GNU General Public License as published by
008: * the Free Software Foundation, either version 3 of the License, or
009: * any later version.
010: *
011: * This program is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
014: * GNU General Public License for more details.
015: *
016: * You should have received a copy of the GNU General Public License
017: * along with this program. If not, see <http://www.gnu.org/licenses/>.
018: *
019: */
020:
021: package org.naturalcli;
022:
023: import java.util.Set;
024:
025: /**
026: * A set of commands understood by the CLI
027: *
028: * @author Ferran Busquets
029: */
030: public class NaturalCLI {
031:
032: private Set<Command> commands;
033:
034: private ParameterValidator pv;
035:
036: /**
037: * Creates a new instance.
038: *
039: * @param commands the set of commands that can be executed.
040: * @param pv the parameter validator.
041: */
042: public NaturalCLI(Set<Command> commands, ParameterValidator pv) {
043: this .commands = commands;
044: this .pv = pv;
045: }
046:
047: /**
048: * Creates a new instance with the default parameter validator.
049: *
050: * @param commands the set of commands that can be executed.
051: */
052: public NaturalCLI(Set<Command> commands) {
053: this (commands, new ParameterValidator());
054: }
055:
056: /**
057: * Runs a command based on the arguments.
058: *
059: * @param args the arguments to be parsed
060: * @param first the index on <code>args</code> of the first string for the arguments.
061: * @throws ExecutionException
062: */
063: public void execute(String[] args, int first)
064: throws ExecutionException {
065: if (args == null)
066: throw new IllegalArgumentException(
067: "The parameter for the arguments cannot be null.");
068: if (args.length == 0)
069: return;
070: // Look for the command that the parse works
071: ParseResult parseResult = null;
072: Command command = null;
073: for (Command c : commands)
074: try {
075: parseResult = c.getSyntax().parse(args, first, pv);
076: if (parseResult != null) {
077: command = c;
078: break;
079: }
080: } catch (UnknownParameterType e) {
081: throw new ExecutionException(
082: "Unknown parameter type when matching command.",
083: e);
084: }
085: if (command == null)
086: throw new ExecutionException("No command matches.");
087: // Execute the command
088: command.getExecutor().execute(parseResult);
089: }
090:
091: /**
092: * Runs a command based on the arguments.
093: *
094: * @param args the string arguments to run.
095: * @param first the index on <code>args</code> of the first string for the arguments.
096: * @throws ExecutionException
097: * @throws UnknownParameterType
098: */
099: public void execute(String args, int first)
100: throws ExecutionException {
101: if (args == null)
102: throw new IllegalArgumentException(
103: "The parameter argument string cannot be null.");
104: execute(args.split(" "), first);
105: }
106:
107: /**
108: * Runs a command based on the arguments.
109: *
110: * @param args the arguments to be parsed
111: * @throws ExecutionException
112: */
113: public void execute(String[] args) throws ExecutionException {
114: execute(args, 0);
115: }
116:
117: /**
118: * Runs a command based on the arguments in the string.
119: *
120: * @param args the string with the arguments to be parsed
121: * @throws ExecutionException
122: */
123: public void execute(String args) throws ExecutionException {
124: execute(args, 0);
125: }
126:
127: }
|