void t_java_deprecated_generator::generate_service_async_client()

in thrift/compiler/generate/t_java_deprecated_generator.cc [2718:2907]


void t_java_deprecated_generator::generate_service_async_client(
    const t_service* tservice) {
  string extends = "TAsyncClient";
  string extends_client = "";
  if (tservice->get_extends() != nullptr) {
    extends = type_name(tservice->get_extends()) + ".AsyncClient";
  }

  indent(f_service_) << "public static class AsyncClient extends " << extends
                     << " implements AsyncIface {" << endl;
  indent_up();

  // Factory method
  indent(f_service_)
      << "public static class Factory implements TAsyncClientFactory<AsyncClient> {"
      << endl;
  indent(f_service_) << "  private TAsyncClientManager clientManager;" << endl;
  indent(f_service_) << "  private TProtocolFactory protocolFactory;" << endl;
  indent(f_service_)
      << "  public Factory(TAsyncClientManager clientManager, TProtocolFactory protocolFactory) {"
      << endl;
  indent(f_service_) << "    this.clientManager = clientManager;" << endl;
  indent(f_service_) << "    this.protocolFactory = protocolFactory;" << endl;
  indent(f_service_) << "  }" << endl;
  indent(f_service_)
      << "  public AsyncClient getAsyncClient(TNonblockingTransport transport) {"
      << endl;
  indent(f_service_)
      << "    return new AsyncClient(protocolFactory, clientManager, transport);"
      << endl;
  indent(f_service_) << "  }" << endl;
  indent(f_service_) << "}" << endl << endl;

  indent(f_service_)
      << "public AsyncClient(TProtocolFactory protocolFactory, TAsyncClientManager clientManager, TNonblockingTransport transport) {"
      << endl;
  indent(f_service_) << "  super(protocolFactory, clientManager, transport);"
                     << endl;
  indent(f_service_) << "}" << endl << endl;

  // Generate client method implementations
  vector<t_function*> functions = tservice->get_functions();
  vector<t_function*>::const_iterator f_iter;
  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
    if (!can_generate_method(*f_iter)) {
      continue;
    }
    string funname = (*f_iter)->get_name();
    const t_type* ret_type = (*f_iter)->get_returntype();
    const t_struct* arg_struct = (*f_iter)->get_paramlist();
    string funclassname = funname + "_call";
    const vector<t_field*>& fields = arg_struct->get_members();
    const std::vector<t_field*>& xceptions =
        (*f_iter)->get_xceptions()->get_members();
    vector<t_field*>::const_iterator fld_iter;
    string args_name = (*f_iter)->get_name() + "_args";
    string result_name = (*f_iter)->get_name() + "_result";
    string result_handler_symbol;
    string client_sybmol = tmp("client");
    string protocol_factory_symbol = tmp("protocolFactory");
    string transport_symbol = tmp("transport");

    // Main method body
    result_handler_symbol = tmp("resultHandler");
    f_service_ << indent() << "public "
               << function_signature_async(
                      *f_iter, result_handler_symbol, false)
               << " throws TException {" << endl
               << indent() << "  checkReady();" << endl
               << indent() << "  " << funclassname << " method_call = new "
               << funclassname << "("
               << async_argument_list(
                      *f_iter, arg_struct, result_handler_symbol)
               << ", this, ___protocolFactory, ___transport);" << endl
               << indent() << "  this.___currentMethod = method_call;" << endl
               << indent() << "  ___manager.call(method_call);" << endl
               << indent() << "}" << endl
               << endl;

    // TAsyncMethod object for this function call
    indent(f_service_) << "public static class " + funclassname +
            " extends TAsyncMethodCall {"
                       << endl;
    indent_up();

    // Member variables
    for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
      indent(f_service_) << "private " + type_name((*fld_iter)->get_type()) +
              " " + (*fld_iter)->get_name() +
              ";" << endl;
    }

    // NOTE since we use a new Client instance to deserialize, let's keep seqid
    // to 0 for now indent(f_service_) << "private int seqid;" << endl << endl;

    // Constructor
    result_handler_symbol = tmp("resultHandler");
    indent(f_service_) << "public " + funclassname + "(" +
            async_argument_list(
                              *f_iter, arg_struct, result_handler_symbol, true)
                       << ", TAsyncClient " << client_sybmol
                       << ", TProtocolFactory " << protocol_factory_symbol
                       << ", TNonblockingTransport " << transport_symbol
                       << ") throws TException {" << endl;
    indent(f_service_) << "  super(" << client_sybmol << ", "
                       << protocol_factory_symbol << ", " << transport_symbol
                       << ", " << result_handler_symbol << ", "
                       << ((*f_iter)->qualifier() ==
                                   t_function_qualifier::one_way
                               ? "true"
                               : "false")
                       << ");" << endl;

    // Assign member variables
    for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
      indent(f_service_) << "  this." + (*fld_iter)->get_name() + " = " +
              (*fld_iter)->get_name() +
              ";" << endl;
    }

    indent(f_service_) << "}" << endl << endl;

    indent(f_service_)
        << "public void write_args(TProtocol prot) throws TException {" << endl;
    indent_up();

    // Serialize request
    // NOTE we are leaving seqid as 0, for now (see above)
    string pservice_func_name =
        "\"" + tservice->get_name() + "." + funname + "\"";
    f_service_ << indent() << "prot.writeMessageBegin(new TMessage(\""
               << funname << "\", TMessageType.CALL, 0));" << endl
               << indent() << args_name << " args = new " << args_name << "();"
               << endl;

    for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
      f_service_ << indent() << "args.set"
                 << get_cap_name((*fld_iter)->get_name()) << "("
                 << (*fld_iter)->get_name() << ");" << endl;
    }

    f_service_ << indent() << "args.write(prot);" << endl
               << indent() << "prot.writeMessageEnd();" << endl;

    indent_down();
    indent(f_service_) << "}" << endl << endl;

    // Return method
    indent(f_service_) << "public " + type_name(ret_type) +
            " getResult() throws ";
    vector<t_field*>::const_iterator x_iter;
    for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
      f_service_ << type_name((*x_iter)->get_type(), false, false) + ", ";
    }
    f_service_ << "TException {" << endl;

    indent_up();
    f_service_
        << indent() << "if (getState() != State.RESPONSE_READ) {" << endl
        << indent()
        << "  throw new IllegalStateException(\"Method call not finished!\");"
        << endl
        << indent() << "}" << endl
        << indent()
        << "TMemoryInputTransport memoryTransport = new TMemoryInputTransport(getFrameBuffer().array());"
        << endl
        << indent()
        << "TProtocol prot = super.client.getProtocolFactory().getProtocol(memoryTransport);"
        << endl;
    if ((*f_iter)->qualifier() != t_function_qualifier::one_way) {
      indent(f_service_);
      if (!ret_type->is_void()) {
        f_service_ << "return ";
      }
      f_service_ << "(new Client(prot)).recv_" + funname + "();" << endl;
    }

    // Close function
    indent_down();
    indent(f_service_) << "}" << endl;

    // Close class
    indent_down();
    indent(f_service_) << "}" << endl << endl;
  }

  // Close AsyncClient
  scope_down(f_service_);
  f_service_ << endl;
}