/******************************************************************************* * Copyright (c) 2009 Cambridge Semantics Incorporated. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * File: $Source$ * Created by: Matthew Roy ( <a href="mailto:mroy@cambridgesemantics.com">mroy@cambridgesemantics.com </a>) * Created on: Mar 9, 2010 * Revision: $Id: DefaultConsole.java 5245 2010-03-10 15:14:02Z mroy $ * * Contributors: * Cambridge Semantics Incorporated - initial API and implementation *******************************************************************************/ package org.openanzo.client.cli; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.StringWriter; import jline.console.ConsoleReader; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; /** * @author Matthew Roy ( <a href="mailto:mroy@cambridgesemantics.com">mroy@cambridgesemantics.com</a>) * */ public class DefaultConsole implements IConsole { ConsoleReader cr; public DefaultConsole() { try { if (System.console() != null) { cr = new ConsoleReader(); cr.setBellEnabled(true); } } catch (IOException ioe) { } } public String readLine(String prompt) throws IOException { if (cr != null) { return cr.readLine(); } else { System.out.print(prompt); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); //if (mask) { // return PasswordField.readPassword(prompt, in); // } else { return in.readLine(); } } public void printException(Exception e, boolean showTrace) { Throwable exception = e; if (exception != null && showTrace) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); // printStackTrace will print this exception including it's message as well as follow the getCause exception chain and print out those. exception.printStackTrace(pw); writeError(sw.toString()); } else { // We print out just the message of every exception in the getCause exception chain. boolean first = true; while (exception != null) { if (!first) { writeError("\tCaused by: "); } writeError(exception.getMessage()); first = false; if (exception == exception.getCause()) // prevents a possible infinite loop break; exception = exception.getCause(); } } } public DefaultConsole(ConsoleReader cr) { this.cr = cr; } public void writeError(String error) { if (cr != null) { try { cr.println(error); } catch (IOException ioe) { } } else { System.err.println(error); } } public void writeOutput(String output) { if (cr != null) { try { cr.println(output); } catch (IOException ioe) { } } else { System.out.println(output); } } public void beep() { if (cr != null) { try { cr.beep(); } catch (IOException ioe) { } } } public String readString(String prompt, boolean mask) throws IOException { if (cr != null) { try { String oldPrompt = cr.getPrompt(); String result = (mask) ? cr.readLine(prompt, '*') : cr.readLine(prompt); cr.setPrompt(oldPrompt); return result; } catch (IOException ioe) { } } System.out.print(prompt); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); //if (mask) { // return PasswordField.readPassword(prompt, in); // } else { return in.readLine(); // } } // Inner class which masks the characters of the password as it is being typed private static class EraserThread implements Runnable { private boolean stop; /** *@param The * prompt displayed to the user */ public EraserThread(String prompt) { System.err.println(prompt); } /** * Begin masking...display blank space */ public void run() { stop = true; while (stop) { System.err.print("\010\0"); try { Thread.sleep(1); } catch (InterruptedException ie) { System.err.println(ie.getMessage()); //ie.printStackTrace(); } } } /** * Instruct the thread to stop masking */ public void stopMasking() { this.stop = false; } } // Basically a wrapper for the EraserThread class private static class PasswordField { /** *@param prompt * The prompt to display to the user *@return The password as entered by the user */ public static String readPassword(String prompt, BufferedReader in) throws IOException { EraserThread et = new EraserThread(prompt); Thread mask = new Thread(et); mask.start(); in = new BufferedReader(new InputStreamReader(System.in)); String password = ""; password = in.readLine(); // stop masking et.stopMasking(); // return the password entered by the user return password; } } static HelpFormatter formatter = new HelpFormatter(); public void printHelp(String syntax, String header, Options options, String footer) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); formatter.printHelp(pw, cr != null ? cr.getTerminal().getWidth() : HelpFormatter.DEFAULT_WIDTH, syntax, header, options, HelpFormatter.DEFAULT_LEFT_PAD, HelpFormatter.DEFAULT_DESC_PAD, footer); writeOutput(sw.toString()); } }