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;
}