From 5226eeaaaa1789fccce5c7cf0a5cef0a38190df8 Mon Sep 17 00:00:00 2001 From: Bryan Duxbury Date: Thu, 5 Aug 2010 20:44:53 +0000 Subject: [PATCH] THRIFT-751. java: Add clear() method to TBase This patch adds a clear() method to the TBase interface and causes the compiler to generate implementations. git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@982774 13f79535-47bb-0310-9956-ffa450edef68 --- compiler/cpp/src/generate/t_java_generator.cc | 46 ++++++++++++++++++- lib/java/src/org/apache/thrift/TBase.java | 6 +++ lib/java/src/org/apache/thrift/TUnion.java | 6 +++ 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc index 89c1956d..298809a4 100644 --- a/compiler/cpp/src/generate/t_java_generator.cc +++ b/compiler/cpp/src/generate/t_java_generator.cc @@ -98,6 +98,7 @@ class t_java_generator : public t_oop_generator { void generate_java_struct_result_writer(std::ofstream& out, t_struct* tstruct); void generate_java_struct_writer(std::ofstream& out, t_struct* tstruct); void generate_java_struct_tostring(std::ofstream& out, t_struct* tstruct); + void generate_java_struct_clear(std::ofstream& out, t_struct* tstruct); void generate_java_meta_data_map(std::ofstream& out, t_struct* tstruct); void generate_field_value_meta_data(std::ofstream& out, t_type* type); std::string get_java_type_string(t_type* type); @@ -739,7 +740,7 @@ void t_java_generator::generate_java_union(t_struct* tstruct) { generate_union_comparisons(f_struct, tstruct); f_struct << endl; - + generate_union_hashcode(f_struct, tstruct); f_struct << endl; @@ -1229,6 +1230,8 @@ void t_java_generator::generate_java_struct_definition(ofstream &out, indent(out) << " return new " << tstruct->get_name() << "(this);" << endl; indent(out) << "}" << endl << endl; + generate_java_struct_clear(out, tstruct); + generate_java_bean_boilerplate(out, tstruct); generate_generic_field_getters_setters(out, tstruct); generate_generic_isset_method(out, tstruct); @@ -3867,6 +3870,47 @@ bool t_java_generator::has_bit_vector(t_struct* tstruct) { return false; } +void t_java_generator::generate_java_struct_clear(std::ofstream& out, t_struct* tstruct) { + indent(out) << "@Override" << endl; + indent(out) << "public void clear() {" << endl; + + const vector& members = tstruct->get_members(); + vector::const_iterator m_iter; + + indent_up(); + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + t_type* t = get_true_type((*m_iter)->get_type()); + if ((*m_iter)->get_value() != NULL) { + print_const_value(out, "this." + (*m_iter)->get_name(), t, (*m_iter)->get_value(), true, true); + } else { + if (type_can_be_null(t)) { + indent(out) << "this." << (*m_iter)->get_name() << " = null;" << endl; + } else { + // must be a base type + // means it also needs to be explicitly unset + indent(out) << "set" << get_cap_name((*m_iter)->get_name()) << get_cap_name("isSet") << "(false);" << endl; + switch (((t_base_type*)t)->get_base()) { + case t_base_type::TYPE_BYTE: + case t_base_type::TYPE_I16: + case t_base_type::TYPE_I32: + case t_base_type::TYPE_I64: + indent(out) << "this." << (*m_iter)->get_name() << " = 0;" << endl; + break; + case t_base_type::TYPE_DOUBLE: + indent(out) << "this." << (*m_iter)->get_name() << " = 0.0;" << endl; + break; + case t_base_type::TYPE_BOOL: + indent(out) << "this." << (*m_iter)->get_name() << " = false;" << endl; + break; + } + } + } + } + indent_down(); + + indent(out) << "}" << endl << endl; +} + THRIFT_REGISTER_GENERATOR(java, "Java", " beans: Members will be private, and setter methods will return void.\n" " private-members: Members will be private, but setter methods will return 'this' like usual.\n" diff --git a/lib/java/src/org/apache/thrift/TBase.java b/lib/java/src/org/apache/thrift/TBase.java index 64ece803..64591131 100644 --- a/lib/java/src/org/apache/thrift/TBase.java +++ b/lib/java/src/org/apache/thrift/TBase.java @@ -93,4 +93,10 @@ public interface TBase extends Comparab public void setFieldValue(F field, Object value); public TBase deepCopy(); + + /** + * Return to the state of having just been initialized, as though you had just + * called the default constructor. + */ + public void clear(); } diff --git a/lib/java/src/org/apache/thrift/TUnion.java b/lib/java/src/org/apache/thrift/TUnion.java index f5a73870..32156c15 100644 --- a/lib/java/src/org/apache/thrift/TUnion.java +++ b/lib/java/src/org/apache/thrift/TUnion.java @@ -226,4 +226,10 @@ public abstract class TUnion implement } return sb.toString(); } + + @Override + public final void clear() { + this.setField_ = null; + this.value_ = null; + } } -- 2.17.1