You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by ro...@apache.org on 2014/07/25 23:33:19 UTC
git commit: THRIFT-2637 "java:fullcamel_service_methods" option to
automatically camel-case Java service methods
Repository: thrift
Updated Branches:
refs/heads/master 9df385408 -> 84d118884
THRIFT-2637 "java:fullcamel_service_methods" option to automatically camel-case Java service methods
Patch: Tom Lee
Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/84d11888
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/84d11888
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/84d11888
Branch: refs/heads/master
Commit: 84d1188842a27ae3019ddedbfb89039eb3528730
Parents: 9df3854
Author: Roger Meier <ro...@apache.org>
Authored: Fri Jul 25 23:26:11 2014 +0200
Committer: Roger Meier <ro...@apache.org>
Committed: Fri Jul 25 23:26:11 2014 +0200
----------------------------------------------------------------------
compiler/cpp/src/generate/t_java_generator.cc | 88 ++++++++++++++------
.../test/org/apache/thrift/TestFullCamel.java | 10 +++
test/DenseLinkingTest.thrift | 5 ++
3 files changed, 78 insertions(+), 25 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/thrift/blob/84d11888/compiler/cpp/src/generate/t_java_generator.cc
----------------------------------------------------------------------
diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc
index 2975353..4c755ac 100644
--- a/compiler/cpp/src/generate/t_java_generator.cc
+++ b/compiler/cpp/src/generate/t_java_generator.cc
@@ -138,6 +138,8 @@ public:
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);
@@ -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();
@@ -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";
@@ -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
@@ -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";
@@ -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
@@ -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) {
@@ -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) {
@@ -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;
@@ -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;
}
@@ -3826,6 +3843,40 @@ 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_
@@ -3833,21 +3884,8 @@ std::string t_java_generator::make_valid_java_identifier( std::string const & fr
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;
@@ -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"
http://git-wip-us.apache.org/repos/asf/thrift/blob/84d11888/lib/java/test/org/apache/thrift/TestFullCamel.java
----------------------------------------------------------------------
diff --git a/lib/java/test/org/apache/thrift/TestFullCamel.java b/lib/java/test/org/apache/thrift/TestFullCamel.java
index d6fd001..1681fb8 100644
--- a/lib/java/test/org/apache/thrift/TestFullCamel.java
+++ b/lib/java/test/org/apache/thrift/TestFullCamel.java
@@ -27,6 +27,7 @@ import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TType;
import thrift.test.OneOfEachZZ;
+import thrift.test.UnderscoreSrv;
// Sanity check for the code generated by 'fullcamel'.
//
@@ -45,5 +46,14 @@ public class TestFullCamel extends TestCase {
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"));
+ }
}
http://git-wip-us.apache.org/repos/asf/thrift/blob/84d11888/test/DenseLinkingTest.thrift
----------------------------------------------------------------------
diff --git a/test/DenseLinkingTest.thrift b/test/DenseLinkingTest.thrift
index f18234b..3a5b957 100644
--- a/test/DenseLinkingTest.thrift
+++ b/test/DenseLinkingTest.thrift
@@ -91,3 +91,8 @@ struct RandomStuffZZ {
service Srv {
i32 Janky(1: i32 arg)
}
+
+service UnderscoreSrv {
+ i64 some_rpc_call(1: string message)
+}
+