From: Bryan Duxbury Date: Thu, 15 Oct 2009 01:24:26 +0000 (+0000) Subject: THRIFT-589. java: Add Field Name to Field ID Mapping X-Git-Tag: 0.2.0~22 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=72fd472476a68dc55ca8cbfb05452d6c69fb0d19;p=common%2Fthrift.git THRIFT-589. java: Add Field Name to Field ID Mapping Java Thrift structs now have a static mapping of field name to field ID. git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@825371 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 3d318cb1..14d48780 100644 --- a/compiler/cpp/src/generate/t_java_generator.cc +++ b/compiler/cpp/src/generate/t_java_generator.cc @@ -96,6 +96,7 @@ class t_java_generator : public t_oop_generator { void generate_java_struct_writer(std::ofstream& out, t_struct* tstruct); void generate_java_struct_tostring(std::ofstream& out, t_struct* tstruct); void generate_java_meta_data_map(std::ofstream& out, t_struct* tstruct); + void generate_java_field_name_map(std::ofstream& out, t_struct* tstruct); void generate_field_value_meta_data(std::ofstream& out, t_type* type); std::string get_java_type_string(t_type* type); void generate_reflection_setters(std::ostringstream& out, t_type* type, std::string field_name, std::string cap_name); @@ -689,6 +690,8 @@ void t_java_generator::generate_java_union(t_struct* tstruct) { generate_java_meta_data_map(f_struct, tstruct); + generate_java_field_name_map(f_struct, tstruct); + generate_union_constructor(f_struct, tstruct); f_struct << endl; @@ -1070,6 +1073,8 @@ void t_java_generator::generate_java_struct_definition(ofstream &out, bool all_optional_members = true; + generate_java_field_name_map(out, tstruct); + // Default constructor indent(out) << "public " << tstruct->get_name() << "() {" << endl; @@ -2002,6 +2007,30 @@ void t_java_generator::generate_java_meta_data_map(ofstream& out, indent(out) << "}" << endl << endl; } +/** + * Generates a static map from field names to field IDs + * + * @param tstruct The struct definition + */ +void t_java_generator::generate_java_field_name_map(ofstream& out, + t_struct* tstruct) { + const vector& fields = tstruct->get_members(); + vector::const_iterator f_iter; + + // Static Map with fieldName -> fieldID + indent(out) << "public static final Map fieldNameMap = Collections.unmodifiableMap(new HashMap() {{" << endl; + + // Populate map + indent_up(); + for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { + t_field* field = *f_iter; + std::string field_name = field->get_name(); + indent(out) << "put(\"" << field->get_name() << "\", new Integer(" << upcase_string(field->get_name()) << "));" << endl; + } + indent_down(); + indent(out) << "}});" << endl << endl; +} + /** * Returns a string with the java representation of the given thrift type * (e.g. for the type struct it returns "TType.STRUCT") diff --git a/lib/java/test/org/apache/thrift/test/MetaDataTest.java b/lib/java/test/org/apache/thrift/test/MetaDataTest.java index a0180348..386ec9b8 100644 --- a/lib/java/test/org/apache/thrift/test/MetaDataTest.java +++ b/lib/java/test/org/apache/thrift/test/MetaDataTest.java @@ -73,5 +73,15 @@ public class MetaDataTest { if (FieldMetaData.getStructMetaDataMap(CrazyNesting.class) != CrazyNesting.metaDataMap || FieldMetaData.getStructMetaDataMap(Insanity.class) != Insanity.metaDataMap) throw new RuntimeException("global metadata map contains wrong entry for a loaded struct"); + + Map fnMap = CrazyNesting.fieldNameMap; + if (fnMap.size() != 3) { + throw new RuntimeException("Field Name Map contains wrong number of entries!"); + } + for (Map.Entry mdEntry : mdMap.entrySet()) { + if (!fnMap.get(mdEntry.getValue().fieldName).equals(mdEntry.getKey())) { + throw new RuntimeException("Field name map contained invalid Name <-> ID mapping"); + } + } } }