/** * A {@link TextTerminal} implemented using {@link System#out}, {@link System#in} and {@link Scanner}. * It is not capable to mask input strings, therefore not recommended when reading sensitive data. */ @PropertiesPrefixes({"system"}) public class SystemTextTerminal extends AbstractTextTerminal<SystemTextTerminal> { private final Scanner scanner = new Scanner(System.in); private final PrintStream out = System.out; @Override public String read(boolean masking) { return scanner.nextLine(); } @Override public void rawPrint(String message) { out.print(message); out.flush(); } @Override public void println() { out.println(); out.flush(); } }
private List<String> getPropertiesPrefixes(Class<?> cls) { if((cls == null) || !(TextTerminal.class.isAssignableFrom(cls))) return Collections.emptyList(); List<String> superPrefixes = getPropertiesPrefixes(cls.getSuperclass()); PropertiesPrefixes annotation = cls.getAnnotation(PropertiesPrefixes.class); if(annotation == null) return superPrefixes; List<String> prefixes = Arrays.asList(annotation.value()); if(superPrefixes.isEmpty()) return prefixes; List<String> allPrefixes = new ArrayList<>(superPrefixes); allPrefixes.addAll(prefixes); return allPrefixes; }
@PropertiesPrefixes({"console"}) public class ConsoleTextTerminal extends AbstractTextTerminal<ConsoleTextTerminal> { private final Console console;
@PropertiesPrefixes({"mock"}) public class MockTextTerminal extends AbstractTextTerminal<MockTextTerminal> { public static final int DEFAULT_MAX_READS = 100;
@PropertiesPrefixes({"textio"}) public abstract class AbstractTextTerminal<T extends AbstractTextTerminal<T>> implements TextTerminal<T> { private static final Logger logger = LoggerFactory.getLogger(AbstractTextTerminal.class);
@PropertiesPrefixes({"jline"}) public class JLineTextTerminal extends AbstractTextTerminal<JLineTextTerminal> { private static final Logger logger = LoggerFactory.getLogger(JLineTextTerminal.class);
@PropertiesPrefixes({"web"}) public class WebTextTerminal extends AbstractTextTerminal<WebTextTerminal> implements DataApi { private static final Logger logger = LoggerFactory.getLogger(WebTextTerminal.class);
@PropertiesPrefixes({"swing"}) public class SwingTextTerminal extends AbstractTextTerminal<SwingTextTerminal> { private static final Logger logger = LoggerFactory.getLogger(SwingTextTerminal.class);