package org.commonjava.sshwrap.ui; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class FillBlanksPrompter implements Prompter { private String passphrase; private String password; private Map<String, String> textAnswers = new HashMap<String, String>(); private Map<String, Boolean> yesNoAnswers = new HashMap<String, Boolean>(); private final Prompter delegate; public FillBlanksPrompter( Prompter delegate ) { this.delegate = delegate; } public FillBlanksPrompter setAnswer( String prompt, String answer ) { textAnswers.put( prompt, answer ); return this; } public FillBlanksPrompter setAnswer( String prompt, Boolean answer ) { yesNoAnswers.put( prompt, answer ); return this; } public FillBlanksPrompter setPassphrase( String passphrase ) { this.passphrase = passphrase; return this; } public FillBlanksPrompter setPassword( String password ) { this.password = password; return this; } @Override public String getPassphrase() { return passphrase == null ? delegate.getPassphrase() : passphrase; } @Override public String getPassword() { return password == null ? delegate.getPassword() : password; } @Override public boolean promptPassword( String message ) { return password == null ? delegate.promptPassword( message ) : true; } @Override public boolean promptPassphrase( String message ) { return passphrase == null ? delegate.promptPassphrase( message ) : true; } @Override public boolean promptYesNo( String message ) { Boolean answer = yesNoAnswers.get( message ); if ( answer == null ) { answer = delegate.promptYesNo( message ); } return answer; } @Override public void showMessage( String message ) { delegate.showMessage( message ); } @Override public String[] promptKeyboardInteractive( String destination, String name, String instruction, String[] prompt, boolean[] echo ) { String[] answers = new String[prompt.length]; List<String> toDelegate = new ArrayList<String>(); for ( int i = 0; i < prompt.length; i++ ) { String p = prompt[i]; String ans = textAnswers.get( p ); if ( ans != null ) { answers[i] = ans; } else { toDelegate.add( p ); answers[i] = null; } } String[] delegated = delegate.promptKeyboardInteractive( destination, name, instruction, toDelegate.toArray( new String[]{} ), echo ); int currentAnswer = 0; for ( int i = 0; i < delegated.length; i++ ) { String ans = delegated[i]; while( currentAnswer < answers.length && answers[currentAnswer] != null ) { currentAnswer++; } if ( currentAnswer < answers.length ) { answers[currentAnswer] = ans; currentAnswer++; } } return answers; } }