summaryrefslogtreecommitdiffstats
path: root/src/main/java/com/gitblit
diff options
context:
space:
mode:
authorDavid Ostrovsky <david@ostrovsky.org>2014-02-26 08:19:44 +0100
committerJames Moger <james.moger@gitblit.com>2014-04-10 18:58:07 -0400
commita3de33e71a22268105714e01d09c1c2e28bfe2c3 (patch)
treecb9e34a743a273738c34829d3e1d1ffcb32a9689 /src/main/java/com/gitblit
parent924c9b28edfda6582a5480a7c1a2dd5b3ce89d92 (diff)
downloadgitblit-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.java7
-rw-r--r--src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java44
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();