void t_java_deprecated_generator::generate_process_function()

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