From: Bryan Duxbury Date: Wed, 8 Jun 2011 17:46:55 +0000 (+0000) Subject: THRIFT-1199. java: Union structs should have generated methods to test whether a... X-Git-Tag: 0.7.0~76 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=63c2d378c53ab7340466495b49451e68a7411c6c;p=common%2Fthrift.git 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 3b8516aa..04aaa406 100644 --- a/compiler/cpp/src/generate/t_java_generator.cc +++ b/compiler/cpp/src/generate/t_java_generator.cc @@ -139,6 +139,7 @@ class t_java_generator : public t_oop_generator { 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 @@ void t_java_generator::generate_java_union(t_struct* tstruct) { 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_getters_and_setters(ofstream& out, t_struc } } +void t_java_generator::generate_union_is_set_methods(ofstream& out, t_struct* tstruct) { + const vector& members = tstruct->get_members(); + vector::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 a0441014..b3d2968b 100644 --- a/lib/java/test/org/apache/thrift/TestTUnion.java +++ b/lib/java/test/org/apache/thrift/TestTUnion.java @@ -49,6 +49,7 @@ public class TestTUnion extends TestCase { 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 @@ public class TestTUnion extends TestCase { 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 @@ public class TestTUnion extends TestCase { assertEquals(1, union.getI32_field()); union.hashCode(); + assertFalse(union.isSetString_field()); + try { union.getString_field(); fail("should have thrown an exception");