From 23c416f30f4a1e69e76b70d71f6a9a7da4a020f1 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] Hook-up comprensive command cleanup (destroy) --- src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java | 30 ++++++++++++++++++++++-------- 1 files changed, 22 insertions(+), 8 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 779f0b0..4783c05 100644 --- a/src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java +++ b/src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java @@ -48,20 +48,34 @@ private List<String> args = new ArrayList<String>(); private final Set<Class<? extends BaseCommand>> commands; + private final Map<String, DispatchCommand> dispatchers; + private final List<BaseCommand> instantiated; private Map<String, Class<? extends BaseCommand>> map; - private Map<String, BaseCommand> dispatchers; protected DispatchCommand() { commands = new HashSet<Class<? extends BaseCommand>>(); + dispatchers = Maps.newHashMap(); + instantiated = new ArrayList<BaseCommand>(); + } + + @Override + public void destroy() { + super.destroy(); + commands.clear(); + map = null; + + for (BaseCommand command : instantiated) { + command.destroy(); + } + for (DispatchCommand dispatcher : dispatchers.values()) { + dispatcher.destroy(); + } } protected void registerDispatcher(UserModel user, Class<? extends DispatchCommand> cmd) { if (!cmd.isAnnotationPresent(CommandMetaData.class)) { throw new RuntimeException(MessageFormat.format("{0} must be annotated with {1}!", cmd.getName(), CommandMetaData.class.getName())); - } - if (dispatchers == null) { - dispatchers = Maps.newHashMap(); } CommandMetaData meta = cmd.getAnnotation(CommandMetaData.class); @@ -108,10 +122,9 @@ CommandMetaData meta = cmd.getAnnotation(CommandMetaData.class); map.put(meta.name(), cmd); } - if (dispatchers != null) { - for (Map.Entry<String, BaseCommand> entry : dispatchers.entrySet()) { - map.put(entry.getKey(), entry.getValue().getClass()); - } + + for (Map.Entry<String, DispatchCommand> entry : dispatchers.entrySet()) { + map.put(entry.getKey(), entry.getValue().getClass()); } } return map; @@ -163,6 +176,7 @@ BaseCommand cmd = null; try { cmd = c.newInstance(); + instantiated.add(cmd); } catch (Exception e) { throw new UnloggedFailure(1, MessageFormat.format("Failed to instantiate {0} command", commandName)); } -- Gitblit v1.9.1