// Path: sshd-shell-spring-boot-starter/src/main/java/sshd/shell/springboot/autoconfiguration/SshSessionContext.java
// public enum SshSessionContext {
// 
//     ;
// 
//     private static final ThreadLocal<Supplier<File>> USER_DIR_CONTEXT = new ThreadLocal<Supplier<File>>();
//     private static final ThreadLocal<Map<String, Object>> THREAD_CONTEXT = new ThreadLocal<Map<String, Object>>() {
//         @Override
//         protected Map<String, Object> initialValue() {
//             return new HashMap<>();
//         }
//     };
// 
//     public static void put(String key, Object value) {
//         THREAD_CONTEXT.get().put(key, value);
//     }
// 
//     @SuppressWarnings("unchecked")
//     public static <E> E get(String key) {
//         return (E) THREAD_CONTEXT.get().get(key);
//     }
// 
//     @SuppressWarnings("unchecked")
//     public static <E> E remove(String key) {
//         return (E) THREAD_CONTEXT.get().remove(key);
//     }
// 
//     public static boolean containsKey(String key) {
//         return THREAD_CONTEXT.get().containsKey(key);
//     }
// 
//     public static boolean isEmpty() {
//         return THREAD_CONTEXT.get().isEmpty();
//     }
// 
//     public static void clear() {
//         THREAD_CONTEXT.remove();
//         USER_DIR_CONTEXT.remove();
//     }
// 
//     public static void setUserDir(Supplier<File> userDirSupplier) {
//         USER_DIR_CONTEXT.set(userDirSupplier);
//     }
// 
//     public static File getUserDir() {
//         return USER_DIR_CONTEXT.get().get();
//     }
// }
// 
// Path: sshd-shell-spring-boot-starter/src/main/java/sshd/shell/springboot/console/ConsoleIO.java
// @lombok.extern.slf4j.Slf4j
// public enum ConsoleIO {
//     ;
// 
//     static final String LINE_READER = "__lineReader";
//     static final String TEXT_STYLE = "__textStyle";
//     static final String TERMINAL = "__terminal";
//     static final String HIGHLIGHT_COLOR = "__highlightColor";
// 
//     /**
//      * Read input from line with mask. Use null if input is to be echoed. Use 0 if nothing is to be echoed and other
//      * characters that get echoed with input
//      *
//      * @param text Text to show
//      * @param mask mask
//      * @return input from user
//      * @throws IOException if any
//      */
//     public static String readInput(String text, Character mask) throws IOException {
//         LineReader reader = SshSessionContext.<LineReader>get(LINE_READER);
//         AttributedStyle textStyle = SshSessionContext.<AttributedStyle>get(TEXT_STYLE);
//         Terminal terminal = SshSessionContext.<Terminal>get(TERMINAL);
//         String prompt = new AttributedStringBuilder()
//                 .style(textStyle)
//                 .append(text)
//                 .append(' ')
//                 .style(AttributedStyle.DEFAULT)
//                 .toAnsi(terminal);
//         return reader.readLine(prompt, mask);
//     }
// 
//     /**
//      * Read input from line with input echoed.
//      *
//      * @param text Text to show
//      * @return input from user
//      * @throws IOException if any
//      */
//     public static String readInput(String text) throws IOException {
//         return readInput(text, null);
//     }
// 
//     /**
//      * Write output.
//      *
//      * @param output Text output
//      */
//     public static void writeOutput(String output) {
//         writeOutput(output, null);
//     }
// 
//     /**
//      * Write highlighted output.
//      *
//      * @param output Text output
//      * @param textToHighlight text to highlight
//      */
//     public static void writeOutput(String output, String textToHighlight) {
//         Terminal terminal = SshSessionContext.<Terminal>get(TERMINAL);
//         AttributedStringBuilder builder = new AttributedStringBuilder()
//                 .style(SshSessionContext.<AttributedStyle>get(TEXT_STYLE));
//         if (Objects.isNull(textToHighlight)) {
//             builder.append(output);
//         } else {
//             addHighlightedTextToBuilder(output, textToHighlight, builder);
//         }
//         terminal.writer().println(builder.style(AttributedStyle.DEFAULT).toAnsi(terminal));
//         terminal.flush();
//     }
// 
//     private static void addHighlightedTextToBuilder(String output, String textToHighlight,
//             AttributedStringBuilder builder) {
//         String[] split = output.split(textToHighlight);
//         for (int i = 0; i < split.length - 1; i++) {
//             builder.append(split[i])
//                     .style(SshSessionContext.<AttributedStyle>get(HIGHLIGHT_COLOR))
//                     .append(textToHighlight)
//                     .style(SshSessionContext.<AttributedStyle>get(TEXT_STYLE));
//         }
//         builder.append(split[split.length - 1]);
//     }
// 
//     public static void writeJsonOutput(Object object) {
//         writeJsonOutput(object, null);
//     }
// 
//     public static void writeJsonOutput(Object object, String textToHighlight) {
//         writeOutput(JsonUtils.asJson(object), textToHighlight);
//     }
// }


import java.io.IOException;
import org.springframework.stereotype.Component;
import sshd.shell.springboot.autoconfiguration.SshSessionContext;
import sshd.shell.springboot.autoconfiguration.SshdShellCommand;
import sshd.shell.springboot.console.ConsoleIO;
package demo;


/**
 *
 * @author anand
 */
@Component
@SshdShellCommand(value = "echo", description = "Echo by users. Type 'echo' for supported subcommands")
public class EchoCommand {
    
    @SshdShellCommand(value = "bob", description = "Bob's echo. Usage: echo bob <arg>")
    public String bobSays(String arg) throws IOException {
// Path: sshd-shell-spring-boot-starter/src/main/java/sshd/shell/springboot/autoconfiguration/SshSessionContext.java
// public enum SshSessionContext {
// 
//     ;
// 
//     private static final ThreadLocal<Supplier<File>> USER_DIR_CONTEXT = new ThreadLocal<Supplier<File>>();
//     private static final ThreadLocal<Map<String, Object>> THREAD_CONTEXT = new ThreadLocal<Map<String, Object>>() {
//         @Override
//         protected Map<String, Object> initialValue() {
//             return new HashMap<>();
//         }
//     };
// 
//     public static void put(String key, Object value) {
//         THREAD_CONTEXT.get().put(key, value);
//     }
// 
//     @SuppressWarnings("unchecked")
//     public static <E> E get(String key) {
//         return (E) THREAD_CONTEXT.get().get(key);
//     }
// 
//     @SuppressWarnings("unchecked")
//     public static <E> E remove(String key) {
//         return (E) THREAD_CONTEXT.get().remove(key);
//     }
// 
//     public static boolean containsKey(String key) {
//         return THREAD_CONTEXT.get().containsKey(key);
//     }
// 
//     public static boolean isEmpty() {
//         return THREAD_CONTEXT.get().isEmpty();
//     }
// 
//     public static void clear() {
//         THREAD_CONTEXT.remove();
//         USER_DIR_CONTEXT.remove();
//     }
// 
//     public static void setUserDir(Supplier<File> userDirSupplier) {
//         USER_DIR_CONTEXT.set(userDirSupplier);
//     }
// 
//     public static File getUserDir() {
//         return USER_DIR_CONTEXT.get().get();
//     }
// }
// 
// Path: sshd-shell-spring-boot-starter/src/main/java/sshd/shell/springboot/console/ConsoleIO.java
// @lombok.extern.slf4j.Slf4j
// public enum ConsoleIO {
//     ;
// 
//     static final String LINE_READER = "__lineReader";
//     static final String TEXT_STYLE = "__textStyle";
//     static final String TERMINAL = "__terminal";
//     static final String HIGHLIGHT_COLOR = "__highlightColor";
// 
//     /**
//      * Read input from line with mask. Use null if input is to be echoed. Use 0 if nothing is to be echoed and other
//      * characters that get echoed with input
//      *
//      * @param text Text to show
//      * @param mask mask
//      * @return input from user
//      * @throws IOException if any
//      */
//     public static String readInput(String text, Character mask) throws IOException {
//         LineReader reader = SshSessionContext.<LineReader>get(LINE_READER);
//         AttributedStyle textStyle = SshSessionContext.<AttributedStyle>get(TEXT_STYLE);
//         Terminal terminal = SshSessionContext.<Terminal>get(TERMINAL);
//         String prompt = new AttributedStringBuilder()
//                 .style(textStyle)
//                 .append(text)
//                 .append(' ')
//                 .style(AttributedStyle.DEFAULT)
//                 .toAnsi(terminal);
//         return reader.readLine(prompt, mask);
//     }
// 
//     /**
//      * Read input from line with input echoed.
//      *
//      * @param text Text to show
//      * @return input from user
//      * @throws IOException if any
//      */
//     public static String readInput(String text) throws IOException {
//         return readInput(text, null);
//     }
// 
//     /**
//      * Write output.
//      *
//      * @param output Text output
//      */
//     public static void writeOutput(String output) {
//         writeOutput(output, null);
//     }
// 
//     /**
//      * Write highlighted output.
//      *
//      * @param output Text output
//      * @param textToHighlight text to highlight
//      */
//     public static void writeOutput(String output, String textToHighlight) {
//         Terminal terminal = SshSessionContext.<Terminal>get(TERMINAL);
//         AttributedStringBuilder builder = new AttributedStringBuilder()
//                 .style(SshSessionContext.<AttributedStyle>get(TEXT_STYLE));
//         if (Objects.isNull(textToHighlight)) {
//             builder.append(output);
//         } else {
//             addHighlightedTextToBuilder(output, textToHighlight, builder);
//         }
//         terminal.writer().println(builder.style(AttributedStyle.DEFAULT).toAnsi(terminal));
//         terminal.flush();
//     }
// 
//     private static void addHighlightedTextToBuilder(String output, String textToHighlight,
//             AttributedStringBuilder builder) {
//         String[] split = output.split(textToHighlight);
//         for (int i = 0; i < split.length - 1; i++) {
//             builder.append(split[i])
//                     .style(SshSessionContext.<AttributedStyle>get(HIGHLIGHT_COLOR))
//                     .append(textToHighlight)
//                     .style(SshSessionContext.<AttributedStyle>get(TEXT_STYLE));
//         }
//         builder.append(split[split.length - 1]);
//     }
// 
//     public static void writeJsonOutput(Object object) {
//         writeJsonOutput(object, null);
//     }
// 
//     public static void writeJsonOutput(Object object, String textToHighlight) {
//         writeOutput(JsonUtils.asJson(object), textToHighlight);
//     }
// }


// Path: sshd-shell-spring-boot-test-app/src/main/java/demo/EchoCommand.java
import java.io.IOException;
import org.springframework.stereotype.Component;
import sshd.shell.springboot.autoconfiguration.SshSessionContext;
import sshd.shell.springboot.autoconfiguration.SshdShellCommand;
import sshd.shell.springboot.console.ConsoleIO;

package demo;


/**
 *
 * @author anand
 */
@Component
@SshdShellCommand(value = "echo", description = "Echo by users. Type 'echo' for supported subcommands")
public class EchoCommand {
    
    @SshdShellCommand(value = "bob", description = "Bob's echo. Usage: echo bob <arg>")
    public String bobSays(String arg) throws IOException {
        String name = ConsoleIO.readInput("What's your name?");