From: Bryan Duxbury Date: Wed, 18 Mar 2009 03:14:56 +0000 (+0000) Subject: THRIFT-379. java: Print enum value names X-Git-Tag: 0.2.0~260 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=3696d643d0bf233fc2b57e5941cf8d416999a166;p=common%2Fthrift.git 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 442488e1..b648a664 100644 --- a/compiler/cpp/src/generate/t_java_generator.cc +++ b/compiler/cpp/src/generate/t_java_generator.cc @@ -177,6 +177,7 @@ class t_java_generator : public t_oop_generator { 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 @@ void t_java_generator::generate_enum(t_enum* tenum) { "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 @@ void t_java_generator::generate_enum(t_enum* tenum) { indent_down(); f_enum << ");" << endl; + indent(f_enum) << "public static final Map VALUES_TO_NAMES = new HashMap() {{" << 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 @@ void t_java_generator::generate_java_validator(ofstream& out, 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 @@ void t_java_generator::generate_java_struct_tostring(ofstream& out, 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());" <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 @@ void t_java_generator::generate_isset_set(ofstream& out, t_field* field) { } } +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"