void t_java_generator::generate_java_bean_boilerplate()

in compiler/cpp/src/thrift/generate/t_java_generator.cc [2429:2810]


void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* tstruct) {
  isset_type issetType = needs_isset(tstruct);
  const vector<t_field*>& fields = tstruct->get_members();
  vector<t_field*>::const_iterator f_iter;
  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
    t_field* field = *f_iter;
    t_type* type = get_true_type(field->get_type());
    std::string field_name = field->get_name();
    std::string cap_name = get_cap_name(field_name);
    bool optional = use_option_type_ && field->get_req() == t_field::T_OPTIONAL;
    bool is_deprecated = this->is_deprecated(field->annotations_);

    if (type->is_container()) {
      // Method to return the size of the collection
      if (optional) {
        if (is_deprecated) {
          indent(out) << "@Deprecated" << '\n';
        }

        if (use_jdk8_option_type_) {
          indent(out) << "public " << jdk_option_class << "<Integer> get" << cap_name;
        } else {
          indent(out) << "public " << thrift_option_class << "<Integer> get" << cap_name;
        }

        out << get_cap_name("size() {") << '\n';

        indent_up();
        indent(out) << "if (this." << field_name << " == null) {" << '\n';
        indent_up();

        if (use_jdk8_option_type_) {
          indent(out) << "return " << jdk_option_class << ".empty();" << '\n';
        } else {
          indent(out) << "return " << thrift_option_class << ".none();" << '\n';
        }

        indent_down();
        indent(out) << "} else {" << '\n';
        indent_up();

        if (use_jdk8_option_type_) {
          indent(out) << "return " << jdk_option_class << ".of(this.";
        } else {
          indent(out) << "return " << thrift_option_class << ".some(this.";
        }
        out << field_name << ".size());" << '\n';

        indent_down();
        indent(out) << "}" << '\n';
        indent_down();
        indent(out) << "}" << '\n' << '\n';
      } else {
        if (is_deprecated) {
          indent(out) << "@Deprecated" << '\n';
        }
        indent(out) << "public int get" << cap_name;
        out << get_cap_name("size() {") << '\n';

        indent_up();
        indent(out) << "return (this." << field_name << " == null) ? 0 : "
                    << "this." << field_name << ".size();" << '\n';
        indent_down();
        indent(out) << "}" << '\n' << '\n';
      }
    }

    if (type->is_set() || type->is_list()) {
      t_type* element_type;
      if (type->is_set()) {
        element_type = ((t_set*)type)->get_elem_type();
      } else {
        element_type = ((t_list*)type)->get_elem_type();
      }

      // Iterator getter for sets and lists
      if (optional) {
        if (is_deprecated) {
          indent(out) << "@Deprecated" << '\n';
        }

        if (use_jdk8_option_type_) {
          indent(out) << "public " << jdk_option_class << "<";
        } else {
          indent(out) << "public " << thrift_option_class << "<";
        }
        out << "java.util.Iterator<" << type_name(element_type, true, false) << ">> get"
            << cap_name;

        out << get_cap_name("iterator() {") << '\n';

        indent_up();
        indent(out) << "if (this." << field_name << " == null) {" << '\n';
        indent_up();

        if (use_jdk8_option_type_) {
          indent(out) << "return " << jdk_option_class << ".empty();" << '\n';
        } else {
          indent(out) << "return " << thrift_option_class << ".none();" << '\n';
        }

        indent_down();
        indent(out) << "} else {" << '\n';
        indent_up();

        if (use_jdk8_option_type_) {
          indent(out) << "return " << jdk_option_class << ".of(this.";
        } else {
          indent(out) << "return " << thrift_option_class << ".some(this.";
        }
        out << field_name << ".iterator());" << '\n';

        indent_down();
        indent(out) << "}" << '\n';
        indent_down();
        indent(out) << "}" << '\n' << '\n';
      } else {
        if (is_deprecated) {
          indent(out) << "@Deprecated" << '\n';
        }
        indent(out) << java_nullable_annotation() << '\n';
        indent(out) << "public java.util.Iterator<" << type_name(element_type, true, false)
                    << "> get" << cap_name;
        out << get_cap_name("iterator() {") << '\n';

        indent_up();
        indent(out) << "return (this." << field_name << " == null) ? null : "
                    << "this." << field_name << ".iterator();" << '\n';
        indent_down();
        indent(out) << "}" << '\n' << '\n';
      }

      // Add to set or list, create if the set/list is null
      if (is_deprecated) {
        indent(out) << "@Deprecated" << '\n';
      }
      indent(out) << "public void add" << get_cap_name("to");
      out << cap_name << "(" << type_name(element_type) << " elem) {" << '\n';

      indent_up();
      indent(out) << "if (this." << field_name << " == null) {" << '\n';
      indent_up();
      indent(out) << "this." << field_name;
      if (is_enum_set(type)) {
        out << " = " << type_name(type, false, true, true) << ".noneOf("
            << inner_enum_type_name(type) << ");" << '\n';
      } else {
        out << " = new " << type_name(type, false, true) << "();" << '\n';
      }
      indent_down();
      indent(out) << "}" << '\n';
      indent(out) << "this." << field_name << ".add(elem);" << '\n';
      indent_down();
      indent(out) << "}" << '\n' << '\n';
    } else if (type->is_map()) {
      // Put to map
      t_type* key_type = ((t_map*)type)->get_key_type();
      t_type* val_type = ((t_map*)type)->get_val_type();

      if (is_deprecated) {
        indent(out) << "@Deprecated" << '\n';
      }
      indent(out) << "public void put" << get_cap_name("to");
      out << cap_name << "(" << type_name(key_type) << " key, " << type_name(val_type) << " val) {"
          << '\n';

      indent_up();
      indent(out) << "if (this." << field_name << " == null) {" << '\n';
      indent_up();
      std::string constructor_args;
      if (is_enum_map(type)) {
        constructor_args = inner_enum_type_name(type);
      }
      indent(out) << "this." << field_name << " = new " << type_name(type, false, true) << "("
                  << constructor_args << ");" << '\n';
      indent_down();
      indent(out) << "}" << '\n';
      indent(out) << "this." << field_name << ".put(key, val);" << '\n';
      indent_down();
      indent(out) << "}" << '\n' << '\n';
    }

    // Simple getter
    generate_java_doc(out, field);
    if (type->is_binary()) {
      if (is_deprecated) {
        indent(out) << "@Deprecated" << '\n';
      }
      indent(out) << "public byte[] get" << cap_name << "() {" << '\n';
      indent(out) << "  set" << cap_name << "(org.apache.thrift.TBaseHelper.rightSize("
                  << field_name << "));" << '\n';
      indent(out) << "  return " << field_name << " == null ? null : " << field_name << ".array();"
                  << '\n';
      indent(out) << "}" << '\n' << '\n';

      indent(out) << "public java.nio.ByteBuffer buffer" << get_cap_name("for") << cap_name
                  << "() {" << '\n';
      if (unsafe_binaries_) {
        indent(out) << "  return " << field_name << ";" << '\n';
      } else {
        indent(out) << "  return org.apache.thrift.TBaseHelper.copyBinary(" << field_name << ");"
                    << '\n';
      }
      indent(out) << "}" << '\n' << '\n';
    } else {
      if (optional) {
        if (is_deprecated) {
          indent(out) << "@Deprecated" << '\n';
        }

        if (use_jdk8_option_type_) {
          indent(out) << "public " << jdk_option_class << "<" << type_name(type, true) << ">";
        } else {
          indent(out) << "public " << thrift_option_class << "<" << type_name(type, true) << ">";
        }

        if (type->is_base_type() && ((t_base_type*)type)->get_base() == t_base_type::TYPE_BOOL) {
          out << " is";
        } else {
          out << " get";
        }
        out << cap_name << "() {" << '\n';
        indent_up();

        indent(out) << "if (this.isSet" << cap_name << "()) {" << '\n';
        indent_up();

        if (use_jdk8_option_type_) {
          indent(out) << "return " << jdk_option_class << ".of(this.";
        } else {
          indent(out) << "return " << thrift_option_class << ".some(this.";
        }
        out << field_name << ");" << '\n';

        indent_down();
        indent(out) << "} else {" << '\n';
        indent_up();

        if (use_jdk8_option_type_) {
          indent(out) << "return " << jdk_option_class << ".empty();" << '\n';
        } else {
          indent(out) << "return " << thrift_option_class << ".none();" << '\n';
        }

        indent_down();
        indent(out) << "}" << '\n';
        indent_down();
        indent(out) << "}" << '\n' << '\n';
      } else {
        if (is_deprecated) {
          indent(out) << "@Deprecated" << '\n';
        }
        if (type_can_be_null(type)) {
          indent(out) << java_nullable_annotation() << '\n';
        }
        indent(out) << "public " << type_name(type);
        if (type->is_base_type() && ((t_base_type*)type)->get_base() == t_base_type::TYPE_BOOL) {
          out << " is";
        } else {
          out << " get";
        }
        out << cap_name << "() {" << '\n';
        indent_up();
        indent(out) << "return this." << make_valid_java_identifier(field_name) << ";" << '\n';
        indent_down();
        indent(out) << "}" << '\n' << '\n';
      }
    }

    // Simple setter
    generate_java_doc(out, field);
    if (type->is_binary()) {
      if (is_deprecated) {
        indent(out) << "@Deprecated" << '\n';
      }
      indent(out) << "public ";
      if (bean_style_) {
        out << "void";
      } else {
        out << type_name(tstruct);
      }
      out << " set" << cap_name << "(byte[] " << make_valid_java_identifier(field_name) << ") {" << '\n';
      indent(out) << "  this." << make_valid_java_identifier(field_name) << " = " << make_valid_java_identifier(field_name)
                  << " == null ? (java.nio.ByteBuffer)null";

      if (unsafe_binaries_) {
        indent(out) << " : java.nio.ByteBuffer.wrap(" << make_valid_java_identifier(field_name) << ");" << '\n';
      } else {
        indent(out) << " : java.nio.ByteBuffer.wrap(" << make_valid_java_identifier(field_name) << ".clone());" << '\n';
      }

      if (!bean_style_) {
        indent(out) << "  return this;" << '\n';
      }
      indent(out) << "}" << '\n' << '\n';
    }
    if (is_deprecated) {
      indent(out) << "@Deprecated" << '\n';
    }
    indent(out) << "public ";
    if (bean_style_) {
      out << "void";
    } else {
      out << type_name(tstruct);
    }
    out << " set" << cap_name << "("
        << (type_can_be_null(type) ? (java_nullable_annotation() + " ") : "")
        << type_name(type)
        << " " << make_valid_java_identifier(field_name) << ") {" << '\n';
    indent_up();
    indent(out) << "this." << make_valid_java_identifier(field_name) << " = ";
    if (type->is_binary() && !unsafe_binaries_) {
      out << "org.apache.thrift.TBaseHelper.copyBinary(" << make_valid_java_identifier(field_name) << ")";
    } else {
      out << make_valid_java_identifier(field_name);
    }
    out << ";" << '\n';
    generate_isset_set(out, field, "");
    if (!bean_style_) {
      indent(out) << "return this;" << '\n';
    }

    indent_down();
    indent(out) << "}" << '\n' << '\n';

    // Unsetter
    if (is_deprecated) {
      indent(out) << "@Deprecated" << '\n';
    }
    indent(out) << "public void unset" << cap_name << "() {" << '\n';
    indent_up();
    if (type_can_be_null(type)) {
      indent(out) << "this." << make_valid_java_identifier(field_name) << " = null;" << '\n';
    } else if (issetType == ISSET_PRIMITIVE) {
      indent(out)
          << "__isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, "
          << isset_field_id(field) << ");" << '\n';
    } else {
      indent(out) << "__isset_bit_vector.clear(" << isset_field_id(field) << ");" << '\n';
    }
    indent_down();
    indent(out) << "}" << '\n' << '\n';

    // isSet method
    indent(out) << "/** Returns true if field " << field_name
                << " is set (has been assigned a value) and false otherwise */" << '\n';
    if (is_deprecated) {
      indent(out) << "@Deprecated" << '\n';
    }
    indent(out) << "public boolean is" << get_cap_name("set") << cap_name << "() {" << '\n';
    indent_up();
    if (type_can_be_null(type)) {
      indent(out) << "return this." << make_valid_java_identifier(field_name) << " != null;" << '\n';
    } else if (issetType == ISSET_PRIMITIVE) {
      indent(out) << "return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, "
                  << isset_field_id(field) << ");" << '\n';
    } else {
      indent(out) << "return __isset_bit_vector.get(" << isset_field_id(field) << ");" << '\n';
    }
    indent_down();
    indent(out) << "}" << '\n' << '\n';

    if (is_deprecated) {
      indent(out) << "@Deprecated" << '\n';
    }
    indent(out) << "public void set" << cap_name << get_cap_name("isSet") << "(boolean value) {"
                << '\n';
    indent_up();
    if (type_can_be_null(type)) {
      indent(out) << "if (!value) {" << '\n';
      indent(out) << "  this." << make_valid_java_identifier(field_name) << " = null;" << '\n';
      indent(out) << "}" << '\n';
    } else if (issetType == ISSET_PRIMITIVE) {
      indent(out) << "__isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, "
                  << isset_field_id(field) << ", value);" << '\n';
    } else {
      indent(out) << "__isset_bit_vector.set(" << isset_field_id(field) << ", value);" << '\n';
    }
    indent_down();
    indent(out) << "}" << '\n' << '\n';
  }
}