Skip to content

Commit

Permalink
THRIFT-2637 "java:fullcamel_service_methods" option to automatically …
Browse files Browse the repository at this point in the history
…camel-case Java service methods

Patch: Tom Lee
  • Loading branch information
bufferoverflow committed Jul 25, 2014
1 parent 9df3854 commit 84d1188
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 25 deletions.
88 changes: 63 additions & 25 deletions compiler/cpp/src/generate/t_java_generator.cc
Expand Up @@ -138,6 +138,8 @@ class t_java_generator : public t_oop_generator {
void generate_java_bean_boilerplate(std::ofstream& out, t_struct* tstruct);

void generate_function_helpers(t_function* tfunction);
std::string as_camel_case(std::string name, bool ucfirst=true);
std::string get_rpc_method_name(std::string name);
std::string get_cap_name(std::string name);
std::string generate_isset_check(t_field* field);
std::string generate_isset_check(std::string field);
Expand Down Expand Up @@ -2382,11 +2384,17 @@ void t_java_generator::generate_service_client(t_service* tservice) {
vector<t_function*>::const_iterator f_iter;
for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
string funname = (*f_iter)->get_name();
string sep = "_";
string javaname = funname;
if (fullcamel_style_) {
sep = "";
javaname = as_camel_case(funname);
}

// Open function
indent(f_service_) << "public " << function_signature(*f_iter) << endl;
scope_up(f_service_);
indent(f_service_) << "send_" << funname << "(";
indent(f_service_) << "send" << sep << javaname << "(";

// Get the struct of function call params
t_struct* arg_struct = (*f_iter)->get_arglist();
Expand All @@ -2411,13 +2419,13 @@ void t_java_generator::generate_service_client(t_service* tservice) {
f_service_ << "return ";
}
f_service_ <<
"recv_" << funname << "();" << endl;
"recv" << sep << javaname << "();" << endl;
}
scope_down(f_service_);
f_service_ << endl;

t_function send_function(g_type_void,
string("send_") + (*f_iter)->get_name(),
string("send") + sep + javaname,
(*f_iter)->get_arglist());

string argsname = (*f_iter)->get_name() + "_args";
Expand All @@ -2444,7 +2452,7 @@ void t_java_generator::generate_service_client(t_service* tservice) {

t_struct noargs(program_);
t_function recv_function((*f_iter)->get_returntype(),
string("recv_") + (*f_iter)->get_name(),
string("recv") + sep + javaname,
&noargs,
(*f_iter)->get_xceptions());
// Open function
Expand Down Expand Up @@ -2525,6 +2533,12 @@ void t_java_generator::generate_service_async_client(t_service* tservice) {
vector<t_function*>::const_iterator f_iter;
for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
string funname = (*f_iter)->get_name();
string sep = "_";
string javaname = funname;
if (fullcamel_style_) {
sep = "";
javaname = as_camel_case(javaname);
}
t_type* ret_type = (*f_iter)->get_returntype();
t_struct* arg_struct = (*f_iter)->get_arglist();
string funclassname = funname + "_call";
Expand Down Expand Up @@ -2607,7 +2621,7 @@ void t_java_generator::generate_service_async_client(t_service* tservice) {
if (!ret_type->is_void()) {
f_service_ << "return ";
}
f_service_ << "(new Client(prot)).recv_" + funname + "();" << endl;
f_service_ << "(new Client(prot)).recv" + sep + javaname + "();" << endl;
}

// Close function
Expand Down Expand Up @@ -2883,7 +2897,7 @@ void t_java_generator::generate_process_async_function(t_service* tservice,
vector<t_field*>::const_iterator f_iter;
f_service_ << indent();

f_service_ << "iface." << tfunction->get_name() << "(";
f_service_ << "iface." << get_rpc_method_name(tfunction->get_name()) << "(";
bool first = true;
for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
if (first) {
Expand Down Expand Up @@ -2966,7 +2980,7 @@ void t_java_generator::generate_process_function(t_service* tservice,
if (!tfunction->is_oneway() && !tfunction->get_returntype()->is_void()) {
f_service_ << "result.success = ";
}
f_service_ << "iface." << tfunction->get_name() << "(";
f_service_ << "iface." << get_rpc_method_name(tfunction->get_name()) << "(";
bool first = true;
for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
if (first) {
Expand Down Expand Up @@ -3643,8 +3657,9 @@ string t_java_generator::declare_field(t_field* tfield, bool init, bool comment)
string t_java_generator::function_signature(t_function* tfunction,
string prefix) {
t_type* ttype = tfunction->get_returntype();
std::string fn_name = get_rpc_method_name(tfunction->get_name());
std::string result =
type_name(ttype) + " " + prefix + tfunction->get_name() + "(" + argument_list(tfunction->get_arglist()) + ") throws ";
type_name(ttype) + " " + prefix + fn_name + "(" + argument_list(tfunction->get_arglist()) + ") throws ";
t_struct* xs = tfunction->get_xceptions();
const std::vector<t_field*>& xceptions = xs->get_members();
vector<t_field*>::const_iterator x_iter;
Expand All @@ -3670,7 +3685,9 @@ string t_java_generator::function_signature_async(t_function* tfunction, bool us
}
ret_type += tfunction->get_name() + "_call";

std::string result = prefix + "void " + tfunction->get_name() + "(" + arglist + ")";
std::string fn_name = get_rpc_method_name(tfunction->get_name());

std::string result = prefix + "void " + fn_name + "(" + arglist + ")";
return result;
}

Expand Down Expand Up @@ -3826,28 +3843,49 @@ std::string t_java_generator::make_valid_java_identifier( std::string const & fr
}


std::string t_java_generator::as_camel_case(std::string name, bool ucfirst) {
std::string new_name;
size_t i = 0;
for (i = 0; i < name.size(); i++) {
if (name[i] != '_') break;
}
if (ucfirst) {
new_name += toupper(name[i++]);
}
else {
new_name += tolower(name[i++]);
}
for (; i < name.size(); i++) {
if (name[i] == '_') {
if (i < name.size()-1) {
i++;
new_name += toupper(name[i]);
}
}
else {
new_name += name[i];
}
}
return new_name;
}

std::string t_java_generator::get_rpc_method_name(std::string name) {
if (fullcamel_style_) {
return as_camel_case(name, false);
} else {
return name;
}
}

/**
* Applies the correct style to a string based on the value of nocamel_style_
* and/or fullcamel_style_
*/
std::string t_java_generator::get_cap_name(std::string name){
if (nocamel_style_) {
return "_" + name;
} if (fullcamel_style_) {
std::string new_name;
new_name += toupper(name[0]);
for (size_t i = 1; i < name.size(); i++) {
if (name[i] == '_') {
if (i < name.size()-1) {
i++;
new_name += toupper(name[i]);
}
}
else {
new_name += name[i];
}
}
return new_name;
} else if (fullcamel_style_) {
return as_camel_case(name);
} else {
name[0] = toupper(name[0]);
return name;
Expand Down Expand Up @@ -4537,7 +4575,7 @@ THRIFT_REGISTER_GENERATOR(java, "Java",
" beans: Members will be private, and setter methods will return void.\n"
" private-members: Members will be private, but setter methods will return 'this' like usual.\n"
" nocamel: Do not use CamelCase field accessors with beans.\n"
" fullcamel: Convert underscored_field_names to CamelCase.\n"
" fullcamel: Convert underscored_accessor_or_service_names to camelCase.\n"
" android_legacy: Do not use java.io.IOException(throwable) (available for Android 2.3 and above).\n"
" java5: Generate Java 1.5 compliant code (includes android_legacy flag).\n"
" reuse-objects: Data objects will not be allocated, but existing instances will be used (read and write).\n"
Expand Down
10 changes: 10 additions & 0 deletions lib/java/test/org/apache/thrift/TestFullCamel.java
Expand Up @@ -27,6 +27,7 @@
import org.apache.thrift.protocol.TType;

import thrift.test.OneOfEachZZ;
import thrift.test.UnderscoreSrv;

// Sanity check for the code generated by 'fullcamel'.
//
Expand All @@ -45,5 +46,14 @@ public void testCamelCaseSyntax() throws Exception {
assertTrue( obj.isImFalse() == true );
}

public void testCamelCaseRpcMethods() throws Exception {
final UnderscoreSrv.Iface srv = new UnderscoreSrv.Iface() {
@Override
public long someRpcCall(String message) {
return 1l;
}
};
assertTrue(1l == srv.someRpcCall("test"));
}
}

5 changes: 5 additions & 0 deletions test/DenseLinkingTest.thrift
Expand Up @@ -91,3 +91,8 @@ struct RandomStuffZZ {
service Srv {
i32 Janky(1: i32 arg)
}

service UnderscoreSrv {
i64 some_rpc_call(1: string message)
}

0 comments on commit 84d1188

Please sign in to comment.