def add()

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
  }