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");