diff options
author | David Reiss <dreiss@apache.org> | 2009-01-05 21:02:58 +0000 |
---|---|---|
committer | David Reiss <dreiss@apache.org> | 2009-01-05 21:02:58 +0000 |
commit | 25be92bf0d9ef587f24696caf182788705fa1119 (patch) | |
tree | 03088539e7cf14c6b15f8d451944cc8e566987b4 | |
parent | 2db737df8fa19f5fcb2f926b0fe2594f0154d7f4 (diff) | |
download | thrift-25be92bf0d9ef587f24696caf182788705fa1119.tar.gz |
THRIFT-222. java: Better exposure if __isset in beans style
- Generate an isSet method for each field to test its set-ness.
- Generate a generic isSet method that checks by field id.
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@731722 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | compiler/cpp/src/generate/t_java_generator.cc | 36 | ||||
-rw-r--r-- | test/JavaBeansTest.thrift | 15 | ||||
-rw-r--r-- | test/java/build.xml | 7 | ||||
-rw-r--r-- | test/java/src/JavaBeansTest.java | 91 |
4 files changed, 148 insertions, 1 deletions
diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc index a49c0a876..4a9dfc947 100644 --- a/compiler/cpp/src/generate/t_java_generator.cc +++ b/compiler/cpp/src/generate/t_java_generator.cc @@ -82,6 +82,7 @@ class t_java_generator : public t_oop_generator { void generate_reflection_setters(std::ostringstream& out, t_type* type, std::string field_name, std::string cap_name); void generate_reflection_getters(std::ostringstream& out, t_type* type, std::string field_name, std::string cap_name); void generate_generic_field_getters_setters(std::ofstream& out, t_struct* tstruct); + void generate_generic_isset_method(std::ofstream& out, t_struct* tstruct); void generate_java_bean_boilerplate(std::ofstream& out, t_struct* tstruct); void generate_function_helpers(t_function* tfunction); @@ -706,6 +707,7 @@ void t_java_generator::generate_java_struct_definition(ofstream &out, if (bean_style_) { generate_java_bean_boilerplate(out, tstruct); generate_generic_field_getters_setters(out, tstruct); + generate_generic_isset_method(out, tstruct); } generate_java_struct_equality(out, tstruct); @@ -1203,7 +1205,33 @@ void t_java_generator::generate_generic_field_getters_setters(std::ofstream& out indent(out) << "}" << endl << endl; } +// Creates a generic isSet method that takes the field number as argument +void t_java_generator::generate_generic_isset_method(std::ofstream& out, t_struct* tstruct){ + const vector<t_field*>& fields = tstruct->get_members(); + vector<t_field*>::const_iterator f_iter; + + // create the isSet method + indent(out) << "// Returns true if field corresponding to fieldID is set (has been asigned a value) and false otherwise" << endl; + indent(out) << "public boolean isSet(int fieldID) {" << endl; + indent_up(); + indent(out) << "switch (fieldID) {" << endl; + for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { + t_field* field = *f_iter; + indent(out) << "case " << upcase_string(field->get_name()) << ":" << endl; + indent_up(); + indent(out) << "return this.__isset." << field->get_name() << ";" << endl; + indent_down(); + } + + indent(out) << "default:" << endl; + indent(out) << " throw new IllegalArgumentException(\"Field \" + fieldID + \" doesn't exist!\");" << endl; + + indent(out) << "}" << endl; + + indent_down(); + indent(out) << "}" << endl << endl; +} /** * Generates a set of Java Bean boilerplate functions (setters, getters, etc.) @@ -1334,6 +1362,14 @@ void t_java_generator::generate_java_bean_boilerplate(ofstream& out, indent(out) << "this.__isset." << field_name << " = false;" << endl; indent_down(); indent(out) << "}" << endl << endl; + + // isSet method + indent(out) << "// Returns true if field " << field_name << " is set (has been asigned a value) and false otherwise" << endl; + indent(out) << "public boolean is" << get_cap_name("set") << cap_name << "() {" << endl; + indent_up(); + indent(out) << "return this.__isset." << field_name << ";" << endl; + indent_down(); + indent(out) << "}" << endl << endl; } } diff --git a/test/JavaBeansTest.thrift b/test/JavaBeansTest.thrift new file mode 100644 index 000000000..0b4b16080 --- /dev/null +++ b/test/JavaBeansTest.thrift @@ -0,0 +1,15 @@ +namespace java thrift.test + +struct OneOfEachBeans { + 1: bool boolean_field, + 2: byte a_bite, + 3: i16 integer16, + 4: i32 integer32, + 5: i64 integer64, + 6: double double_precision, + 7: string some_characters, + 8: binary base64, + 9: list<byte> byte_list, + 10: list<i16> i16_list, + 11: list<i64> i64_list +} diff --git a/test/java/build.xml b/test/java/build.xml index 1ed1ff1e9..0860d9c7c 100644 --- a/test/java/build.xml +++ b/test/java/build.xml @@ -4,6 +4,7 @@ <property name="src" location="src" /> <property name="gen" location="gen-java" /> + <property name="genbean" location="gen-javabean" /> <property name="build" location="build" /> <property name="cpath" location="../../lib/java/libthrift.jar:/usr/share/java/commons-lang-2.3.jar" /> <property name="testjar" location="thrifttest.jar" /> @@ -24,12 +25,13 @@ <arg line="--gen java:hashcode ../OptionalRequiredTest.thrift" /> </exec> <exec executable="../../compiler/cpp/thrift"> - <arg line="--gen java ../DebugProtoTest.thrift" /> + <arg line="--gen java:beans,nocamel ../JavaBeansTest.thrift" /> </exec> </target> <target name="compileonly"> <javac debug="true" srcdir="${gen}" destdir="${build}" classpath="${cpath}" /> + <javac debug="true" srcdir="${genbean}" destdir="${build}" classpath="${cpath}" /> <javac debug="true" srcdir="${src}" destdir="${build}" classpath="${cpath}:${gen}" /> </target> @@ -48,10 +50,13 @@ classpath="${cpath}:${testjar}:${gen}" failonerror="true" /> <java classname="com.facebook.thrift.test.DeepCopyTest" classpath="${cpath}:${testjar}:${gen}" failonerror="true" /> + <java classname="com.facebook.thrift.test.JavaBeansTest" + classpath="${cpath}:${testjar}:${gen}" failonerror="true" /> </target> <target name="clean"> <delete dir="gen-java" /> + <delete dir="gen-javabean" /> <delete dir="${build}" /> <delete file="thrifttest.jar" /> </target> diff --git a/test/java/src/JavaBeansTest.java b/test/java/src/JavaBeansTest.java new file mode 100644 index 000000000..f1d70a351 --- /dev/null +++ b/test/java/src/JavaBeansTest.java @@ -0,0 +1,91 @@ +package com.facebook.thrift.test; + +import java.util.LinkedList; +import thrift.test.OneOfEachBeans; + +public class JavaBeansTest { + public static void main(String[] args) throws Exception { + // Test isSet methods + OneOfEachBeans ooe = new OneOfEachBeans(); + + // Nothing should be set + if (ooe.is_set_a_bite()) + throw new RuntimeException("isSet method error: unset field returned as set!"); + if (ooe.is_set_base64()) + throw new RuntimeException("isSet method error: unset field returned as set!"); + if (ooe.is_set_byte_list()) + throw new RuntimeException("isSet method error: unset field returned as set!"); + if (ooe.is_set_double_precision()) + throw new RuntimeException("isSet method error: unset field returned as set!"); + if (ooe.is_set_i16_list()) + throw new RuntimeException("isSet method error: unset field returned as set!"); + if (ooe.is_set_i64_list()) + throw new RuntimeException("isSet method error: unset field returned as set!"); + if (ooe.is_set_boolean_field()) + throw new RuntimeException("isSet method error: unset field returned as set!"); + if (ooe.is_set_integer16()) + throw new RuntimeException("isSet method error: unset field returned as set!"); + if (ooe.is_set_integer32()) + throw new RuntimeException("isSet method error: unset field returned as set!"); + if (ooe.is_set_integer64()) + throw new RuntimeException("isSet method error: unset field returned as set!"); + if (ooe.is_set_some_characters()) + throw new RuntimeException("isSet method error: unset field returned as set!"); + + for (int i = 1; i < 12; i++){ + if (ooe.isSet(i)) + throw new RuntimeException("isSet method error: unset field " + i + " returned as set!"); + } + + // Everything is set + ooe.set_a_bite((byte) 1); + ooe.set_base64("bytes".getBytes()); + ooe.set_byte_list(new LinkedList()); + ooe.set_double_precision(1); + ooe.set_i16_list(new LinkedList()); + ooe.set_i64_list(new LinkedList()); + ooe.set_boolean_field(true); + ooe.set_integer16((short) 1); + ooe.set_integer32(1); + ooe.set_integer64(1); + ooe.set_some_characters("string"); + + if (!ooe.is_set_a_bite()) + throw new RuntimeException("isSet method error: set field returned as unset!"); + if (!ooe.is_set_base64()) + throw new RuntimeException("isSet method error: set field returned as unset!"); + if (!ooe.is_set_byte_list()) + throw new RuntimeException("isSet method error: set field returned as unset!"); + if (!ooe.is_set_double_precision()) + throw new RuntimeException("isSet method error: set field returned as unset!"); + if (!ooe.is_set_i16_list()) + throw new RuntimeException("isSet method error: set field returned as unset!"); + if (!ooe.is_set_i64_list()) + throw new RuntimeException("isSet method error: set field returned as unset!"); + if (!ooe.is_set_boolean_field()) + throw new RuntimeException("isSet method error: set field returned as unset!"); + if (!ooe.is_set_integer16()) + throw new RuntimeException("isSet method error: set field returned as unset!"); + if (!ooe.is_set_integer32()) + throw new RuntimeException("isSet method error: set field returned as unset!"); + if (!ooe.is_set_integer64()) + throw new RuntimeException("isSet method error: set field returned as unset!"); + if (!ooe.is_set_some_characters()) + throw new RuntimeException("isSet method error: set field returned as unset!"); + + for (int i = 1; i < 12; i++){ + if (!ooe.isSet(i)) + throw new RuntimeException("isSet method error: set field " + i + " returned as unset!"); + } + + // Should throw exception when field doesn't exist + boolean exceptionThrown = false; + try{ + if (ooe.isSet(100)); + } catch (IllegalArgumentException e){ + exceptionThrown = true; + } + if (!exceptionThrown) + throw new RuntimeException("isSet method error: non-existent field provided as agument but no exception thrown!"); + } +} |