You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by br...@apache.org on 2009/10/15 03:24:26 UTC

svn commit: r825371 - in /incubator/thrift/trunk: compiler/cpp/src/generate/t_java_generator.cc lib/java/test/org/apache/thrift/test/MetaDataTest.java

Author: bryanduxbury
Date: Thu Oct 15 01:24:26 2009
New Revision: 825371

URL: http://svn.apache.org/viewvc?rev=825371&view=rev
Log:
THRIFT-589. java: Add Field Name to Field ID Mapping
Java Thrift structs now have a static mapping of field name to field ID.

Modified:
    incubator/thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc
    incubator/thrift/trunk/lib/java/test/org/apache/thrift/test/MetaDataTest.java

Modified: incubator/thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc
URL: http://svn.apache.org/viewvc/incubator/thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc?rev=825371&r1=825370&r2=825371&view=diff
==============================================================================
--- incubator/thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc (original)
+++ incubator/thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc Thu Oct 15 01:24:26 2009
@@ -96,6 +96,7 @@
   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 @@
 
   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 @@
 
   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 @@
   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<t_field*>& fields = tstruct->get_members();
+  vector<t_field*>::const_iterator f_iter;
+
+  // Static Map with fieldName -> fieldID
+  indent(out) << "public static final Map<String, Integer> fieldNameMap = Collections.unmodifiableMap(new HashMap<String, Integer>() {{" << 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")

Modified: incubator/thrift/trunk/lib/java/test/org/apache/thrift/test/MetaDataTest.java
URL: http://svn.apache.org/viewvc/incubator/thrift/trunk/lib/java/test/org/apache/thrift/test/MetaDataTest.java?rev=825371&r1=825370&r2=825371&view=diff
==============================================================================
--- incubator/thrift/trunk/lib/java/test/org/apache/thrift/test/MetaDataTest.java (original)
+++ incubator/thrift/trunk/lib/java/test/org/apache/thrift/test/MetaDataTest.java Thu Oct 15 01:24:26 2009
@@ -73,5 +73,15 @@
     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<String, Integer> fnMap = CrazyNesting.fieldNameMap;
+    if (fnMap.size() != 3) {
+      throw new RuntimeException("Field Name Map contains wrong number of entries!");
+    }
+    for (Map.Entry<Integer, FieldMetaData> mdEntry : mdMap.entrySet()) {
+      if (!fnMap.get(mdEntry.getValue().fieldName).equals(mdEntry.getKey())) {
+        throw new RuntimeException("Field name map contained invalid Name <-> ID mapping");
+      }
+    }
   }
 }