Generate toString() convenience method for Thrift java structs

Reviewed By: biren


git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665059 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc
index 6a444d5..4807d4a 100644
--- a/compiler/cpp/src/generate/t_java_generator.cc
+++ b/compiler/cpp/src/generate/t_java_generator.cc
@@ -403,6 +403,7 @@
   } else {
     generate_java_struct_writer(out, tstruct);
   }
+  generate_java_struct_tostring(out, tstruct);
   scope_down(out);
   out << endl;
 }
@@ -548,7 +549,8 @@
 
   indent_down();
   out <<
-    indent() << "}" << endl;
+    indent() << "}" << endl <<
+    endl;
 }
 
 /**
@@ -630,6 +632,46 @@
     endl;
 }
 
+/**
+ * Generates a toString() method for the given struct
+ *
+ * @param tstruct The struct definition
+ */
+void t_java_generator::generate_java_struct_tostring(ofstream& out,
+                                                     t_struct* tstruct) {
+  out <<
+    indent() << "public String toString() {" << endl;
+  indent_up();
+
+  out <<
+    indent() << "StringBuffer sb = new StringBuffer(\"" << tstruct->get_name() << "(\");" << endl;
+
+  const vector<t_field*>& fields = tstruct->get_members();
+  vector<t_field*>::const_iterator f_iter;
+  bool first = true;
+  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
+    if (first) {
+      first = false;
+      indent(out) << "sb.append(\"" << (*f_iter)->get_name() << ":\");" << endl;
+    } else {
+      indent(out) << "sb.append(\"," << (*f_iter)->get_name() << ":\");" << endl;
+    }
+    t_type* ttype = (*f_iter)->get_type();
+    if (ttype->is_xception() || ttype->is_struct()) {
+      indent(out) << "sb.append(this." << (*f_iter)->get_name() << ".toString());" << endl;
+    } else {
+      indent(out) << "sb.append(this." << (*f_iter)->get_name() << ");" << endl;
+    }
+  }
+  out <<
+    indent() << "sb.append(\")\");" << endl <<
+    indent() << "return sb.toString();" << endl;
+
+  indent_down();
+  indent(out) << "}" << endl <<
+    endl;
+}
+
 
 /**
  * Generates a thrift service. In C++, this comprises an entirely separate
diff --git a/compiler/cpp/src/generate/t_java_generator.h b/compiler/cpp/src/generate/t_java_generator.h
index 4853343..7afffdb 100644
--- a/compiler/cpp/src/generate/t_java_generator.h
+++ b/compiler/cpp/src/generate/t_java_generator.h
@@ -53,6 +53,7 @@
   void generate_java_struct_reader(std::ofstream& out, t_struct* tstruct);
   void generate_java_struct_result_writer(std::ofstream& out, t_struct* tstruct);
   void generate_java_struct_writer(std::ofstream& out, t_struct* tstruct);
+  void generate_java_struct_tostring(std::ofstream& out, t_struct* tstruct);
 
   void generate_function_helpers(t_function* tfunction);