Do not generate write code for null fields in Java
authorMark Slee <mcslee@apache.org>
Thu, 18 Jan 2007 02:35:27 +0000 (02:35 +0000)
committerMark Slee <mcslee@apache.org>
Thu, 18 Jan 2007 02:35:27 +0000 (02:35 +0000)
Summary: It will make null pointer exceptions!

Reviewed By: martin, alex

git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@664923 13f79535-47bb-0310-9956-ffa450edef68

compiler/cpp/src/generate/t_java_generator.cc
compiler/cpp/src/generate/t_java_generator.h

index ea2d22a..d8c1459 100644 (file)
@@ -479,6 +479,13 @@ void t_java_generator::generate_java_struct_writer(ofstream& out,
     indent() << "oprot.writeStructBegin(struct);" << endl;
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
+    bool null_allowed = type_can_be_null((*f_iter)->get_type());
+    if (null_allowed) {
+      out <<
+        indent() << "if (this." << (*f_iter)->get_name() << " != null) {" << endl;
+      indent_up();
+    }
+
     out <<
       indent() << "field.name = \"" << (*f_iter)->get_name() << "\";" << endl <<
       indent() << "field.type = " << type_to_enum((*f_iter)->get_type()) << ";" << endl <<
@@ -491,6 +498,11 @@ void t_java_generator::generate_java_struct_writer(ofstream& out,
     // Write field closer
     indent(out) <<
       "oprot.writeFieldEnd();" << endl;
+    
+    if (null_allowed) {
+      indent_down();
+      indent(out) << "}" << endl;
+    }
   }
   // Write the struct map
   out <<
@@ -541,6 +553,13 @@ void t_java_generator::generate_java_struct_result_writer(ofstream& out,
       "(this.__isset." << (*f_iter)->get_name() << ") {" << endl;
     indent_up();
 
+    bool null_allowed = type_can_be_null((*f_iter)->get_type());
+    if (null_allowed) {
+      out <<
+        indent() << "if (this." << (*f_iter)->get_name() << " != null) {" << endl;
+      indent_up();
+    }
+
     out <<
       indent() << "field.name = \"" << (*f_iter)->get_name() << "\";" << endl <<
       indent() << "field.type = " << type_to_enum((*f_iter)->get_type()) << ";" << endl <<
@@ -554,6 +573,11 @@ void t_java_generator::generate_java_struct_result_writer(ofstream& out,
     indent(out) <<
       "oprot.writeFieldEnd();" << endl;
 
+    if (null_allowed) {
+      indent_down();
+      indent(out) << "}" << endl;
+    }
+
     indent_down();
     indent(out) << "}";
   }
index b21c76a..35748e5 100644 (file)
@@ -129,6 +129,19 @@ class t_java_generator : public t_oop_generator {
   std::string argument_list(t_struct* tstruct);
   std::string type_to_enum(t_type* ttype);
 
+  bool type_can_be_null(t_type* ttype) {
+    while (ttype->is_typedef()) {
+      ttype = ((t_typedef*)ttype)->get_type();
+    }
+
+    return
+      ttype->is_container() || 
+      ttype->is_struct() ||
+      ttype->is_xception() ||
+      (ttype->is_base_type() && (((t_base_type*)ttype)->get_base() == t_base_type::TYPE_STRING));
+  }
+
+
  private:
 
   /**