/*
 * @(#)ChoiceCallback.java	1.9 00/01/14
 *
 * Copyright 2000 Sun Microsystems, Inc. All rights reserved.
 * Copyright 2000 Sun Microsystems, Inc. Tous droits reserves.
 */

package javax.security.auth.callback;

/**
 * <p> Underlying security services instantiate and pass a
 * <code>ChoiceCallback</code> to the <code>invokeCallback</code>
 * method of a <code>CallbackHandler</code> to display a list of choices
 * and to retrieve the selected choice(s).
 *
 * @version 1.9, 01/14/00
 * @see javax.security.auth.callback.CallbackHandler
 */
public class ChoiceCallback implements Callback {

    private String prompt;
    private String[] choices;
    private int defaultChoice;
    private boolean multipleSelectionsAllowed;

    private int[] selections;

    /**
     * Construct a <code>ChoiceCallback</code> with a prompt,
     * a list of choices, a default choice, and a boolean specifying
     * whether or not multiple selections from the list of choices are allowed.
     *
     * <p>
     *
     * @param prompt the prompt used to describe the list of choices. <p>
     *
     * @param choices the list of choices. <p>
     *
     * @param defaultChoice the choice to be used as the default choice
     *			when the list of choices are displayed.  This value
     *			is represented as an index into the
     *			<code>choices</code> array. <p>
     *
     * @param multipleSelectionsAllowed boolean specifying whether or
     *			not multiple selections can be made from the
     *			list of choices.
     *
     * @exception IllegalArgumentException if <code>prompt</code> is null,
     *			if <code>prompt</code> has a length of 0,
     *			if <code>choices</code> is null,
     *			if <code>choices</code> has a length of 0,
     *			if any element from <code>choices</code> is null,
     *			if any element from <code>choices</code>
     *			has a length of 0 or if <code>defaultChoice</code>
     *			does not fall within the array boundaries of
     *			<code>choices</code>.
     */
    public ChoiceCallback(String prompt, String[] choices,
                int defaultChoice, boolean multipleSelectionsAllowed) {

	if (prompt == null || prompt.length() == 0 ||
	    choices == null || choices.length == 0 ||
	    defaultChoice < 0 || defaultChoice >= choices.length)
	    throw new IllegalArgumentException();

	for (int i = 0; i < choices.length; i++) {
	    if (choices[i] == null || choices[i].length() == 0)
		throw new IllegalArgumentException();
	}

	this.prompt = prompt;
	this.choices = choices;
	this.defaultChoice = defaultChoice;
	this.multipleSelectionsAllowed = multipleSelectionsAllowed;
    }

    /**
     * Get the prompt.
     *
     * <p>
     *
     * @return the prompt.
     */
    public String getPrompt() {
	return prompt;
    }

    /**
     * Get the list of choices.
     *
     * <p>
     *
     * @return the list of choices.
     */
    public String[] getChoices() {
	return choices;
    }

    /**
     * Get the defaultChoice.
     *
     * <p>
     *
     * @return the defaultChoice, represented as an index into
     *		the <code>choices</code> list.
     */
    public int getDefaultChoice() {
	return defaultChoice;
    }

    /**
     * Get the boolean determining whether multiple selections from
     * the <code>choices</code> list are allowed.
     *
     * <p>
     *
     * @return whether multiple selections are allowed.
     */
    public boolean allowMultipleSelections() {
	return multipleSelectionsAllowed;
    }

    /**
     * Set the selected choice.
     *
     * <p>
     *
     * @param selection the selection represented as an index into the
     *		<code>choices</code> list.
     */
    public void setSelectedIndex(int selection) {
	this.selections = new int[1];
	this.selections[0] = selection;
    }

    /**
     * Set the selected choices.
     *
     * <p>
     *
     * @param selections the selections represented as indexes into the
     *		<code>choices</code> list.
     *
     * @exception UnsupportedOperationException if multiple selections are
     *		not allowed, as determined by
     *		<code>allowMultipleSelections</code>.
     */
    public void setSelectedIndexes(int[] selections) {
	if (!multipleSelectionsAllowed)
	    throw new UnsupportedOperationException();
	this.selections = selections;
    }

    /**
     * Get the selected choices.
     *
     * <p>
     *
     * @return the selected choices, represented as indexes into the
     *		<code>choices</code> list.
     */
    public int[] getSelectedIndexes() {
	return selections;
    }
}
