THRIFT-379. java: Print enum value names
This patch adds a new generated map of enum values to their respective names to each generated enum class, and then consumes that in the toString method to print the names when possible.
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@755464 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 442488e..b648a66 100644
--- a/compiler/cpp/src/generate/t_java_generator.cc
+++ b/compiler/cpp/src/generate/t_java_generator.cc
@@ -177,6 +177,7 @@
std::string function_signature(t_function* tfunction, std::string prefix="");
std::string argument_list(t_struct* tstruct);
std::string type_to_enum(t_type* ttype);
+ std::string get_enum_class_name(t_type* type);
bool type_can_be_null(t_type* ttype) {
ttype = get_true_type(ttype);
@@ -318,7 +319,9 @@
"import java.util.Set;\n" +
"import java.util.HashSet;\n" +
"import java.util.Collections;\n" +
- "import org.apache.thrift.IntRangeSet;\n"<< endl;
+ "import org.apache.thrift.IntRangeSet;\n" +
+ "import java.util.Map;\n" +
+ "import java.util.HashMap;\n" << endl;
f_enum <<
"public class " << tenum->get_name() << " ";
@@ -354,7 +357,19 @@
indent_down();
f_enum << ");" << endl;
+ indent(f_enum) << "public static final Map<Integer, String> VALUES_TO_NAMES = new HashMap<Integer, String>() {{" << endl;
+
+ indent_up();
+ for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
+ indent(f_enum) << "put(" << (*c_iter)->get_name() << ", \"" << (*c_iter)->get_name() <<"\");" << endl;
+ }
+ indent_down();
+
+
+ indent(f_enum) << "}};" << endl;
+
scope_down(f_enum);
+
f_enum.close();
}
@@ -1037,13 +1052,7 @@
t_type* type = field->get_type();
// if field is an enum, check that its value is valid
if (type->is_enum()){
- string package = "";
- t_program* program = type->get_program();
- if (program != NULL && program != program_) {
- package = program->get_namespace("java") + ".";
- }
-
- indent(out) << "if (" << generate_isset_check(field) << " && !" << package << type->get_name() << ".VALID_VALUES.contains(" << field->get_name() << ")){" << endl;
+ indent(out) << "if (" << generate_isset_check(field) << " && !" << get_enum_class_name(type) << ".VALID_VALUES.contains(" << field->get_name() << ")){" << endl;
indent_up();
indent(out) << "throw new TProtocolException(\"The field '" << field->get_name() << "' has been assigned the invalid value \" + " << field->get_name() << ");" << endl;
indent_down();
@@ -1485,6 +1494,16 @@
indent(out) << " sb.append(Integer.toHexString(this." << field->get_name() << "[i]).length() > 1 ? Integer.toHexString(this." << field->get_name() << "[i]).substring(Integer.toHexString(this." << field->get_name() << "[i]).length() - 2).toUpperCase() : \"0\" + Integer.toHexString(this." << field->get_name() << "[i]).toUpperCase());" <<endl;
indent(out) << " }" << endl;
indent(out) << " if (this." << field->get_name() << ".length > 128) sb.append(\" ...\");" << endl;
+ } else if(field->get_type()->is_enum()) {
+ indent(out) << "String " << field->get_name() << "_name = " << get_enum_class_name(field->get_type()) << ".VALUES_TO_NAMES.get(this." << (*f_iter)->get_name() << ");"<< endl;
+ indent(out) << "if (" << field->get_name() << "_name != null) {" << endl;
+ indent(out) << " sb.append(" << field->get_name() << "_name);" << endl;
+ indent(out) << " sb.append(\" (\");" << endl;
+ indent(out) << "}" << endl;
+ indent(out) << "sb.append(this." << field->get_name() << ");" << endl;
+ indent(out) << "if (" << field->get_name() << "_name != null) {" << endl;
+ indent(out) << " sb.append(\")\");" << endl;
+ indent(out) << "}" << endl;
} else {
indent(out) << "sb.append(this." << (*f_iter)->get_name() << ");" << endl;
}
@@ -2968,6 +2987,14 @@
}
}
+std::string t_java_generator::get_enum_class_name(t_type* type) {
+ string package = "";
+ t_program* program = type->get_program();
+ if (program != NULL && program != program_) {
+ package = program->get_namespace("java") + ".";
+ }
+ return package + type->get_name();
+}
THRIFT_REGISTER_GENERATOR(java, "Java",
" beans: Generate bean-style output files.\n"