/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.camel.util.jsse;

import java.io.FileOutputStream;
import java.io.IOException;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManagerFactory;

import org.apache.camel.CamelContext;
import org.apache.camel.TestSupport;
import org.apache.camel.component.properties.PropertiesComponent;
import org.apache.camel.impl.DefaultCamelContext;

public abstract class AbstractJsseParametersTest extends TestSupport {

    protected CamelContext createPropertiesPlaceholderAwareContext() throws Exception {
        Properties supplementalProperties = new Properties();

        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        SecureRandom sr = null;
        try {
            sr = SecureRandom.getInstance("SHA1PRNG");
        } catch (NoSuchAlgorithmException e) {
            // Ignore
        }

        SSLContext sslc = SSLContext.getInstance("TLS");
        sslc.init(null, null, null);
        SSLSocket socket = (SSLSocket) sslc.getSocketFactory().createSocket();

        supplementalProperties.setProperty("keyStoreParameters.type", KeyStore.getDefaultType());
        supplementalProperties.setProperty("keyStoreParameters.provider", ks.getProvider().getName());

        supplementalProperties.setProperty("keyManagersParameters.algorithm", KeyManagerFactory.getDefaultAlgorithm());
        supplementalProperties.setProperty("keyManagersParameters.provider", kmf.getProvider().getName());

        supplementalProperties.setProperty("trustManagersParameters.algorithm", TrustManagerFactory.getDefaultAlgorithm());
        supplementalProperties.setProperty("trustManagersParameters.provider", tmf.getProvider().getName());

        if (sr != null) {
            supplementalProperties.setProperty("secureRandomParameters.algorithm", "SHA1PRNG");
            supplementalProperties.setProperty("secureRandomParameters.provider", sr.getProvider().getName());
        }

        supplementalProperties.setProperty("sslContextParameters.provider", sslc.getProvider().getName());
        supplementalProperties.setProperty("cipherSuite.0", socket.getSupportedCipherSuites()[0]);

        // Have to skip this guy because he doesn't work with TLS as the SSLContext protocol
        String ssp = "";
        for (String protocol : socket.getSupportedProtocols()) {
            if (!"SSLv2Hello".equals(protocol)) {
                ssp = protocol;
                break;
            }
        }
        supplementalProperties.setProperty("secureSocketProtocol.0", ssp);


        return this.createPropertiesPlaceholderAwareContext(supplementalProperties);
    }

    protected CamelContext createPropertiesPlaceholderAwareContext(Properties supplementalProperties) throws IOException {
        Properties properties = new Properties(supplementalProperties);
        properties.load(AbstractJsseParametersTest.class.getResourceAsStream("test.properties"));

        if (supplementalProperties != null) {
            Properties mergedProps = new Properties();

            Set<String> keys = new HashSet<String>();
            keys.addAll(properties.stringPropertyNames());
            keys.addAll(supplementalProperties.stringPropertyNames());

            for (String key : keys) {
                mergedProps.setProperty(key, properties.getProperty(key));
            }

            properties = mergedProps;
        }

        properties.store(new FileOutputStream("./target/jsse-test.properties"),
                "Generated by " + AbstractJsseParametersTest.class.getName());

        PropertiesComponent pc = new PropertiesComponent();
        pc.setLocation("file:./target/jsse-test.properties");

        CamelContext context = new DefaultCamelContext();
        context.addComponent("properties", pc);

        return context;
    }

}
