/****************************************************************************
 * Copyright (c) 2007 Remy Suen, Composent Inc., and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Remy Suen <remy.suen@gmail.com> - initial API and implementation
 *****************************************************************************/
package org.eclipse.ecf.internal.provider.xmpp.ui.wizards;

import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.eclipse.ecf.core.*;
import org.eclipse.ecf.core.security.*;
import org.eclipse.ecf.internal.provider.xmpp.ui.Messages;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IWorkbench;

public final class XMPPSConnectWizard extends XMPPConnectWizard {

	public XMPPSConnectWizard() {
		super();
	}

	public XMPPSConnectWizard(String uri) {
		super(uri);
	}

	public void addPages() {
		page = new XMPPSConnectWizardPage(usernameAtHost);
		addPage(page);
	}

	public void init(IWorkbench workbench, IContainer container) {
		super.init(workbench, container);

		setWindowTitle(Messages.XMPPSConnectWizard_WIZARD_TITLE);
	}

	public void init(IWorkbench workbench, IStructuredSelection selection) {
		super.init(workbench, selection);
		try {
			this.container = ContainerFactory.getDefault().createContainer(
					"ecf.xmpps.smack");
		} catch (ContainerCreateException e) {
			// None
		}

		setWindowTitle(Messages.XMPPSConnectWizard_WIZARD_TITLE);
	}

	protected IConnectContext createConnectContext() {
		// Extract passwords from page prior to widget disposal:
		final String password = page.getPassword();
		final String keystorePassword = ((XMPPSConnectWizardPage) page)
				.getKeystorePassword();

		// Use a context capable of both ECF and javax.security Callback:
		return new IConnectContext() {
			public CallbackHandler getCallbackHandler() {
				return new DualCallbackHandler(password, keystorePassword);
			}
		};
	}

	/**
	 * <p>
	 * Wrapper class for handling both ECF and javax.security Callback needs.
	 * Will delegate ECF Callback to a handler created by
	 * {@link ConnectContextFactory}.
	 * </p>
	 * <p>
	 * Currently only handles
	 * {@link javax.security.auth.callback.PasswordCallback} for javax.security
	 * Callback for XMPPConnection class from org.jivesoftware.smack.
	 * </p>
	 * 
	 * @author T. Yueh
	 */
	class DualCallbackHandler implements CallbackHandler,
			javax.security.auth.callback.CallbackHandler {
		/**
		 * Handler for all ECF Callback.
		 */
		CallbackHandler delegate;

		/**
		 * User input for keystore password. Since keystore impl (PKI vs JKS vs
		 * etc) is hidden via interface, all that is necessary is a password.
		 */
		String keystorePassword;

		public DualCallbackHandler(String password, String keystorePassword) {
			delegate = ConnectContextFactory.createPasswordConnectContext(
					password).getCallbackHandler();
			this.keystorePassword = keystorePassword;
		}

		public void handle(Callback[] acallback) throws IOException,
				UnsupportedCallbackException {
			for (int i = 0; i < acallback.length; i++)
				if (acallback[i] instanceof PasswordCallback)
					((javax.security.auth.callback.PasswordCallback) acallback[i])
							.setPassword(keystorePassword.toCharArray());

		}

		public void handle(org.eclipse.ecf.core.security.Callback[] callbacks)
				throws IOException,
				org.eclipse.ecf.core.security.UnsupportedCallbackException {
			delegate.handle(callbacks);
		}
	}
}
