THRIFT-191. java: Create a static field id -> name map for each struct
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@731720 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 54d99a4..ba7d639 100644
--- a/compiler/cpp/src/generate/t_java_generator.cc
+++ b/compiler/cpp/src/generate/t_java_generator.cc
@@ -78,6 +78,7 @@
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_java_meta_data_map(std::ofstream& out, t_struct* tstruct);
void generate_reflection_setters(std::ostringstream& out, t_type* type, std::string field_name, std::string cap_name);
void generate_reflection_getters(std::ostringstream& out, t_type* type, std::string field_name, std::string cap_name);
void generate_generic_field_getters_setters(std::ofstream& out, t_struct* tstruct);
@@ -250,6 +251,7 @@
"import java.util.HashMap;\n" +
"import java.util.Set;\n" +
"import java.util.HashSet;\n" +
+ "import java.util.Collections;\n" +
hash_builder +
"import com.facebook.thrift.*;\n\n";
}
@@ -613,6 +615,8 @@
endl;
}
+ generate_java_meta_data_map(out, tstruct);
+
// Default constructor
indent(out) <<
"public " << tstruct->get_name() << "() {" << endl;
@@ -1421,6 +1425,31 @@
endl;
}
+/**
+ * Generates a static map with meta data to store information such as fieldID to
+ * fieldName mapping
+ *
+ * @param tstruct The struct definition
+ */
+void t_java_generator::generate_java_meta_data_map(ofstream& out,
+ t_struct* tstruct) {
+ const vector<t_field*>& fields = tstruct->get_members();
+ vector<t_field*>::const_iterator f_iter;
+
+ // Static Map with fieldID -> FieldMetaData mappings
+ indent(out) << "public static final Map<Integer, FieldMetaData> metaDataMap = Collections.unmodifiableMap(new HashMap<Integer, FieldMetaData>() {{" << 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(" << upcase_string(field_name) << ", new FieldMetaData(\"" << field_name << "\"));" << endl;
+ }
+ indent_down();
+ indent(out) << "}});" << endl << endl;
+}
+
/**
* Generates a thrift service. In C++, this comprises an entirely separate
diff --git a/lib/java/src/com/facebook/thrift/FieldMetaData.java b/lib/java/src/com/facebook/thrift/FieldMetaData.java
new file mode 100644
index 0000000..de530d6
--- /dev/null
+++ b/lib/java/src/com/facebook/thrift/FieldMetaData.java
@@ -0,0 +1,8 @@
+package com.facebook.thrift;
+
+public class FieldMetaData implements java.io.Serializable {
+ public final String fieldName;
+ public FieldMetaData(String fieldName){
+ this.fieldName = fieldName;
+ }
+}