1 /* 2 * Zemucan: A Syntax Assistant for DB2 3 * Copyright (C) 2009, 2010 Andres Gomez Casanova 4 * 5 * This file is part of Zemucan. 6 * 7 * Zemucan is free software: you can redistribute it and/or modify 8 * it under the terms of the GNU Lesser General Public License as published by 9 * the Free Software Foundation; either version 3 of the License, or 10 * (at your option) any later version. 11 * 12 * Zemucan is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public License 18 * along with this library; if not, see <http://www.gnu.org/licenses/>. 19 * 20 * Contact: 21 * a n g o c a at y a h o o dot c o m 22 * Cra. 45 No 61 - 31, Bogota, Colombia. 23 * 24 * Author: $LastChangedBy: angoca $: 25 * Date: $LastChangedDate: 2011-03-06 23:10:20 -0500 (dom, 06 mar 2011) $: 26 * Revision: $LastChangedRevision: 1917 $: 27 * URL: $HeadURL: https://zemucan.svn.sourceforge.net/svnroot/zemucan/branches/zemucan_v1/source-code/uiImplSystem/src/main/java/name/angoca/zemucan/ui/impl/system/SystemInputReader.java $: 28 */ 29 package name.angoca.zemucan.ui.impl.system; 30 31 import java.io.IOException; 32 33 import name.angoca.zemucan.ui.api.AbstractUIException; 34 import name.angoca.zemucan.ui.api.InputReader; 35 import name.angoca.zemucan.ui.api.InputReaderException; 36 import name.angoca.zemucan.ui.api.OutputWriter; 37 38 /** 39 * Implementation of the input reader using the System.In option. This class 40 * flushes the stream before the read is started. 41 * <p> 42 * <b>Control Version</b> 43 * <p> 44 * <ul> 45 * <li>0.0.1 Class creation.</li> 46 * <li>0.0.2 No override.</li> 47 * <li>0.0.3 finals.</li> 48 * <li>1.0.0 Moved to version 1.</li> 49 * <li>1.1.0 Exception hierarchy changed.</li> 50 * <li>1.1.1 try catch.</li> 51 * <li>1.1.2 Asserts.</li> 52 * </ul> 53 * 54 * @author Andres Gomez Casanova <a 55 * href="mailto:a n g o c a at y a h o o dot c o m">(AngocA)</a> 56 * @version 1.1.2 2009-09-27 57 */ 58 public final class SystemInputReader implements InputReader { 59 60 /** 61 * OutputWriter to write the prompt. 62 */ 63 private final transient OutputWriter output; 64 /** 65 * Prompt to show in the console. 66 */ 67 private final transient String prompt; 68 69 /** 70 * Constructor that flushes the stream. 71 * 72 * @param outputWriter 73 * OutputWriter to write the prompt. 74 * @param consolePrompt 75 * Prompt to show in each line of the console. 76 * @throws InputReaderException 77 * If there is a problem flushing the stream. 78 */ 79 public SystemInputReader(final OutputWriter/* ! */outputWriter, 80 final String /* ! */consolePrompt) throws InputReaderException { 81 assert outputWriter != null; 82 assert consolePrompt != null; 83 84 try { 85 this.flush(); 86 } catch (final IOException exception) { 87 throw new InputReaderException(exception); 88 } 89 this.output = outputWriter; 90 this.prompt = consolePrompt; 91 } 92 93 /** 94 * Flushes the stream. It is a good idea to call it before the read is 95 * started. 96 * 97 * @throws IOException 98 * If there is a problem when reading. 99 */ 100 private void flush() throws IOException { 101 while ((System.in.available()) != 0) { 102 System.in.read(); 103 } 104 } 105 106 /* 107 * (non-Javadoc) 108 * 109 * @see name.angoca.zemucan.ui.api.InputReader#readString() 110 */ 111 @Override 112 public String/* ! */readString() throws AbstractUIException { 113 this.output.writeString(this.prompt); 114 115 int character; 116 final StringBuffer string = new StringBuffer(); 117 boolean finished = false; 118 while (!finished) { 119 try { 120 character = System.in.read(); 121 } catch (final IOException exception) { 122 throw new InputReaderException(exception); 123 } 124 125 if ((character < 0) || ((char) character == '\n')) { 126 finished = true; 127 } else if ((char) character != '\r') { 128 string.append((char) character); 129 } 130 } 131 final String ret = string.toString(); 132 133 assert ret != null; 134 return ret; 135 } 136 }