| | |
| | | import org.apache.sshd.server.ExitCallback; |
| | | import org.apache.sshd.server.SessionAware; |
| | | import org.apache.sshd.server.session.ServerSession; |
| | | import org.kohsuke.args4j.Argument; |
| | | import org.kohsuke.args4j.CmdLineException; |
| | | import org.kohsuke.args4j.Option; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | |
| | | import com.gitblit.Keys; |
| | | import com.gitblit.utils.IdGenerator; |
| | | import com.gitblit.utils.StringUtils; |
| | | import com.gitblit.utils.WorkQueue; |
| | | import com.gitblit.utils.WorkQueue.CancelableRunnable; |
| | |
| | | /** The task, as scheduled on a worker thread. */ |
| | | private final AtomicReference<Future<?>> task; |
| | | |
| | | private final WorkQueue.Executor executor; |
| | | private WorkQueue workQueue; |
| | | |
| | | public BaseCommand() { |
| | | task = Atomics.newReference(); |
| | | IdGenerator gen = new IdGenerator(); |
| | | WorkQueue w = new WorkQueue(gen); |
| | | this.executor = w.getDefaultQueue(); |
| | | } |
| | | |
| | | @Override |
| | |
| | | @Override |
| | | public void destroy() { |
| | | log.debug("destroying " + getClass().getName()); |
| | | Future<?> future = task.getAndSet(null); |
| | | if (future != null && !future.isDone()) { |
| | | future.cancel(true); |
| | | } |
| | | session = null; |
| | | ctx = null; |
| | | } |
| | |
| | | |
| | | protected void provideStateTo(final BaseCommand cmd) { |
| | | cmd.setContext(ctx); |
| | | cmd.setWorkQueue(workQueue); |
| | | cmd.setInputStream(in); |
| | | cmd.setOutputStream(out); |
| | | cmd.setErrorStream(err); |
| | | cmd.setExitCallback(exit); |
| | | } |
| | | |
| | | public WorkQueue getWorkQueue() { |
| | | return workQueue; |
| | | } |
| | | |
| | | public void setWorkQueue(WorkQueue workQueue) { |
| | | this.workQueue = workQueue; |
| | | } |
| | | |
| | | public void setContext(SshCommandContext ctx) { |
| | |
| | | */ |
| | | protected void startThread(final CommandRunnable thunk) { |
| | | final TaskThunk tt = new TaskThunk(thunk); |
| | | task.set(executor.submit(tt)); |
| | | task.set(workQueue.getDefaultQueue().submit(tt)); |
| | | } |
| | | |
| | | /** Thrown from {@link CommandRunnable#run()} with client message and code. */ |