Author: bryanduxbury Date: Wed Jun 8 17:46:55 2011 New Revision: 1133482 URL: http://svn.apache.org/viewvc?rev=1133482&view=rev Log: THRIFT-1199. java: Union structs should have generated methods to test whether a specific field is currently set
Patch: Piotr Kozikowski Modified: thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc thrift/trunk/lib/java/test/org/apache/thrift/TestTUnion.java Modified: thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc URL: http://svn.apache.org/viewvc/thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc?rev=1133482&r1=1133481&r2=1133482&view=diff ============================================================================== --- thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc (original) +++ thrift/trunk/compiler/cpp/src/generate/t_java_generator.cc Wed Jun 8 17:46:55 2011 @@ -139,6 +139,7 @@ class t_java_generator : public t_oop_ge 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_uni 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_ge } } +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; Modified: thrift/trunk/lib/java/test/org/apache/thrift/TestTUnion.java URL: http://svn.apache.org/viewvc/thrift/trunk/lib/java/test/org/apache/thrift/TestTUnion.java?rev=1133482&r1=1133481&r2=1133482&view=diff ============================================================================== --- thrift/trunk/lib/java/test/org/apache/thrift/TestTUnion.java (original) +++ thrift/trunk/lib/java/test/org/apache/thrift/TestTUnion.java Wed Jun 8 17:46:55 2011 @@ -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");