All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.cxf.ClientModule.scala Maven / Gradle / Ivy

package org.apache.cxf

import javax.inject.{Inject, Provider, Singleton}

import com.typesafe.config.{Config, ConfigFactory}
import org.apache.cxf.binding.soap.{SoapBindingConfiguration, SoapVersion}
import org.apache.cxf.config.DynamicConfig
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean
import org.apache.cxf.transport.DestinationFactoryManager
import org.apache.cxf.transport.http.HTTPTransportFactory

import scala.collection.JavaConverters._
import scala.reflect.{ClassTag, _}

abstract class ClientModule extends CoreModule {
  import ClientModule._

  protected def bindHTTPTransport(): Unit = {
    bindBus()

    bind(classOf[HTTPTransportFactory])
      .toProvider(classOf[HTTPTransportFactoryProvider])
      .asEagerSingleton()
  }

  protected def bindClient[T : ClassTag](key: String, wrappers: Seq[Class[_ <: ClientWrapper]] = Seq.empty): Unit = {
    bindHTTPTransport()

    bind(classTag[T].runtimeClass.asInstanceOf[Class[T]])
      .toProvider(new ClientProvider[T](key, wrappers))
      .asEagerSingleton()
  }
}

object ClientModule {
  final val ClientKeyConfig = "apache.cxf.client"

  @Singleton
  private class HTTPTransportFactoryProvider @Inject() (bus: Bus) extends Provider[HTTPTransportFactory] {

    def get(): HTTPTransportFactory = {
      val factory = new HTTPTransportFactory

      val dfm = bus.getExtension(classOf[DestinationFactoryManager])

      factory.getTransportIds.asScala.foreach(dfm.registerDestinationFactory(_, factory))

      factory
    }
  }

  class ClientProvider[T : ClassTag](key: String, wrappers: Seq[Class[_ <: ClientWrapper]] = Seq.empty) extends javax.inject.Provider[T] {
    @Inject var bus: Bus = _
    @Inject var injector: com.google.inject.Injector = _

    override def get(): T = {
      val config = ConfigFactory.load().getConfig(ClientKeyConfig)

      val factory = new JaxWsProxyFactoryBean()
      factory.setBus(bus)
      factory.setServiceClass(classTag[T].runtimeClass.asInstanceOf[Class[T]])

      Option(config.getObject(key)).foreach { config =>
        val dynamicConfig = new DynamicConfig(config.toConfig)
        dynamicConfig.address.asOption[String].foreach(factory.setAddress)

        dynamicConfig.bindingConfig.asOption[Config].map(new DynamicConfig(_)).map { config =>
          val bindingConfig = new SoapBindingConfiguration

          config.version.asOption[SoapVersion].foreach(bindingConfig.setVersion)

          bindingConfig
        }.foreach(factory.setBindingConfig)
      }

      val service = factory.create()

      wrappers.foreach { wrapperClass =>
        injector.getInstance(wrapperClass).callback(service)
      }

      service.asInstanceOf[T]
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy