1 /* ConsoleCallbackHandler.java -- 2 Copyright (C) 2005, 2006 Free Software Foundation, Inc. 3 4 This file is a part of GNU Classpath. 5 6 GNU Classpath is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2 of the License, or (at 9 your option) any later version. 10 11 GNU Classpath is distributed in the hope that it will be useful, but 12 WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with GNU Classpath; if not, write to the Free Software 18 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 19 USA 20 21 Linking this library statically or dynamically with other modules is 22 making a combined work based on this library. Thus, the terms and 23 conditions of the GNU General Public License cover the whole 24 combination. 25 26 As a special exception, the copyright holders of this library give you 27 permission to link this library with independent modules to produce an 28 executable, regardless of the license terms of these independent 29 modules, and to copy and distribute the resulting executable under 30 terms of your choice, provided that you also meet, for each linked 31 independent module, the terms and conditions of the license of that 32 module. An independent module is a module which is not derived from 33 or based on this library. If you modify this library, you may extend 34 this exception to your version of the library, but you are not 35 obligated to do so. If you do not wish to do so, delete this 36 exception statement from your version. */ 37 38 39 package gnu.javax.security.auth.callback; 40 41 import java.io.BufferedReader; 42 import java.io.InputStreamReader; 43 import java.io.IOException; 44 import java.io.PrintStream; 45 46 import java.util.Iterator; 47 import java.util.Locale; 48 import java.util.StringTokenizer; 49 import java.util.TreeSet; 50 51 import javax.security.auth.callback.ChoiceCallback; 52 import javax.security.auth.callback.ConfirmationCallback; 53 import javax.security.auth.callback.LanguageCallback; 54 import javax.security.auth.callback.NameCallback; 55 import javax.security.auth.callback.PasswordCallback; 56 import javax.security.auth.callback.TextInputCallback; 57 import javax.security.auth.callback.TextOutputCallback; 58 59 /** 60 * An implementation of {@link CallbackHandler} that reads and writes 61 * information to and from <code>System.in</code> and <code>System.out</code>. 62 */ 63 public class ConsoleCallbackHandler extends AbstractCallbackHandler 64 { 65 66 // Fields. 67 // ------------------------------------------------------------------------- 68 69 private final PrintStream out; 70 71 // Constructors. 72 // ------------------------------------------------------------------------- 73 ConsoleCallbackHandler()74 public ConsoleCallbackHandler() 75 { 76 this (System.out); 77 } 78 ConsoleCallbackHandler(final PrintStream out)79 public ConsoleCallbackHandler (final PrintStream out) 80 { 81 super ("CONSOLE"); 82 this.out = out; 83 } 84 85 // Instance methods. 86 // ------------------------------------------------------------------------- 87 handleChoice(ChoiceCallback c)88 protected void handleChoice(ChoiceCallback c) throws IOException 89 { 90 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 91 out.println(c.getPrompt()); 92 out.print('('); 93 String[] choices = c.getChoices(); 94 for (int i = 0; i < choices.length; i++) 95 { 96 out.print(choices[i]); 97 if (i != choices.length - 1) 98 out.print(", "); 99 } 100 out.print(") "); 101 if (c.getDefaultChoice() >= 0 && c.getDefaultChoice() < choices.length) 102 { 103 out.print('['); 104 out.print(choices[c.getDefaultChoice()]); 105 out.print("] "); 106 } 107 String reply = in.readLine(); 108 if (reply == null || reply.length() == 0) 109 { 110 c.setSelectedIndex(c.getDefaultChoice()); 111 return; 112 } 113 if (!c.allowMultipleSelections()) 114 { 115 for (int i = 0; i < choices.length; i++) 116 { 117 if (reply.trim().equals(choices[i])) 118 { 119 c.setSelectedIndex(i); 120 return; 121 } 122 } 123 c.setSelectedIndex(c.getDefaultChoice()); 124 } 125 else 126 { 127 TreeSet indices = new TreeSet(); 128 StringTokenizer tok = new StringTokenizer(reply, ","); 129 String[] replies = new String[tok.countTokens()]; 130 int idx = 0; 131 while (tok.hasMoreTokens()) 132 { 133 replies[idx++] = tok.nextToken().trim(); 134 } 135 for (int i = 0; i < choices.length; i++) 136 for (int j = 0; j < replies.length; i++) 137 { 138 if (choices[i].equals(replies[j])) 139 { 140 indices.add(Integer.valueOf(i)); 141 } 142 } 143 if (indices.size() == 0) 144 c.setSelectedIndex(c.getDefaultChoice()); 145 else 146 { 147 int[] ii = new int[indices.size()]; 148 int i = 0; 149 for (Iterator it = indices.iterator(); it.hasNext(); ) 150 ii[i++] = ((Integer) it.next()).intValue(); 151 c.setSelectedIndexes(ii); 152 } 153 } 154 } 155 handleConfirmation(ConfirmationCallback c)156 protected void handleConfirmation(ConfirmationCallback c) throws IOException 157 { 158 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 159 if (c.getPrompt() != null) 160 out.print(c.getPrompt()); 161 162 String[] choices = null; 163 int[] values = null; 164 switch (c.getOptionType()) 165 { 166 case ConfirmationCallback.OK_CANCEL_OPTION: 167 out.print(messages.getString("callback.okCancel")); 168 choices = new String[] { 169 messages.getString("callback.ok"), 170 messages.getString("callback.cancel"), 171 messages.getString("callback.shortOk"), 172 messages.getString("callback.shortCancel") 173 }; 174 values = new int[] { 175 ConfirmationCallback.OK, ConfirmationCallback.CANCEL, 176 ConfirmationCallback.OK, ConfirmationCallback.CANCEL 177 }; 178 break; 179 180 case ConfirmationCallback.YES_NO_CANCEL_OPTION: 181 out.print(messages.getString("callback.yesNoCancel")); 182 choices = new String[] { 183 messages.getString("callback.yes"), 184 messages.getString("callback.no"), 185 messages.getString("callback.cancel"), 186 messages.getString("callback.shortYes"), 187 messages.getString("callback.shortNo"), 188 messages.getString("callback.shortCancel") 189 }; 190 values = new int[] { 191 ConfirmationCallback.YES, ConfirmationCallback.NO, 192 ConfirmationCallback.CANCEL, ConfirmationCallback.YES, 193 ConfirmationCallback.NO, ConfirmationCallback.CANCEL 194 }; 195 break; 196 197 case ConfirmationCallback.YES_NO_OPTION: 198 out.print(messages.getString("callback.yesNo")); 199 choices = new String[] { messages.getString("callback.yes"), 200 messages.getString("callback.no"), 201 messages.getString("callback.shortYes"), 202 messages.getString("callback.shortNo") }; 203 values = new int[] { ConfirmationCallback.YES, 204 ConfirmationCallback.NO, 205 ConfirmationCallback.YES, 206 ConfirmationCallback.NO }; 207 int defaultOption = c.getDefaultOption(); 208 if (defaultOption > -1 && defaultOption < choices.length) 209 { 210 out.print("["); 211 out.print(choices[defaultOption]); 212 out.print("] "); 213 } 214 break; 215 216 case ConfirmationCallback.UNSPECIFIED_OPTION: 217 choices = c.getOptions(); 218 values = new int[choices.length]; 219 for (int i = 0; i < values.length; i++) 220 values[i] = i; 221 out.print('('); 222 for (int i = 0; i < choices.length; i++) 223 { 224 out.print(choices[i]); 225 if (i != choices.length - 1) 226 out.print(", "); 227 } 228 out.print(") ["); 229 out.print(choices[c.getDefaultOption()]); 230 out.print("] "); 231 break; 232 233 default: 234 throw new IllegalArgumentException(); 235 } 236 String reply = in.readLine(); 237 if (reply == null) 238 { 239 c.setSelectedIndex(c.getDefaultOption()); 240 return; 241 } 242 reply = reply.trim(); 243 for (int i = 0; i < choices.length; i++) 244 if (reply.equalsIgnoreCase(choices[i])) 245 { 246 c.setSelectedIndex(values[i]); 247 return; 248 } 249 c.setSelectedIndex(c.getDefaultOption()); 250 } 251 handleLanguage(LanguageCallback c)252 protected void handleLanguage(LanguageCallback c) throws IOException 253 { 254 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 255 out.print(messages.getString("callback.language")); 256 String reply = null; 257 reply = in.readLine(); 258 if (reply == null) 259 { 260 c.setLocale(Locale.getDefault()); 261 } 262 else 263 { 264 c.setLocale(new Locale(reply.trim())); 265 } 266 } 267 handleName(NameCallback c)268 protected void handleName(NameCallback c) throws IOException 269 { 270 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 271 out.print(c.getPrompt()); 272 String name = in.readLine(); 273 if (name != null) 274 c.setName(name.trim()); 275 } 276 handlePassword(PasswordCallback c)277 protected void handlePassword(PasswordCallback c) throws IOException 278 { 279 out.print(c.getPrompt()); 280 BufferedReader in = 281 new BufferedReader(new InputStreamReader(System.in)); 282 String pass = in.readLine(); 283 c.setPassword(pass.toCharArray()); 284 } 285 handleTextInput(TextInputCallback c)286 protected void handleTextInput(TextInputCallback c) throws IOException 287 { 288 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 289 out.print(c.getPrompt()); 290 String text = in.readLine(); 291 if (text != null) 292 c.setText(text); 293 } 294 handleTextOutput(TextOutputCallback c)295 protected void handleTextOutput(TextOutputCallback c) 296 { 297 out.print(c.getMessage()); 298 } 299 } 300