From ebd4f4460cfe786f89898decbb6f62dd25a9d1ea Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Thu, 10 Apr 2014 18:58:09 -0400
Subject: [PATCH] Allow registration of a command instance

---
 src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java |   27 +++++++++++++++++++++++++++
 1 files changed, 27 insertions(+), 0 deletions(-)

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 f8503f8..76012a2 100644
--- a/src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java
+++ b/src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java
@@ -144,6 +144,26 @@
 		commands.add(cmd);
 	}
 
+	/**
+	 * Registers a command as long as the user is permitted to execute it.
+	 *
+	 * @param user
+	 * @param cmd
+	 */
+	protected void registerCommand(UserModel user, BaseCommand cmd) {
+		if (!cmd.getClass().isAnnotationPresent(CommandMetaData.class)) {
+			throw new RuntimeException(MessageFormat.format("{0} must be annotated with {1}!", cmd.getName(),
+					CommandMetaData.class.getName()));
+		}
+		CommandMetaData meta = cmd.getClass().getAnnotation(CommandMetaData.class);
+		if (meta.admin() && !user.canAdmin()) {
+			log.debug(MessageFormat.format("excluding admin command {0} for {1}", meta.name(), user.username));
+			return;
+		}
+		commands.add(cmd.getClass());
+		instantiated.add(cmd);
+	}
+
 	private Map<String, Class<? extends BaseCommand>> getMap() {
 		if (map == null) {
 			map = Maps.newHashMapWithExpectedSize(commands.size());
@@ -222,6 +242,13 @@
 			throw new UnloggedFailure(1, msg);
 		}
 
+		for (BaseCommand cmd : instantiated) {
+			// use an already instantiated command
+			if (cmd.getClass().equals(c)) {
+				return cmd;
+			}
+		}
+
 		BaseCommand cmd = null;
 		try {
 			cmd = c.newInstance();

--
Gitblit v1.9.1