in thrift/src/main/scala/com/twitter/finatra/thrift/routing/routers.scala [479:533]
def add(
controller: AbstractThriftService
): JavaThriftRouter = {
def deriveServiceName(clazz: Class[_]): String = {
val base = clazz.getName.stripSuffix("$" + "Service")
base.substring(base.lastIndexOf(".") + 1)
}
serviceCreator = assertController {
new ServiceCreator {
override def apply(param: RichServerParam): Service[Array[Byte], Array[Byte]] = {
val controllerClazz = controller.getClass
val serviceIfaceClazz: Class[_] =
controllerClazz.getInterfaces.head // MyService$ServiceIface
val serviceClazz: Class[_] = // MyService$Service
// note, the $ gets concat-ed strangely to avoid a false positive scalac warning
// for "possible missing interpolator".
Class.forName(serviceIfaceClazz.getName.stripSuffix("$ServiceIface") + "$" + "Service")
val serviceConstructor =
serviceClazz.getConstructor(
serviceIfaceClazz,
classOf[Filter.TypeAgnostic],
classOf[RichServerParam]
)
val serviceName = deriveServiceName(serviceClazz)
// instantiate service
val serviceInstance: Service[Array[Byte], Array[Byte]] =
serviceConstructor
.newInstance(
controller.asInstanceOf[Object],
filters,
param
)
.asInstanceOf[Service[Array[Byte], Array[Byte]]]
val declaredMethods: Array[JMethod] = controllerClazz.getDeclaredMethods
logger.info(
"Adding methods\n" +
declaredMethods.map(method => s"$serviceName.${method.getName}").mkString("\n")
)
registerGlobalFilter(libraryRegistry, filters)
serviceClazzStackParam = Some(serviceIfaceClazz)
registerService(libraryRegistry, serviceClazz.getName)
registerMethods(serviceName, controllerClazz, declaredMethods.toSeq)
serviceInstance
}
}
}
this
}