THRIFT-1199. java: Union structs should have generated methods to test whether a specific field is currently set
Patch: Piotr Kozikowski
git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1133482 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 3b8516a..04aaa40 100644
--- a/compiler/cpp/src/generate/t_java_generator.cc
+++ b/compiler/cpp/src/generate/t_java_generator.cc
@@ -139,6 +139,7 @@
void generate_java_union(t_struct* tstruct);
void generate_union_constructor(ofstream& out, t_struct* tstruct);
void generate_union_getters_and_setters(ofstream& out, t_struct* tstruct);
+ void generate_union_is_set_methods(ofstream& out, t_struct* tstruct);
void generate_union_abstract_methods(ofstream& out, t_struct* tstruct);
void generate_check_type(ofstream& out, t_struct* tstruct);
void generate_read_value(ofstream& out, t_struct* tstruct);
@@ -727,6 +728,10 @@
f_struct << endl;
generate_union_getters_and_setters(f_struct, tstruct);
+
+ f_struct << endl;
+
+ generate_union_is_set_methods(f_struct, tstruct);
f_struct << endl;
@@ -854,6 +859,28 @@
}
}
+void t_java_generator::generate_union_is_set_methods(ofstream& out, t_struct* tstruct) {
+ const vector<t_field*>& members = tstruct->get_members();
+ vector<t_field*>::const_iterator m_iter;
+
+ bool first = true;
+ for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
+ if (first) {
+ first = false;
+ } else {
+ out << endl;
+ }
+
+ std::string field_name = (*m_iter)->get_name();
+
+ indent(out) << "public boolean is" << get_cap_name("set") << get_cap_name(field_name) << "() {" << endl;
+ indent_up();
+ indent(out) << "return setField_ == _Fields." << constant_name(field_name) << ";" << endl;
+ indent_down();
+ indent(out) << "}" << endl << endl;
+ }
+}
+
void t_java_generator::generate_union_abstract_methods(ofstream& out, t_struct* tstruct) {
generate_check_type(out, tstruct);
out << endl;
diff --git a/lib/java/test/org/apache/thrift/TestTUnion.java b/lib/java/test/org/apache/thrift/TestTUnion.java
index a044101..b3d2968 100644
--- a/lib/java/test/org/apache/thrift/TestTUnion.java
+++ b/lib/java/test/org/apache/thrift/TestTUnion.java
@@ -49,6 +49,7 @@
TestUnion union = new TestUnion();
assertFalse(union.isSet());
+ assertFalse(union.isSetI32_field());
assertNull(union.getFieldValue());
union = new TestUnion(TestUnion._Fields.I32_FIELD, 25);
@@ -56,6 +57,8 @@
assertEquals(Integer.valueOf(25), union.getFieldValue());
assertEquals(Integer.valueOf(25), union.getFieldValue(TestUnion._Fields.I32_FIELD));
+
+ assertTrue(union.isSetI32_field());
try {
union.getFieldValue(TestUnion._Fields.STRING_FIELD);
@@ -73,6 +76,8 @@
assertEquals(1, union.getI32_field());
union.hashCode();
+ assertFalse(union.isSetString_field());
+
try {
union.getString_field();
fail("should have thrown an exception");