diff options
author | David Ostrovsky <david@ostrovsky.org> | 2014-02-26 08:19:44 +0100 |
---|---|---|
committer | James Moger <james.moger@gitblit.com> | 2014-04-10 18:58:07 -0400 |
commit | a3de33e71a22268105714e01d09c1c2e28bfe2c3 (patch) | |
tree | cb9e34a743a273738c34829d3e1d1ffcb32a9689 /src/main/java/com/gitblit | |
parent | 924c9b28edfda6582a5480a7c1a2dd5b3ce89d92 (diff) | |
download | gitblit-a3de33e71a22268105714e01d09c1c2e28bfe2c3.tar.gz gitblit-a3de33e71a22268105714e01d09c1c2e28bfe2c3.zip |
Fix command dispatching
DispatchCommand is supposed to be nested:
ssh server gitblit version --verbose --format json
means that first the command that is seen by dispatching process is
"gitblit". Dispatch command look in its commands map for this command
and dispatch the rest of the command and options and arguments to this
command, version in this example.
Change-Id: I8ef8e0e369922c793ca7ad36c1a8f76b0206baa7
Diffstat (limited to 'src/main/java/com/gitblit')
-rw-r--r-- | src/main/java/com/gitblit/transport/ssh/SshDaemon.java | 7 | ||||
-rw-r--r-- | src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java | 44 |
2 files changed, 35 insertions, 16 deletions
diff --git a/src/main/java/com/gitblit/transport/ssh/SshDaemon.java b/src/main/java/com/gitblit/transport/ssh/SshDaemon.java index 42ee67ab..dd4a2d8e 100644 --- a/src/main/java/com/gitblit/transport/ssh/SshDaemon.java +++ b/src/main/java/com/gitblit/transport/ssh/SshDaemon.java @@ -102,9 +102,12 @@ public class SshDaemon { sshd.setFileSystemFactory(new DisabledFilesystemFactory()); sshd.setForwardingFilter(new NonForwardingFilter()); + DispatchCommand gitblitCmd = new DispatchCommand(); + gitblitCmd.registerCommand(CreateRepository.class); + gitblitCmd.registerCommand(VersionCommand.class); + DispatchCommand dispatcher = new DispatchCommand(); - dispatcher.registerCommand(CreateRepository.class); - dispatcher.registerCommand(VersionCommand.class); + dispatcher.registerDispatcher("gitblit", gitblitCmd); SshCommandFactory commandFactory = new SshCommandFactory( new RepositoryResolver<SshSession>(gitblit), diff --git a/src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java b/src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java index 0d614a0f..b6944eaf 100644 --- a/src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java +++ b/src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java @@ -44,11 +44,19 @@ public class DispatchCommand extends BaseCommand { private Set<Class<? extends Command>> commands; private Map<String, Class<? extends Command>> map; + private Map<String, Command> root; public DispatchCommand() { commands = new HashSet<Class<? extends Command>>(); } + public void registerDispatcher(String name, Command cmd) { + if (root == null) { + root = Maps.newHashMap(); + } + root.put(name, cmd); + } + public void registerCommand(Class<? extends Command> cmd) { if (!cmd.isAnnotationPresent(CommandMetaData.class)) { throw new RuntimeException(MessageFormat.format("{0} must be annotated with {1}!", @@ -78,20 +86,7 @@ public class DispatchCommand extends BaseCommand { throw new UnloggedFailure(1, msg.toString()); } - final Class<? extends Command> c = getMap().get(commandName); - if (c == null) { - String msg = - (getName().isEmpty() ? "Gitblit" : getName()) + ": " - + commandName + ": not found"; - throw new UnloggedFailure(1, msg); - } - - Command cmd = null; - try { - cmd = c.newInstance(); - } catch (Exception e) { - throw new UnloggedFailure(1, MessageFormat.format("Failed to instantiate {0} command", commandName)); - } + Command cmd = getCommand(); if (cmd instanceof BaseCommand) { BaseCommand bc = (BaseCommand) cmd; if (getName().isEmpty()) { @@ -119,6 +114,27 @@ public class DispatchCommand extends BaseCommand { } } + private Command getCommand() throws UnloggedFailure { + if (root != null && root.containsKey(commandName)) { + return root.get(commandName); + } + final Class<? extends Command> c = getMap().get(commandName); + if (c == null) { + String msg = + (getName().isEmpty() ? "Gitblit" : getName()) + ": " + + commandName + ": not found"; + throw new UnloggedFailure(1, msg); + } + + Command cmd = null; + try { + cmd = c.newInstance(); + } catch (Exception e) { + throw new UnloggedFailure(1, MessageFormat.format("Failed to instantiate {0} command", commandName)); + } + return cmd; + } + @Override protected String usage() { final StringBuilder usage = new StringBuilder(); |