summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan Duxbury <bryanduxbury@apache.org>2009-10-15 01:24:26 +0000
committerBryan Duxbury <bryanduxbury@apache.org>2009-10-15 01:24:26 +0000
commit72fd472476a68dc55ca8cbfb05452d6c69fb0d19 (patch)
tree51c714a9cad4de734d3558ce8a35953a67d64698
parent834895d15c8e6761b1dd28401966c39d32954936 (diff)
downloadthrift-72fd472476a68dc55ca8cbfb05452d6c69fb0d19.tar.gz
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
-rw-r--r--compiler/cpp/src/generate/t_java_generator.cc29
-rw-r--r--lib/java/test/org/apache/thrift/test/MetaDataTest.java10
2 files changed, 39 insertions, 0 deletions
diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc
index 3d318cb16..14d48780a 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<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")
diff --git a/lib/java/test/org/apache/thrift/test/MetaDataTest.java b/lib/java/test/org/apache/thrift/test/MetaDataTest.java
index a0180348f..386ec9b85 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<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");
+ }
+ }
}
}