View Javadoc
1   /**
2    * Redistribution and use of this software and associated documentation
3    * ("Software"), with or without modification, are permitted provided
4    * that the following conditions are met:
5    *
6    * 1. Redistributions of source code must retain copyright
7    *    statements and notices.  Redistributions must also contain a
8    *    copy of this document.
9    *
10   * 2. Redistributions in binary form must reproduce the
11   *    above copyright notice, this list of conditions and the
12   *    following disclaimer in the documentation and/or other
13   *    materials provided with the distribution.
14   *
15   * 3. The name "Exolab" must not be used to endorse or promote
16   *    products derived from this Software without prior written
17   *    permission of Intalio, Inc.  For written permission,
18   *    please contact info@exolab.org.
19   *
20   * 4. Products derived from this Software may not be called "Exolab"
21   *    nor may "Exolab" appear in their names without prior written
22   *    permission of Intalio, Inc. Exolab is a registered
23   *    trademark of Intalio, Inc.
24   *
25   * 5. Due credit should be given to the Exolab Project
26   *    (http://www.exolab.org/).
27   *
28   * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS
29   * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
32   * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39   * OF THE POSSIBILITY OF SUCH DAMAGE.
40   *
41   * Copyright 2000-2001 (C) Intalio, Inc. All Rights Reserved.
42   *
43   * $Id$
44   */
45  package org.exolab.castor.util.dialog;
46  
47  /**
48   * A simple utility class to handle command line dialogs
49   *
50   * @author <a href="mailto:nsgreen@thazar.com">Nathan Green</a>
51   * @author <a href="mailto:kvisco@intalio.com">Keith Visco</a>
52   */
53  public class ConsoleDialog implements Dialog {
54  
55      /**
56       * Creates a new Console Dialog
57       */
58      public ConsoleDialog () {
59          super();
60      } //-- ConsoleDialog
61  
62      /**
63       * Presents a confirmation prompt with the given message.
64       *
65       * @param message
66       *            the confirmation prompt message to display
67       * @return true if the user has selected a positive confirmation, otherwise
68       *         false
69       */
70      public boolean confirm(final String message) {
71          try {
72              while (true) {
73                  System.out.println();
74                  System.out.print(message);
75                  System.out.print("(y|n|?) : ");
76  
77                  int ch = getChar();
78  
79                  System.out.println();
80  
81                  //-- check ch
82                  switch (ch) {
83                      case 'y':
84                          return true;
85                      case 'n':
86                          return false;
87                      case '?':
88                          System.out.println("y = yes, n = no");
89                          break;
90                      default:
91                          System.out.print("invalid input, expecting ");
92                          System.out.println("'y', 'n', or '?'.");
93                          break;
94                  }
95              }
96          } catch (java.io.IOException ix) {
97              System.out.println(ix);
98          }
99          return false;
100     } //-- confirm
101 
102     /**
103      * Returns a single char from System.in.
104      *
105      * @return the character entered, or null if more than one was entered (not
106      *         including EOLs)
107      * @throws java.io.IOException
108      *             if one is encountered in System.in.read()
109      */
110     private int getChar() throws java.io.IOException {
111         int ch = System.in.read();
112 
113         //-- read eoln, or extra characters
114         while (System.in.available() > 0) {
115             switch (System.in.read()) {
116                 case '\n':
117                 case '\r':
118                     break;
119                 default:
120                     ch = '\0';
121             }
122         }
123         return ch;
124     }
125 
126     /**
127      * Presents a confirmation prompt for values with the given messge.
128      *
129      * @param message
130      *            the confirmation prompt to display
131      * @param values
132      *            a list of valid characters to accept
133      * @return whatever character the user presses
134      */
135     public char confirm(final String message, final String values) {
136         return confirm(message, values, "no help available...");
137     }
138 
139     /**
140      * Presents a confirmation prompt for values with the given messge
141      *
142      * @param message
143      *            the confirmation prompt to display
144      * @param values
145      *            a list of valid characters to accept
146      * @param help
147      *            a help message when the user presses '?'
148      * @return whatever character the user presses
149      */
150     public char confirm(final String message, final String values, final String help) {
151         String prompt = makeList(values);
152 
153         try {
154             while (true) {
155                 System.out.println();
156                 System.out.print(message + prompt);
157 
158                 int ch = getChar();
159 
160                 System.out.println();
161 
162                 //-- check ch
163                 if (values.indexOf(ch) != -1) {
164                     return (char) ch;
165                 }
166 
167                 if (ch == '?') {
168                     System.out.println(help);
169                 } else {
170                     System.out.print("invalid input, expecting ");
171                     System.out.println(listInput(values));
172                 }
173             }
174         } catch (java.io.IOException ix) {
175             System.out.println(ix);
176         }
177         return '\0';
178     }
179 
180     /**
181      * Displays the given message to the user. No input is returned from
182      * the user.
183      *
184      * @param message the message to display to the user
185      */
186     public void notify(final String message) {
187         System.out.println(message);
188     } //-- notify
189 
190     /**
191      * Converts a list of characters into a delimited prompt. A '?' is
192      * automatically put at the end.
193      *
194      * @param values
195      *            a list of valid characters to accept
196      * @return each character separated by a pipe and in parenthesis
197      */
198     private String makeList(final String values) {
199         StringBuffer sb = new StringBuffer(values.length() * 2);
200         sb.append('(');
201         for (int i = 0; i < values.length(); i++) {
202             sb.append(values.charAt(i)).append('|');
203         }
204         sb.append("?)");
205         return sb.toString();
206     }
207 
208     /**
209      * Creates a list of valid input options to give a better explanation to the
210      * user.
211      *
212      * @param values
213      *            a list of valid characters to accept
214      * @return each character in single quotes, comma separated
215      */
216     private String listInput(final String values) {
217         StringBuffer sb = new StringBuffer(values.length() * 4);
218         for (int i = 0; i < values.length(); i++) {
219             sb.append('\'') .append(values.charAt(i)) .append("', ");
220         }
221         sb.append("or '?'");
222         return sb.toString();
223     }
224 
225 } //-- Dialog