diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/SubCommandHandler.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/SubCommandHandler.java new file mode 100644 index 0000000000..a8c0f1582e --- /dev/null +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/SubCommandHandler.java @@ -0,0 +1,186 @@ +/** + * 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.cmd; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import sonia.scm.util.IOUtil; +import sonia.scm.util.Util; + +//~--- 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 +{ + + /** Field description */ + public static final String RESOURCE_SERVICES = + "/META-INF/services/".concat(SubCommand.class.getName()); + + /** Field description */ + private static volatile SubCommandHandler instance; + + /** the logger for SubCommandOptionHandler */ + private static final Logger logger = + LoggerFactory.getLogger(SubCommandOptionHandler.class); + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + */ + private SubCommandHandler() + { + subCommands = new HashMap(); + loadSubCommands(); + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + public static SubCommandHandler getInstance() + { + if (instance == null) + { + synchronized (SubCommandHandler.class) + { + if (instance == null) + { + instance = new SubCommandHandler(); + } + } + } + + return instance; + } + + /** + * Method description + * + * + * @param name + * + * @return + */ + public CommandDescriptor getDescriptor(String name) + { + return subCommands.get(name); + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + */ + private void loadSubCommands() + { + BufferedReader reader = null; + + try + { + reader = new BufferedReader( + new InputStreamReader( + SubCommandOptionHandler.class.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 (Util.isNotEmpty(line) &&!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; +} diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/SubCommandOptionHandler.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/SubCommandOptionHandler.java index 037df5abd5..80a6726d8a 100644 --- a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/SubCommandOptionHandler.java +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/SubCommandOptionHandler.java @@ -42,21 +42,6 @@ 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; -import sonia.scm.util.Util; - -//~--- 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 @@ -64,16 +49,6 @@ import java.util.Map; public class SubCommandOptionHandler extends OptionHandler { - /** Field description */ - public static final String RESOURCE_SERVICES = - "/META-INF/services/".concat(SubCommand.class.getName()); - - /** the logger for SubCommandOptionHandler */ - private static final Logger logger = - LoggerFactory.getLogger(SubCommandOptionHandler.class); - - //~--- constructors --------------------------------------------------------- - /** * Constructs ... * @@ -86,8 +61,6 @@ public class SubCommandOptionHandler extends OptionHandler Setter setter) { super(parser, option, setter); - subCommands = new HashMap(); - loadSubCommands(); } //~--- methods -------------------------------------------------------------- @@ -107,7 +80,8 @@ public class SubCommandOptionHandler extends OptionHandler public int parseArguments(Parameters parameters) throws CmdLineException { String name = parameters.getParameter(0); - CommandDescriptor desc = subCommands.get(name); + CommandDescriptor desc = + SubCommandHandler.getInstance().getDescriptor(name); if (desc != null) { @@ -136,71 +110,4 @@ public class SubCommandOptionHandler extends OptionHandler { return "metaVar_command"; } - - //~--- methods -------------------------------------------------------------- - - /** - * Method description - * - */ - private void loadSubCommands() - { - BufferedReader reader = null; - - try - { - reader = new BufferedReader( - new InputStreamReader( - SubCommandOptionHandler.class.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 (Util.isNotEmpty(line) &&!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; }