in thrift/compiler/generate/t_java_deprecated_generator.cc [3077:3231]
void t_java_deprecated_generator::generate_process_function(
const t_service* tservice, const t_function* tfunction) {
// Open class
indent(f_service_) << "private class " << tfunction->get_name()
<< " implements ProcessFunction {" << endl;
indent_up();
// Open function
indent(f_service_)
<< "public void process(int seqid, TProtocol iprot, TProtocol oprot, TConnectionContext server_ctx) throws TException"
<< endl;
scope_up(f_service_);
string argsname = tfunction->get_name() + "_args";
string resultname = tfunction->get_name() + "_result";
string pservice_fn_name =
"\"" + tservice->get_name() + "." + tfunction->get_name() + "\"";
f_service_ << indent() << "Object handler_ctx = event_handler_.getContext("
<< pservice_fn_name << ", server_ctx);" << endl
<< indent() << argsname << " args = new " << argsname << "();"
<< endl
<< indent() << "event_handler_.preRead(handler_ctx, "
<< pservice_fn_name << ");" << endl
<< indent() << "args.read(iprot);" << endl
<< indent() << "iprot.readMessageEnd();" << endl
<< indent() << "event_handler_.postRead(handler_ctx, "
<< pservice_fn_name << ", args);" << endl;
const t_struct* xs = tfunction->get_xceptions();
const std::vector<t_field*>& xceptions = xs->get_members();
vector<t_field*>::const_iterator x_iter;
// Declare result for non oneway function
if (tfunction->qualifier() != t_function_qualifier::one_way) {
f_service_ << indent() << resultname << " result = new " << resultname
<< "();" << endl;
}
// Try block for a function with exceptions
if (xceptions.size() > 0) {
f_service_ << indent() << "try {" << endl;
indent_up();
}
// Generate the function call
const t_struct* arg_struct = tfunction->get_paramlist();
const std::vector<t_field*>& fields = arg_struct->get_members();
vector<t_field*>::const_iterator f_iter;
f_service_ << indent();
if (tfunction->qualifier() != t_function_qualifier::one_way &&
!tfunction->get_returntype()->is_void()) {
f_service_ << "result.success = ";
}
f_service_ << "iface_." << tfunction->get_name() << "(";
bool first = true;
for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
if (first) {
first = false;
} else {
f_service_ << ", ";
}
f_service_ << "args." << (*f_iter)->get_name();
}
f_service_ << ");" << endl;
// Set isset on success field
if (tfunction->qualifier() != t_function_qualifier::one_way &&
!tfunction->get_returntype()->is_void() &&
!type_can_be_null(tfunction->get_returntype())) {
f_service_ << indent() << "result.set" << get_cap_name("success")
<< get_cap_name("isSet") << "(true);" << endl;
}
if (tfunction->qualifier() != t_function_qualifier::one_way &&
xceptions.size() > 0) {
string pservice_func_name =
"\"" + tservice->get_name() + "." + tfunction->get_name() + "\"";
string pservice_func_name_error =
tservice->get_name() + "." + tfunction->get_name();
indent_down();
f_service_ << indent() << "}";
for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
f_service_ << " catch (" << type_name((*x_iter)->get_type(), false, false)
<< " " << (*x_iter)->get_name() << ") {" << endl;
if (tfunction->qualifier() != t_function_qualifier::one_way) {
indent_up();
f_service_ << indent() << "result." << (*x_iter)->get_name() << " = "
<< (*x_iter)->get_name() << ";" << endl
<< indent()
<< "event_handler_.declaredUserException(handler_ctx, "
<< pservice_func_name << ", " << (*x_iter)->get_name()
<< ");" << endl;
indent_down();
f_service_ << indent() << "}";
} else {
f_service_ << "}";
}
}
f_service_ << " catch (Throwable th) {" << endl;
indent_up();
f_service_
<< indent() << "LOGGER.error(\"Internal error processing "
<< pservice_func_name_error << "\", th);" << endl
<< indent() << "event_handler_.handlerError(handler_ctx, "
<< pservice_func_name << ", th);" << endl
<< indent()
<< "TApplicationException x = new TApplicationException(TApplicationException.INTERNAL_ERROR, \"Internal error processing "
<< pservice_func_name_error << "\");" << endl
<< indent() << "event_handler_.preWrite(handler_ctx, \""
<< pservice_func_name_error << "\", null);" << endl
<< indent() << "oprot.writeMessageBegin(new TMessage("
<< pservice_func_name << ", TMessageType.EXCEPTION, seqid));" << endl
<< indent() << "x.write(oprot);" << endl
<< indent() << "oprot.writeMessageEnd();" << endl
<< indent() << "oprot.getTransport().flush();" << endl
<< indent() << "event_handler_.postWrite(handler_ctx, "
<< pservice_func_name << ", null);" << endl
<< indent() << "return;" << endl;
indent_down();
f_service_ << indent() << "}" << endl;
}
// Shortcut out here for oneway functions
if (tfunction->qualifier() == t_function_qualifier::one_way) {
f_service_ << indent() << "return;" << endl;
scope_down(f_service_);
// Close class
indent_down();
f_service_ << indent() << "}" << endl << endl;
return;
}
// string pservice_fn_name = "\"" + tservice->get_name() + "." +
// tfunction->get_name() + "\"";
f_service_ << indent() << "event_handler_.preWrite(handler_ctx, "
<< pservice_fn_name << ", result);" << endl
<< indent() << "oprot.writeMessageBegin(new TMessage(\""
<< tfunction->get_name() << "\", TMessageType.REPLY, seqid));"
<< endl
<< indent() << "result.write(oprot);" << endl
<< indent() << "oprot.writeMessageEnd();" << endl
<< indent() << "oprot.getTransport().flush();" << endl
<< indent() << "event_handler_.postWrite(handler_ctx, "
<< pservice_fn_name << ", result);" << endl;
// Close function
scope_down(f_service_);
f_service_ << endl;
// Close class
indent_down();
f_service_ << indent() << "}" << endl << endl;
}