/**
 * 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.cxf.spring.boot.autoconfigure.ssl;

import org.apache.cxf.Bus;
import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
import org.apache.cxf.transport.http.HTTPConduitConfigurer;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.ssl.SslBundles;
import org.springframework.context.annotation.Bean;


/**
 * Auto-configuration that bridges Spring Boot SslBundles to CXF HTTP conduits. Applies a configured bundle to
 * every HTTPS client created through the CXF Bus.
 */
@AutoConfiguration(after = CxfAutoConfiguration.class)
@EnableConfigurationProperties(CxfClientSslProperties.class)
@ConditionalOnClass({
    SslBundles.class, HTTPConduitConfigurer.class
})
@ConditionalOnProperty(prefix = "cxf.client.ssl", name = "enabled", 
    havingValue = "true", matchIfMissing = false)
public class CxfSslBundlesAutoConfiguration {

    @Bean
    public HTTPConduitConfigurer cxfSslBundleConfigurerInstaller(Bus bus, SslBundles sslBundles,
                                                    CxfClientSslProperties props) {
        HTTPConduitConfigurer sslHttpConduitConfigurer = new SslBundleHttpConduitConfigurer(sslBundles, props);
        bus.setExtension(sslHttpConduitConfigurer,
                                      HTTPConduitConfigurer.class);
        return sslHttpConduitConfigurer;
    }
}
