/**
 * $Id: SecureXmlRpcTest.java,v 1.1 2003/12/10 18:49:22 dkha Exp $
 */

import java.util.Vector;
import java.io.IOException;
import java.io.FileInputStream;
import java.net.MalformedURLException;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.KeyStoreException;
import java.security.KeyManagementException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.TrustManagerFactory;

import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.secure.SecureXmlRpcClient;
import org.apache.xmlrpc.secure.SecurityTool;

import java.util.Hashtable;

/**
 * Tests a secure XML-RPC call (using Apache XML-RPC).
 *
 * @version $Revision: 1.1 $
 * @author Daniel Kha, <a href="mailto:dkha@yorku.ca">dkha@yorku.ca</a>
 */
public class SecureXmlRpcTest {
    public static final String SECURE_ALGORITHM = "SunX509";
    public static final String SECURE_PROTOCOL = "TLS";
    public static final String KEYSTORE_TYPE = "JKS";

    public static SSLSocketFactory getSSLSocketFactory(String keyStoreFilename,
            String keyStorePassword)
            throws NoSuchAlgorithmException, KeyStoreException,
            CertificateException, UnrecoverableKeyException,
            KeyManagementException, IOException {

        char[] keyStorePasswordCharArray = keyStorePassword.toCharArray();

        KeyStore ks = KeyStore.getInstance(KEYSTORE_TYPE);
        ks.load(new FileInputStream(keyStoreFilename),
                keyStorePasswordCharArray);

        KeyManagerFactory kmf =
                KeyManagerFactory.getInstance(SECURE_ALGORITHM);
        kmf.init(ks, keyStorePasswordCharArray);

        TrustManagerFactory tmf =
                TrustManagerFactory.getInstance(SECURE_ALGORITHM);
        tmf.init(ks);

        SSLContext sslCtx = SSLContext.getInstance(SECURE_PROTOCOL);
        sslCtx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

        return(sslCtx.getSocketFactory());
    }

    public static void main(String[] args) {
        if (args.length < 4) {
            System.out.println("Usage: java SecureXmlRpcTest <host> <port> <keystore> <keystorePassword>");
            System.exit(0);
        }

        String host = args[0];
        int port = 0;
        try {
        	port = Integer.parseInt(args[1]);
        } catch (NumberFormatException e) {
            System.out.println("Using default port = "+port);
        }
        String keyStoreFilename = args[2];
        String keyStorePassword = args[3];

        try {

            SSLSocketFactory socketFactory = getSSLSocketFactory(
                    keyStoreFilename, keyStorePassword);

            HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);

            SecureXmlRpcClient client = new SecureXmlRpcClient(host, port);

            // Fill in the appropriate method call that's available on your
            // server.
            String method = "functions.add";

            // Set the appropriate parameters
            Vector paramsVector = new Vector();
            paramsVector.addElement("1");
            paramsVector.addElement("2");

            Hashtable result = (Hashtable) client.execute(method, paramsVector);
            
            String str = result.get("add").toString();
            
            System.out.println("XML-RPC result = "+ str);

        } catch (XmlRpcException e) {
            System.err.println(e);
        } catch (MalformedURLException e) {
            System.err.println(e);
        } catch (IOException e) {
            System.err.println(e);
        } catch (Exception e) {
            System.err.println(e);
        }
	}
}
