From 9b508e014d99015e370d43973651755f33ec6b67 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sat, 14 May 2011 16:12:57 +0200 Subject: [PATCH] initial drop of scm-cli-client --- .../src/main/java/sonia/scm/cli/App.java | 175 ++++++++++++++- .../src/main/java/sonia/scm/cli/Command.java | 53 +++++ .../java/sonia/scm/cli/CommandDescriptor.java | 198 +++++++++++++++++ .../src/main/java/sonia/scm/cli/I18n.java | 46 ++++ .../main/java/sonia/scm/cli/SubCommand.java | 175 +++++++++++++++ .../java/sonia/scm/cli/SubCommandHandler.java | 200 ++++++++++++++++++ 6 files changed, 846 insertions(+), 1 deletion(-) create mode 100644 scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/Command.java create mode 100644 scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/CommandDescriptor.java create mode 100644 scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/I18n.java create mode 100644 scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/SubCommand.java create mode 100644 scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/SubCommandHandler.java diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/App.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/App.java index b2abd3b58c..ab66ffb802 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/App.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/App.java @@ -33,6 +33,30 @@ package sonia.scm.cli; +//~--- non-JDK imports -------------------------------------------------------- + +import org.kohsuke.args4j.Argument; +import org.kohsuke.args4j.CmdLineException; +import org.kohsuke.args4j.CmdLineParser; +import org.kohsuke.args4j.Option; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import sonia.scm.client.ScmClient; +import sonia.scm.client.ScmClientSession; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; + +import java.util.ArrayList; +import java.util.List; + /** * * @author Sebastian Sdorra @@ -40,11 +64,160 @@ package sonia.scm.cli; public class App { + /** the logger for App */ + private static final Logger logger = LoggerFactory.getLogger(App.class); + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + */ + public App() + { + this(System.in, System.out); + } + + /** + * Constructs ... + * + * + * @param input + * @param output + */ + public App(BufferedReader input, PrintWriter output) + { + this.input = input; + this.output = output; + } + + /** + * Constructs ... + * + * + * @param input + * @param output + */ + public App(InputStream input, OutputStream output) + { + this.input = new BufferedReader(new InputStreamReader(input)); + this.output = new PrintWriter(output); + } + + //~--- methods -------------------------------------------------------------- + /** * Method description * * * @param args */ - public static void main(String[] args) {} + public static void main(String[] args) + { + new App().run(args); + } + + /** + * Method description + * + * + * @param args + */ + protected void run(String[] args) + { + CmdLineParser parser = new CmdLineParser(this); + + try + { + parser.parseArgument(args); + } + catch (CmdLineException ex) + { + + // todo error handling + logger.warn("could not parse commandline", ex); + System.exit(1); + } + + if ((args.length == 0) || (subcommand == null) || help) + { + parser.printUsage(output, I18n.getBundle()); + } + else + { + ScmClientSession session = null; + + if (subcommand.isSessionRequired()) + { + session = createSession(); + } + + subcommand.init(input, output, session); + subcommand.run(arguments); + } + } + + /** + * Method description + * + * + * @return + */ + private ScmClientSession createSession() + { + return ScmClient.createSession(serverUrl, username, password); + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + @Option( + name = "--help", + usage = "optionHelpText", + aliases = { "-h" } + ) + private boolean help = false; + + /** Field description */ + @Argument(index = 1, metaVar = "metaVar_arg") + private List arguments = new ArrayList(); + + /** Field description */ + private BufferedReader input; + + /** Field description */ + private PrintWriter output; + + /** Field description */ + @Option( + name = "--password", + usage = "optionPassword", + aliases = { "-p" } + ) + private String password; + + /** Field description */ + @Option( + name = "--server", + usage = "optionServerUrl", + aliases = { "-s" } + ) + private String serverUrl; + + /** Field description */ + @Argument( + index = 0, + metaVar = "metaVar_command", + required = true, + handler = SubCommandHandler.class + ) + private SubCommand subcommand; + + /** Field description */ + @Option( + name = "--user", + usage = "optionUsername", + aliases = { "-u" } + ) + private String username; } diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/Command.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/Command.java new file mode 100644 index 0000000000..ccb0bc380d --- /dev/null +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/Command.java @@ -0,0 +1,53 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.cli; + +//~--- JDK imports ------------------------------------------------------------ + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * + * @author Sebastian Sdorra + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +public @interface Command +{ + String value() default ""; + String usage() default ""; + boolean sessionRequired() default true; +} diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/CommandDescriptor.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/CommandDescriptor.java new file mode 100644 index 0000000000..ce2be616b3 --- /dev/null +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/CommandDescriptor.java @@ -0,0 +1,198 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.cli; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import sonia.scm.util.AssertUtil; +import sonia.scm.util.Util; + +/** + * + * @author Sebastian Sdorra + */ +public class CommandDescriptor +{ + + /** the logger for CommandDescriptor */ + private static final Logger logger = + LoggerFactory.getLogger(CommandDescriptor.class); + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + * + * @param commandClass + */ + public CommandDescriptor(Class commandClass) + { + AssertUtil.assertIsNotNull(commandClass); + + Command cmd = commandClass.getAnnotation(Command.class); + + if (cmd != null) + { + this.name = cmd.value(); + this.usage = cmd.usage(); + this.sessionRequired = cmd.sessionRequired(); + } + + if (Util.isEmpty(name)) + { + name = commandClass.getSimpleName(); + } + } + + /** + * Constructs ... + * + * + * @param name + * @param usage + * @param sessionRequired + * @param commandClass + */ + public CommandDescriptor(String name, String usage, boolean sessionRequired, + Class commandClass) + { + this.name = name; + this.usage = usage; + this.sessionRequired = sessionRequired; + this.commandClass = commandClass; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + public SubCommand createSubCommand() + { + SubCommand command = null; + + try + { + command = commandClass.newInstance(); + command.setName(name); + command.setSessionRequired(sessionRequired); + } + catch (Exception ex) + { + logger.error("could not create SubCommand {}", commandClass.getName()); + } + + return command; + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + public Class getCommandClass() + { + return commandClass; + } + + /** + * Method description + * + * + * @return + */ + public String getName() + { + return name; + } + + /** + * Method description + * + * + * @return + */ + public String getUsage() + { + return usage; + } + + /** + * Method description + * + * + * @return + */ + public boolean isSessionRequired() + { + return sessionRequired; + } + + //~--- set methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param sessionRequired + */ + public void setSessionRequired(boolean sessionRequired) + { + this.sessionRequired = sessionRequired; + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private Class commandClass; + + /** Field description */ + private String name; + + /** Field description */ + private boolean sessionRequired; + + /** Field description */ + private String usage; +} diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/I18n.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/I18n.java new file mode 100644 index 0000000000..07c5d8167c --- /dev/null +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/I18n.java @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ +package sonia.scm.cli; + +import java.util.ResourceBundle; + +/** + * + * @author Sebastian Sdorra + */ +public class I18n +{ + + public static ResourceBundle getBundle(){ + return null; + }; + +} diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/SubCommand.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/SubCommand.java new file mode 100644 index 0000000000..06cbc8d9ba --- /dev/null +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/SubCommand.java @@ -0,0 +1,175 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.cli; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.kohsuke.args4j.CmdLineException; +import org.kohsuke.args4j.CmdLineParser; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import sonia.scm.client.ScmClientSession; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.BufferedReader; +import java.io.PrintWriter; + +import java.util.Collection; + +/** + * + * @author Sebastian Sdorra + */ +public abstract class SubCommand +{ + + /** the logger for SubCommand */ + private static final Logger logger = + LoggerFactory.getLogger(SubCommand.class); + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + */ + protected abstract void run(); + + /** + * Method description + * + * + * @param input + * @param output + * @param session + */ + public void init(BufferedReader input, PrintWriter output, + ScmClientSession session) + { + this.input = input; + this.output = output; + this.session = session; + } + + /** + * Method description + * + * + * @param args + */ + public void run(Collection args) + { + CmdLineParser parser = new CmdLineParser(this); + + try + { + parser.parseArgument(args); + run(); + } + catch (CmdLineException ex) + { + + // todo error handling + logger.error("could not parse command line", ex); + } + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + public String getName() + { + return name; + } + + /** + * Method description + * + * + * @return + */ + public boolean isSessionRequired() + { + return sessionRequired; + } + + //~--- set methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param name + */ + public void setName(String name) + { + this.name = name; + } + + /** + * Method description + * + * + * @param sessionRequired + */ + public void setSessionRequired(boolean sessionRequired) + { + this.sessionRequired = sessionRequired; + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + protected BufferedReader input; + + /** Field description */ + protected String name; + + /** Field description */ + protected PrintWriter output; + + /** Field description */ + protected ScmClientSession session; + + /** Field description */ + private boolean sessionRequired = true; +} diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/SubCommandHandler.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/SubCommandHandler.java new file mode 100644 index 0000000000..65fd787b76 --- /dev/null +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/SubCommandHandler.java @@ -0,0 +1,200 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.cli; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.kohsuke.args4j.CmdLineException; +import org.kohsuke.args4j.CmdLineParser; +import org.kohsuke.args4j.OptionDef; +import org.kohsuke.args4j.spi.OptionHandler; +import org.kohsuke.args4j.spi.Parameters; +import org.kohsuke.args4j.spi.Setter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import sonia.scm.util.IOUtil; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +import java.util.HashMap; +import java.util.Map; + +/** + * + * @author Sebastian Sdorra + */ +public class SubCommandHandler extends OptionHandler +{ + + /** Field description */ + public static final String RESOURCE_SERVICES = + "META-INF/services/".concat(SubCommand.class.getName()); + + /** the logger for SubCommandHandler */ + private static final Logger logger = + LoggerFactory.getLogger(SubCommandHandler.class); + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + * + * @param parser + * @param option + * @param setter + */ + public SubCommandHandler(CmdLineParser parser, OptionDef option, + Setter setter) + { + super(parser, option, setter); + subCommands = new HashMap(); + loadSubCommands(); + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param prmtrs + * + * @return + * + * @throws CmdLineException + */ + @Override + public int parseArguments(Parameters parameters) throws CmdLineException + { + String name = parameters.getParameter(0); + CommandDescriptor desc = subCommands.get(name); + if ( desc != null ) + { + // owner.stopOptionParsing(); + setter.addValue( desc.createSubCommand() ); + } + else + { + throw new CmdLineException(owner, "command ".concat(name).concat(" not found")); + } + return 1; + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + @Override + public String getDefaultMetaVariable() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + */ + private void loadSubCommands() + { + BufferedReader reader = null; + + try + { + reader = new BufferedReader( + new InputStreamReader( + getClass().getResourceAsStream(RESOURCE_SERVICES))); + + String line = reader.readLine(); + + while (line != null) + { + parseLine(line); + line = reader.readLine(); + } + } + catch (IOException ex) + { + logger.error("could not load commands"); + } + finally + { + IOUtil.close(reader); + } + } + + /** + * Method description + * + * + * @param line + */ + private void parseLine(String line) + { + line = line.trim(); + + if (!line.startsWith("#")) + { + try + { + Class clazz = + (Class) Class.forName(line); + CommandDescriptor desc = new CommandDescriptor(clazz); + + subCommands.put(desc.getName(), desc); + } + catch (ClassNotFoundException ex) + { + logger.warn("could not found command class {}", line); + } + } + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private Map subCommands; +}