THRIFT-3956 Java keywords that are legal in IDL can lead to generated code that will not compile

This commit is contained in:
Jens Geyer 2022-11-16 18:25:02 +01:00 committed by Jens Geyer
parent e8353cb46e
commit 75e445ae8d

View File

@ -39,6 +39,7 @@ using std::map;
using std::ostream; using std::ostream;
using std::ostringstream; using std::ostringstream;
using std::setfill; using std::setfill;
using std::set;
using std::setw; using std::setw;
using std::string; using std::string;
using std::stringstream; using std::stringstream;
@ -294,6 +295,7 @@ public:
void generate_serialize_field(std::ostream& out, void generate_serialize_field(std::ostream& out,
t_field* tfield, t_field* tfield,
std::string prefix = "", std::string prefix = "",
std::string postfix = "",
bool has_metadata = true); bool has_metadata = true);
void generate_serialize_struct(std::ostream& out, t_struct* tstruct, std::string prefix = ""); void generate_serialize_struct(std::ostream& out, t_struct* tstruct, std::string prefix = "");
@ -368,6 +370,8 @@ public:
std::string make_valid_java_filename(std::string const& fromName); std::string make_valid_java_filename(std::string const& fromName);
std::string make_valid_java_identifier(std::string const& fromName); std::string make_valid_java_identifier(std::string const& fromName);
string normalize_name(string name);
bool type_can_be_null(t_type* ttype) { bool type_can_be_null(t_type* ttype) {
ttype = get_true_type(ttype); ttype = get_true_type(ttype);
@ -432,6 +436,18 @@ private:
ofstream_with_content_based_conditional_update f_service_; ofstream_with_content_based_conditional_update f_service_;
std::string package_dir_; std::string package_dir_;
// keywords (according to Oracle docs)
// true, false, and null might seem like keywords, but they are actually literals;
// you cannot use them as identifiers in your programs.
const std::string JAVA_KEYWORDS[53] = {
"abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue",
"default", "do", "double", "else", "enum", "extends", "final", "finally", "float", "for", "goto", "if",
"implements", "import", "instanceof", "int", "interface", "long", "native", "new", "package", "private",
"protected", "public", "return", "short", "static", "strictfp", "super", "switch", "synchronized", "this",
"throw", "throws", "transient", "try", "void", "volatile", "while", "true", "false", "null"
};
std::set<string> java_keywords = std::set<string>(JAVA_KEYWORDS, JAVA_KEYWORDS + sizeof(JAVA_KEYWORDS) / sizeof(JAVA_KEYWORDS[0]));
bool bean_style_; bool bean_style_;
bool android_style_; bool android_style_;
bool private_members_; bool private_members_;
@ -503,6 +519,21 @@ string t_java_generator::java_override_annotation() {
return "@Override"; return "@Override";
} }
string t_java_generator::normalize_name(string name)
{
string tmp(name);
//transform(tmp.begin(), tmp.end(), tmp.begin(), static_cast<int(*)(int)>(tolower));
// un-conflict keywords by prefixing with "$"
if (java_keywords.find(tmp) != java_keywords.end())
{
return "$" + name;
}
// no changes necessary
return name;
}
/** /**
* Nothing in Java * Nothing in Java
*/ */
@ -883,9 +914,9 @@ void t_java_generator::generate_java_union(t_struct* tstruct) {
if (is_deprecated) { if (is_deprecated) {
indent(f_struct) << "@Deprecated" << endl; indent(f_struct) << "@Deprecated" << endl;
} }
indent(f_struct) << "public " << (is_final ? "final " : "") << "class " << tstruct->get_name() indent(f_struct) << "public " << (is_final ? "final " : "") << "class " << make_valid_java_identifier(tstruct->get_name())
<< " extends org.apache.thrift.TUnion<" << tstruct->get_name() << ", " << " extends org.apache.thrift.TUnion<" << make_valid_java_identifier(tstruct->get_name()) << ", "
<< tstruct->get_name() << "._Fields> "; << make_valid_java_identifier(tstruct->get_name()) << "._Fields> ";
scope_up(f_struct); scope_up(f_struct);
@ -968,13 +999,14 @@ void t_java_generator::generate_union_constructor(ostream& out, t_struct* tstruc
indent(out) << " super(setField, value);" << endl; indent(out) << " super(setField, value);" << endl;
indent(out) << "}" << endl << endl; indent(out) << "}" << endl << endl;
indent(out) << "public " << type_name(tstruct) << "(" << type_name(tstruct) << " other) {" indent(out) << "public " << type_name(tstruct)
<< "(" << type_name(tstruct) << " other) {"
<< endl; << endl;
indent(out) << " super(other);" << endl; indent(out) << " super(other);" << endl;
indent(out) << "}" << endl; indent(out) << "}" << endl;
indent(out) << java_override_annotation() << endl; indent(out) << java_override_annotation() << endl;
indent(out) << "public " << tstruct->get_name() << " deepCopy() {" << endl; indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << " deepCopy() {" << endl;
indent(out) << " return new " << tstruct->get_name() << "(this);" << endl; indent(out) << " return new " << tstruct->get_name() << "(this);" << endl;
indent(out) << "}" << endl << endl; indent(out) << "}" << endl << endl;
@ -1280,7 +1312,7 @@ void t_java_generator::generate_standard_scheme_write_value(ostream& out, t_stru
indent_up(); indent_up();
indent(out) << type_name(field->get_type(), true, false) << " " << field->get_name() << " = (" indent(out) << type_name(field->get_type(), true, false) << " " << field->get_name() << " = ("
<< type_name(field->get_type(), true, false) << ")value_;" << endl; << type_name(field->get_type(), true, false) << ")value_;" << endl;
generate_serialize_field(out, field, ""); generate_serialize_field(out, field);
indent(out) << "return;" << endl; indent(out) << "return;" << endl;
indent_down(); indent_down();
} }
@ -1371,7 +1403,7 @@ void t_java_generator::generate_tuple_scheme_write_value(ostream& out, t_struct*
indent_up(); indent_up();
indent(out) << type_name(field->get_type(), true, false) << " " << field->get_name() << " = (" indent(out) << type_name(field->get_type(), true, false) << " " << field->get_name() << " = ("
<< type_name(field->get_type(), true, false) << ")value_;" << endl; << type_name(field->get_type(), true, false) << ")value_;" << endl;
generate_serialize_field(out, field, ""); generate_serialize_field(out, field);
indent(out) << "return;" << endl; indent(out) << "return;" << endl;
indent_down(); indent_down();
} }
@ -1430,8 +1462,8 @@ void t_java_generator::generate_get_struct_desc(ostream& out, t_struct* tstruct)
void t_java_generator::generate_union_comparisons(ostream& out, t_struct* tstruct) { void t_java_generator::generate_union_comparisons(ostream& out, t_struct* tstruct) {
// equality // equality
indent(out) << "public boolean equals(java.lang.Object other) {" << endl; indent(out) << "public boolean equals(java.lang.Object other) {" << endl;
indent(out) << " if (other instanceof " << tstruct->get_name() << ") {" << endl; indent(out) << " if (other instanceof " << make_valid_java_identifier(tstruct->get_name()) << ") {" << endl;
indent(out) << " return equals((" << tstruct->get_name() << ")other);" << endl; indent(out) << " return equals((" << make_valid_java_identifier(tstruct->get_name()) << ")other);" << endl;
indent(out) << " } else {" << endl; indent(out) << " } else {" << endl;
indent(out) << " return false;" << endl; indent(out) << " return false;" << endl;
indent(out) << " }" << endl; indent(out) << " }" << endl;
@ -1439,7 +1471,7 @@ void t_java_generator::generate_union_comparisons(ostream& out, t_struct* tstruc
out << endl; out << endl;
indent(out) << "public boolean equals(" << tstruct->get_name() << " other) {" << endl; indent(out) << "public boolean equals(" << make_valid_java_identifier(tstruct->get_name()) << " other) {" << endl;
indent(out) << " return other != null && getSetField() == other.getSetField() && " indent(out) << " return other != null && getSetField() == other.getSetField() && "
"getFieldValue().equals(other.getFieldValue());" "getFieldValue().equals(other.getFieldValue());"
<< endl; << endl;
@ -1512,13 +1544,14 @@ void t_java_generator::generate_java_struct_definition(ostream& out,
indent(out) << "@Deprecated" << endl; indent(out) << "@Deprecated" << endl;
} }
indent(out) << "public " << (is_final ? "final " : "") << (in_class ? "static " : "") << "class " indent(out) << "public " << (is_final ? "final " : "") << (in_class ? "static " : "") << "class "
<< tstruct->get_name() << " "; << make_valid_java_identifier(tstruct->get_name()) << " ";
if (is_exception) { if (is_exception) {
out << "extends org.apache.thrift.TException "; out << "extends org.apache.thrift.TException ";
} }
out << "implements org.apache.thrift.TBase<" << tstruct->get_name() << ", " << tstruct->get_name() out << "implements org.apache.thrift.TBase<" << make_valid_java_identifier(tstruct->get_name())
<< "._Fields>, java.io.Serializable, Cloneable, Comparable<" << tstruct->get_name() << ">"; << ", " << make_valid_java_identifier(tstruct->get_name())
<< "._Fields>, java.io.Serializable, Cloneable, Comparable<" << make_valid_java_identifier(tstruct->get_name()) << ">";
if (android_style_) { if (android_style_) {
out << ", android.os.Parcelable"; out << ", android.os.Parcelable";
@ -1610,7 +1643,7 @@ void t_java_generator::generate_java_struct_definition(ostream& out,
bool all_optional_members = true; bool all_optional_members = true;
// Default constructor // Default constructor
indent(out) << "public " << tstruct->get_name() << "() {" << endl; indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << "() {" << endl;
indent_up(); indent_up();
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
t_type* t = get_true_type((*m_iter)->get_type()); t_type* t = get_true_type((*m_iter)->get_type());
@ -1627,7 +1660,7 @@ void t_java_generator::generate_java_struct_definition(ostream& out,
if (!members.empty() && !all_optional_members) { if (!members.empty() && !all_optional_members) {
// Full constructor for all fields // Full constructor for all fields
indent(out) << "public " << tstruct->get_name() << "(" << endl; indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << "(" << endl;
indent_up(); indent_up();
bool first = true; bool first = true;
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
@ -1636,7 +1669,7 @@ void t_java_generator::generate_java_struct_definition(ostream& out,
out << "," << endl; out << "," << endl;
} }
first = false; first = false;
indent(out) << type_name((*m_iter)->get_type()) << " " << (*m_iter)->get_name(); indent(out) << type_name((*m_iter)->get_type()) << " " << make_valid_java_identifier((*m_iter)->get_name());
} }
} }
out << ")" << endl; out << ")" << endl;
@ -1649,15 +1682,18 @@ void t_java_generator::generate_java_struct_definition(ostream& out,
t_type* type = get_true_type((*m_iter)->get_type()); t_type* type = get_true_type((*m_iter)->get_type());
if (type->is_binary()) { if (type->is_binary()) {
if (unsafe_binaries_) { if (unsafe_binaries_) {
indent(out) << "this." << (*m_iter)->get_name() << " = " << (*m_iter)->get_name() << ";" indent(out) << "this." << make_valid_java_identifier((*m_iter)->get_name())
<< " = " << make_valid_java_identifier((*m_iter)->get_name()) << ";"
<< endl; << endl;
} else { } else {
indent(out) << "this." << (*m_iter)->get_name() indent(out) << "this." << make_valid_java_identifier((*m_iter)->get_name())
<< " = org.apache.thrift.TBaseHelper.copyBinary(" << (*m_iter)->get_name() << " = org.apache.thrift.TBaseHelper.copyBinary("
<< make_valid_java_identifier((*m_iter)->get_name())
<< ");" << endl; << ");" << endl;
} }
} else { } else {
indent(out) << "this." << (*m_iter)->get_name() << " = " << (*m_iter)->get_name() << ";" indent(out) << "this." << make_valid_java_identifier((*m_iter)->get_name()) << " = "
<< make_valid_java_identifier((*m_iter)->get_name()) << ";"
<< endl; << endl;
} }
generate_isset_set(out, (*m_iter), ""); generate_isset_set(out, (*m_iter), "");
@ -1672,7 +1708,8 @@ void t_java_generator::generate_java_struct_definition(ostream& out,
indent(out) << "/**" << endl; indent(out) << "/**" << endl;
indent(out) << " * Performs a deep copy on <i>other</i>." << endl; indent(out) << " * Performs a deep copy on <i>other</i>." << endl;
indent(out) << " */" << endl; indent(out) << " */" << endl;
indent(out) << "public " << tstruct->get_name() << "(" << tstruct->get_name() << " other) {" indent(out) << "public " << make_valid_java_identifier(tstruct->get_name())
<< "(" << make_valid_java_identifier(tstruct->get_name()) << " other) {"
<< endl; << endl;
indent_up(); indent_up();
@ -1701,10 +1738,10 @@ void t_java_generator::generate_java_struct_definition(ostream& out,
if (type->is_container()) { if (type->is_container()) {
generate_deep_copy_container(out, "other", field_name, "__this__" + field_name, type); generate_deep_copy_container(out, "other", field_name, "__this__" + field_name, type);
indent(out) << "this." << field_name << " = __this__" << field_name << ";" << endl; indent(out) << "this." << make_valid_java_identifier(field_name) << " = __this__" << field_name << ";" << endl;
} else { } else {
indent(out) << "this." << field_name << " = "; indent(out) << "this." << make_valid_java_identifier(field_name) << " = ";
generate_deep_copy_non_container(out, "other." + field_name, field_name, type); generate_deep_copy_non_container(out, "other." + make_valid_java_identifier(field_name), field_name, type);
out << ";" << endl; out << ";" << endl;
} }
@ -1719,8 +1756,8 @@ void t_java_generator::generate_java_struct_definition(ostream& out,
// clone method, so that you can deep copy an object when you don't know its class. // clone method, so that you can deep copy an object when you don't know its class.
indent(out) << java_override_annotation() << endl; indent(out) << java_override_annotation() << endl;
indent(out) << "public " << tstruct->get_name() << " deepCopy() {" << endl; indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << " deepCopy() {" << endl;
indent(out) << " return new " << tstruct->get_name() << "(this);" << endl; indent(out) << " return new " << make_valid_java_identifier(tstruct->get_name()) << "(this);" << endl;
indent(out) << "}" << endl << endl; indent(out) << "}" << endl << endl;
generate_java_struct_clear(out, tstruct); generate_java_struct_clear(out, tstruct);
@ -1989,13 +2026,13 @@ void t_java_generator::generate_java_struct_equality(ostream& out, t_struct* tst
out << indent() << java_override_annotation() << endl out << indent() << java_override_annotation() << endl
<< indent() << "public boolean equals(java.lang.Object that) {" << endl; << indent() << "public boolean equals(java.lang.Object that) {" << endl;
indent_up(); indent_up();
out << indent() << "if (that instanceof " << tstruct->get_name() << ")" << endl out << indent() << "if (that instanceof " << make_valid_java_identifier(tstruct->get_name()) << ")" << endl
<< indent() << " return this.equals((" << tstruct->get_name() << ")that);" << endl << indent() << " return this.equals((" << make_valid_java_identifier(tstruct->get_name()) << ")that);" << endl
<< indent() << "return false;" << endl; << indent() << "return false;" << endl;
scope_down(out); scope_down(out);
out << endl; out << endl;
out << indent() << "public boolean equals(" << tstruct->get_name() << " that) {" << endl; out << indent() << "public boolean equals(" << make_valid_java_identifier(tstruct->get_name()) << " that) {" << endl;
indent_up(); indent_up();
out << indent() << "if (that == null)" << endl out << indent() << "if (that == null)" << endl
<< indent() << " return false;" << endl << indent() << " return false;" << endl
@ -2033,11 +2070,11 @@ void t_java_generator::generate_java_struct_equality(ostream& out, t_struct* tst
<< indent() << " return false;" << endl; << indent() << " return false;" << endl;
if (t->is_binary()) { if (t->is_binary()) {
unequal = "!this." + name + ".equals(that." + name + ")"; unequal = "!this." + make_valid_java_identifier(name) + ".equals(that." + make_valid_java_identifier(name) + ")";
} else if (can_be_null) { } else if (can_be_null) {
unequal = "!this." + name + ".equals(that." + name + ")"; unequal = "!this." + make_valid_java_identifier(name) + ".equals(that." + make_valid_java_identifier(name) + ")";
} else { } else {
unequal = "this." + name + " != that." + name; unequal = "this." + make_valid_java_identifier(name) + " != that." + make_valid_java_identifier(name);
} }
out << indent() << "if (" << unequal << ")" << endl << indent() << " return false;" << endl; out << indent() << "if (" << unequal << ")" << endl << indent() << " return false;" << endl;
@ -2063,7 +2100,7 @@ void t_java_generator::generate_java_struct_equality(ostream& out, t_struct* tst
t_type* t = get_true_type((*m_iter)->get_type()); t_type* t = get_true_type((*m_iter)->get_type());
bool is_optional = (*m_iter)->get_req() == t_field::T_OPTIONAL; bool is_optional = (*m_iter)->get_req() == t_field::T_OPTIONAL;
bool can_be_null = type_can_be_null(t); bool can_be_null = type_can_be_null(t);
string name = (*m_iter)->get_name(); string name = make_valid_java_identifier((*m_iter)->get_name());
if (is_optional || can_be_null) { if (is_optional || can_be_null) {
indent(out) << "hashCode = hashCode * " << MUL << " + ((" << generate_isset_check(*m_iter) indent(out) << "hashCode = hashCode * " << MUL << " + ((" << generate_isset_check(*m_iter)
@ -2145,7 +2182,8 @@ void t_java_generator::generate_java_struct_compare_to(ostream& out, t_struct* t
indent(out) << "if (" << generate_isset_check(field) << ") {" << endl; indent(out) << "if (" << generate_isset_check(field) << ") {" << endl;
indent(out) << " lastComparison = org.apache.thrift.TBaseHelper.compareTo(this." indent(out) << " lastComparison = org.apache.thrift.TBaseHelper.compareTo(this."
<< field->get_name() << ", other." << field->get_name() << ");" << endl; << make_valid_java_identifier(field->get_name())
<< ", other." << make_valid_java_identifier(field->get_name()) << ");" << endl;
indent(out) << " if (lastComparison != 0) {" << endl; indent(out) << " if (lastComparison != 0) {" << endl;
indent(out) << " return lastComparison;" << endl; indent(out) << " return lastComparison;" << endl;
indent(out) << " }" << endl; indent(out) << " }" << endl;
@ -2213,8 +2251,8 @@ void t_java_generator::generate_java_validator(ostream& out, t_struct* tstruct)
for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
t_type* type = get_true_type((*f_iter)->get_type()); t_type* type = get_true_type((*f_iter)->get_type());
if (type->is_struct() && !((t_struct*)type)->is_union()) { if (type->is_struct() && !((t_struct*)type)->is_union()) {
out << indent() << "if (" << (*f_iter)->get_name() << " != null) {" << endl; out << indent() << "if (" << make_valid_java_identifier((*f_iter)->get_name()) << " != null) {" << endl;
out << indent() << " " << (*f_iter)->get_name() << ".validate();" << endl; out << indent() << " " << make_valid_java_identifier((*f_iter)->get_name()) << ".validate();" << endl;
out << indent() << "}" << endl; out << indent() << "}" << endl;
} }
} }
@ -2650,7 +2688,7 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts
} }
out << cap_name << "() {" << endl; out << cap_name << "() {" << endl;
indent_up(); indent_up();
indent(out) << "return this." << field_name << ";" << endl; indent(out) << "return this." << make_valid_java_identifier(field_name) << ";" << endl;
indent_down(); indent_down();
indent(out) << "}" << endl << endl; indent(out) << "}" << endl << endl;
} }
@ -2668,14 +2706,14 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts
} else { } else {
out << type_name(tstruct); out << type_name(tstruct);
} }
out << " set" << cap_name << "(byte[] " << field_name << ") {" << endl; out << " set" << cap_name << "(byte[] " << make_valid_java_identifier(field_name) << ") {" << endl;
indent(out) << " this." << field_name << " = " << field_name indent(out) << " this." << make_valid_java_identifier(field_name) << " = " << make_valid_java_identifier(field_name)
<< " == null ? (java.nio.ByteBuffer)null"; << " == null ? (java.nio.ByteBuffer)null";
if (unsafe_binaries_) { if (unsafe_binaries_) {
indent(out) << " : java.nio.ByteBuffer.wrap(" << field_name << ");" << endl; indent(out) << " : java.nio.ByteBuffer.wrap(" << make_valid_java_identifier(field_name) << ");" << endl;
} else { } else {
indent(out) << " : java.nio.ByteBuffer.wrap(" << field_name << ".clone());" << endl; indent(out) << " : java.nio.ByteBuffer.wrap(" << make_valid_java_identifier(field_name) << ".clone());" << endl;
} }
if (!bean_style_) { if (!bean_style_) {
@ -2693,14 +2731,15 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts
out << type_name(tstruct); out << type_name(tstruct);
} }
out << " set" << cap_name << "(" out << " set" << cap_name << "("
<< (type_can_be_null(type) ? (java_nullable_annotation() + " ") : "") << type_name(type) << (type_can_be_null(type) ? (java_nullable_annotation() + " ") : "")
<< " " << field_name << ") {" << endl; << type_name(type)
<< " " << make_valid_java_identifier(field_name) << ") {" << endl;
indent_up(); indent_up();
indent(out) << "this." << field_name << " = "; indent(out) << "this." << make_valid_java_identifier(field_name) << " = ";
if (type->is_binary() && !unsafe_binaries_) { if (type->is_binary() && !unsafe_binaries_) {
out << "org.apache.thrift.TBaseHelper.copyBinary(" << field_name << ")"; out << "org.apache.thrift.TBaseHelper.copyBinary(" << make_valid_java_identifier(field_name) << ")";
} else { } else {
out << field_name; out << make_valid_java_identifier(field_name);
} }
out << ";" << endl; out << ";" << endl;
generate_isset_set(out, field, ""); generate_isset_set(out, field, "");
@ -2718,7 +2757,7 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts
indent(out) << "public void unset" << cap_name << "() {" << endl; indent(out) << "public void unset" << cap_name << "() {" << endl;
indent_up(); indent_up();
if (type_can_be_null(type)) { if (type_can_be_null(type)) {
indent(out) << "this." << field_name << " = null;" << endl; indent(out) << "this." << make_valid_java_identifier(field_name) << " = null;" << endl;
} else if (issetType == ISSET_PRIMITIVE) { } else if (issetType == ISSET_PRIMITIVE) {
indent(out) indent(out)
<< "__isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, " << "__isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, "
@ -2738,7 +2777,7 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts
indent(out) << "public boolean is" << get_cap_name("set") << cap_name << "() {" << endl; indent(out) << "public boolean is" << get_cap_name("set") << cap_name << "() {" << endl;
indent_up(); indent_up();
if (type_can_be_null(type)) { if (type_can_be_null(type)) {
indent(out) << "return this." << field_name << " != null;" << endl; indent(out) << "return this." << make_valid_java_identifier(field_name) << " != null;" << endl;
} else if (issetType == ISSET_PRIMITIVE) { } else if (issetType == ISSET_PRIMITIVE) {
indent(out) << "return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, " indent(out) << "return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, "
<< isset_field_id(field) << ");" << endl; << isset_field_id(field) << ");" << endl;
@ -2756,7 +2795,7 @@ void t_java_generator::generate_java_bean_boilerplate(ostream& out, t_struct* ts
indent_up(); indent_up();
if (type_can_be_null(type)) { if (type_can_be_null(type)) {
indent(out) << "if (!value) {" << endl; indent(out) << "if (!value) {" << endl;
indent(out) << " this." << field_name << " = null;" << endl; indent(out) << " this." << make_valid_java_identifier(field_name) << " = null;" << endl;
indent(out) << "}" << endl; indent(out) << "}" << endl;
} else if (issetType == ISSET_PRIMITIVE) { } else if (issetType == ISSET_PRIMITIVE) {
indent(out) << "__isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, " indent(out) << "__isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, "
@ -2801,25 +2840,25 @@ void t_java_generator::generate_java_struct_tostring(ostream& out, t_struct* tst
indent(out) << "sb.append(\"" << (*f_iter)->get_name() << ":\");" << endl; indent(out) << "sb.append(\"" << (*f_iter)->get_name() << ":\");" << endl;
bool can_be_null = type_can_be_null(field->get_type()); bool can_be_null = type_can_be_null(field->get_type());
if (can_be_null) { if (can_be_null) {
indent(out) << "if (this." << (*f_iter)->get_name() << " == null) {" << endl; indent(out) << "if (this." << make_valid_java_identifier((*f_iter)->get_name()) << " == null) {" << endl;
indent(out) << " sb.append(\"null\");" << endl; indent(out) << " sb.append(\"null\");" << endl;
indent(out) << "} else {" << endl; indent(out) << "} else {" << endl;
indent_up(); indent_up();
} }
if (get_true_type(field->get_type())->is_binary()) { if (get_true_type(field->get_type())->is_binary()) {
indent(out) << "org.apache.thrift.TBaseHelper.toString(this." << field->get_name() << ", sb);" indent(out) << "org.apache.thrift.TBaseHelper.toString(this." << make_valid_java_identifier(field->get_name()) << ", sb);"
<< endl; << endl;
} else if ((field->get_type()->is_set()) } else if ((field->get_type()->is_set())
&& (get_true_type(((t_set*)field->get_type())->get_elem_type())->is_binary())) { && (get_true_type(((t_set*)field->get_type())->get_elem_type())->is_binary())) {
indent(out) << "org.apache.thrift.TBaseHelper.toString(this." << field->get_name() << ", sb);" indent(out) << "org.apache.thrift.TBaseHelper.toString(this." << make_valid_java_identifier(field->get_name()) << ", sb);"
<< endl; << endl;
} else if ((field->get_type()->is_list()) } else if ((field->get_type()->is_list())
&& (get_true_type(((t_list*)field->get_type())->get_elem_type())->is_binary())) { && (get_true_type(((t_list*)field->get_type())->get_elem_type())->is_binary())) {
indent(out) << "org.apache.thrift.TBaseHelper.toString(this." << field->get_name() << ", sb);" indent(out) << "org.apache.thrift.TBaseHelper.toString(this." << make_valid_java_identifier(field->get_name()) << ", sb);"
<< endl; << endl;
} else { } else {
indent(out) << "sb.append(this." << (*f_iter)->get_name() << ");" << endl; indent(out) << "sb.append(this." << make_valid_java_identifier((*f_iter)->get_name()) << ");" << endl;
} }
if (can_be_null) { if (can_be_null) {
@ -3050,7 +3089,7 @@ void t_java_generator::generate_service(t_service* tservice) {
generate_javax_generated_annotation(f_service_); generate_javax_generated_annotation(f_service_);
} }
f_service_ << java_suppressions(); f_service_ << java_suppressions();
f_service_ << "public class " << service_name_ << " {" << endl << endl; f_service_ << "public class " << make_valid_java_identifier(service_name_) << " {" << endl << endl;
indent_up(); indent_up();
// Generate the three main parts of the service // Generate the three main parts of the service
@ -3104,7 +3143,7 @@ void t_java_generator::generate_service_async_interface(t_service* tservice) {
string extends_iface = ""; string extends_iface = "";
if (tservice->get_extends() != nullptr) { if (tservice->get_extends() != nullptr) {
extends = type_name(tservice->get_extends()); extends = type_name(tservice->get_extends());
extends_iface = " extends " + extends + " .AsyncIface"; extends_iface = " extends " + extends + ".AsyncIface";
} }
f_service_ << indent() << "public interface AsyncIface" << extends_iface << " {" << endl << endl; f_service_ << indent() << "public interface AsyncIface" << extends_iface << " {" << endl << endl;
@ -3239,7 +3278,7 @@ void t_java_generator::generate_service_client(t_service* tservice) {
} else { } else {
f_service_ << ", "; f_service_ << ", ";
} }
f_service_ << (*fld_iter)->get_name(); f_service_ << make_valid_java_identifier((*fld_iter)->get_name());
} }
f_service_ << ");" << endl; f_service_ << ");" << endl;
@ -3267,7 +3306,7 @@ void t_java_generator::generate_service_client(t_service* tservice) {
for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
indent(f_service_) << "args.set" << get_cap_name((*fld_iter)->get_name()) << "(" indent(f_service_) << "args.set" << get_cap_name((*fld_iter)->get_name()) << "("
<< (*fld_iter)->get_name() << ");" << endl; << make_valid_java_identifier((*fld_iter)->get_name()) << ");" << endl;
} }
const string sendBaseName = (*f_iter)->is_oneway() ? "sendBaseOneway" : "sendBase"; const string sendBaseName = (*f_iter)->is_oneway() ? "sendBaseOneway" : "sendBase";
@ -3300,8 +3339,8 @@ void t_java_generator::generate_service_client(t_service* tservice) {
const std::vector<t_field*>& xceptions = xs->get_members(); const std::vector<t_field*>& xceptions = xs->get_members();
vector<t_field*>::const_iterator x_iter; vector<t_field*>::const_iterator x_iter;
for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
f_service_ << indent() << "if (result." << (*x_iter)->get_name() << " != null) {" << endl f_service_ << indent() << "if (result." << make_valid_java_identifier((*x_iter)->get_name()) << " != null) {" << endl
<< indent() << " throw result." << (*x_iter)->get_name() << ";" << endl << indent() << " throw result." << make_valid_java_identifier((*x_iter)->get_name()) << ";" << endl
<< indent() << "}" << endl; << indent() << "}" << endl;
} }
@ -3458,7 +3497,7 @@ void t_java_generator::generate_service_async_client(t_service* tservice) {
// Member variables // Member variables
for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
indent(f_service_) << "private " + type_name((*fld_iter)->get_type()) + " " indent(f_service_) << "private " + type_name((*fld_iter)->get_type()) + " "
+ (*fld_iter)->get_name() + ";" + make_valid_java_identifier((*fld_iter)->get_name()) + ";"
<< endl; << endl;
} }
@ -3478,7 +3517,7 @@ void t_java_generator::generate_service_async_client(t_service* tservice) {
// Assign member variables // Assign member variables
for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
indent(f_service_) << " this." + (*fld_iter)->get_name() + " = " + (*fld_iter)->get_name() indent(f_service_) << " this." + make_valid_java_identifier((*fld_iter)->get_name()) + " = " + make_valid_java_identifier((*fld_iter)->get_name())
+ ";" + ";"
<< endl; << endl;
} }
@ -3500,7 +3539,7 @@ void t_java_generator::generate_service_async_client(t_service* tservice) {
for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) { for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
f_service_ << indent() << "args.set" << get_cap_name((*fld_iter)->get_name()) << "(" f_service_ << indent() << "args.set" << get_cap_name((*fld_iter)->get_name()) << "("
<< (*fld_iter)->get_name() << ");" << endl; << make_valid_java_identifier((*fld_iter)->get_name()) << ");" << endl;
} }
f_service_ << indent() << "args.write(prot);" << endl f_service_ << indent() << "args.write(prot);" << endl
@ -3611,7 +3650,7 @@ void t_java_generator::generate_service_server(t_service* tservice) {
indent_up(); indent_up();
for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
indent(f_service_) << "processMap.put(\"" << (*f_iter)->get_name() << "\", new " indent(f_service_) << "processMap.put(\"" << (*f_iter)->get_name() << "\", new "
<< (*f_iter)->get_name() << "());" << endl; << make_valid_java_identifier((*f_iter)->get_name()) << "());" << endl;
} }
indent(f_service_) << "return processMap;" << endl; indent(f_service_) << "return processMap;" << endl;
indent_down(); indent_down();
@ -3679,7 +3718,7 @@ void t_java_generator::generate_service_async_server(t_service* tservice) {
indent_up(); indent_up();
for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
indent(f_service_) << "processMap.put(\"" << (*f_iter)->get_name() << "\", new " indent(f_service_) << "processMap.put(\"" << (*f_iter)->get_name() << "\", new "
<< (*f_iter)->get_name() << "());" << endl; << make_valid_java_identifier((*f_iter)->get_name()) << "());" << endl;
} }
indent(f_service_) << "return processMap;" << endl; indent(f_service_) << "return processMap;" << endl;
indent_down(); indent_down();
@ -3737,12 +3776,12 @@ void t_java_generator::generate_process_async_function(t_service* tservice, t_fu
(void)tservice; (void)tservice;
// Open class // Open class
indent(f_service_) << "public static class " << tfunction->get_name() indent(f_service_) << "public static class " << make_valid_java_identifier(tfunction->get_name())
<< "<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, " << "<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, "
<< argsname << ", " << resulttype << "> {" << endl; << argsname << ", " << resulttype << "> {" << endl;
indent_up(); indent_up();
indent(f_service_) << "public " << tfunction->get_name() << "() {" << endl; indent(f_service_) << "public " << make_valid_java_identifier(tfunction->get_name()) << "() {" << endl;
indent(f_service_) << " super(\"" << tfunction->get_name() << "\");" << endl; indent(f_service_) << " super(\"" << tfunction->get_name() << "\");" << endl;
indent(f_service_) << "}" << endl << endl; indent(f_service_) << "}" << endl << endl;
@ -3837,7 +3876,7 @@ void t_java_generator::generate_process_async_function(t_service* tservice, t_fu
string name = (*x_iter)->get_name(); string name = (*x_iter)->get_name();
f_service_ << "if (e instanceof " << type << ") {" << endl; f_service_ << "if (e instanceof " << type << ") {" << endl;
indent_up(); indent_up();
f_service_ << indent() << "result." << name << " = (" << type << ") e;" << endl f_service_ << indent() << "result." << make_valid_java_identifier(name) << " = (" << type << ") e;" << endl
<< indent() << "result.set" << get_cap_name(name) << get_cap_name("isSet") << indent() << "result.set" << get_cap_name(name) << get_cap_name("isSet")
<< "(true);" << endl << "(true);" << endl
<< indent() << "msg = result;" << endl; << indent() << "msg = result;" << endl;
@ -3911,7 +3950,7 @@ void t_java_generator::generate_process_async_function(t_service* tservice, t_fu
} else { } else {
f_service_ << ", "; f_service_ << ", ";
} }
f_service_ << "args." << (*f_iter)->get_name(); f_service_ << "args." << make_valid_java_identifier((*f_iter)->get_name());
} }
if (!first) if (!first)
f_service_ << ","; f_service_ << ",";
@ -3943,12 +3982,12 @@ void t_java_generator::generate_process_function(t_service* tservice, t_function
(void)tservice; (void)tservice;
// Open class // Open class
indent(f_service_) << "public static class " << tfunction->get_name() indent(f_service_) << "public static class " << make_valid_java_identifier(tfunction->get_name())
<< "<I extends Iface> extends org.apache.thrift.ProcessFunction<I, " << "<I extends Iface> extends org.apache.thrift.ProcessFunction<I, "
<< argsname << "> {" << endl; << argsname << "> {" << endl;
indent_up(); indent_up();
indent(f_service_) << "public " << tfunction->get_name() << "() {" << endl; indent(f_service_) << "public " << make_valid_java_identifier(tfunction->get_name()) << "() {" << endl;
indent(f_service_) << " super(\"" << tfunction->get_name() << "\");" << endl; indent(f_service_) << " super(\"" << tfunction->get_name() << "\");" << endl;
indent(f_service_) << "}" << endl << endl; indent(f_service_) << "}" << endl << endl;
@ -4003,7 +4042,7 @@ void t_java_generator::generate_process_function(t_service* tservice, t_function
} else { } else {
f_service_ << ", "; f_service_ << ", ";
} }
f_service_ << "args." << (*f_iter)->get_name(); f_service_ << "args." << make_valid_java_identifier((*f_iter)->get_name());
} }
f_service_ << ");" << endl; f_service_ << ");" << endl;
@ -4019,11 +4058,11 @@ void t_java_generator::generate_process_function(t_service* tservice, t_function
f_service_ << indent() << "}"; f_service_ << indent() << "}";
for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) { for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
f_service_ << " catch (" << type_name((*x_iter)->get_type(), false, false) << " " f_service_ << " catch (" << type_name((*x_iter)->get_type(), false, false) << " "
<< (*x_iter)->get_name() << ") {" << endl; << make_valid_java_identifier((*x_iter)->get_name()) << ") {" << endl;
if (!tfunction->is_oneway()) { if (!tfunction->is_oneway()) {
indent_up(); indent_up();
f_service_ << indent() << "result." << (*x_iter)->get_name() << " = " f_service_ << indent() << "result." << make_valid_java_identifier((*x_iter)->get_name()) << " = "
<< (*x_iter)->get_name() << ";" << endl; << make_valid_java_identifier((*x_iter)->get_name()) << ";" << endl;
indent_down(); indent_down();
f_service_ << indent() << "}"; f_service_ << indent() << "}";
} else { } else {
@ -4065,7 +4104,7 @@ void t_java_generator::generate_deserialize_field(ostream& out,
throw "CANNOT GENERATE DESERIALIZE CODE FOR void TYPE: " + prefix + tfield->get_name(); throw "CANNOT GENERATE DESERIALIZE CODE FOR void TYPE: " + prefix + tfield->get_name();
} }
string name = prefix + tfield->get_name(); string name = prefix + make_valid_java_identifier(tfield->get_name());
if (type->is_struct() || type->is_xception()) { if (type->is_struct() || type->is_xception()) {
generate_deserialize_struct(out, (t_struct*)type, name); generate_deserialize_struct(out, (t_struct*)type, name);
@ -4367,23 +4406,23 @@ void t_java_generator::generate_deserialize_list_element(ostream& out,
*/ */
void t_java_generator::generate_serialize_field(ostream& out, void t_java_generator::generate_serialize_field(ostream& out,
t_field* tfield, t_field* tfield,
string prefix, string prefix, string postfix,
bool has_metadata) { bool has_metadata) {
t_type* type = get_true_type(tfield->get_type()); t_type* type = get_true_type(tfield->get_type());
// Do nothing for void types // Do nothing for void types
if (type->is_void()) { if (type->is_void()) {
throw "CANNOT GENERATE SERIALIZE CODE FOR void TYPE: " + prefix + tfield->get_name(); throw "CANNOT GENERATE SERIALIZE CODE FOR void TYPE: " + prefix + tfield->get_name() + postfix;
} }
if (type->is_struct() || type->is_xception()) { if (type->is_struct() || type->is_xception()) {
generate_serialize_struct(out, (t_struct*)type, prefix + tfield->get_name()); generate_serialize_struct(out, (t_struct*)type, prefix + make_valid_java_identifier(tfield->get_name()) + postfix);
} else if (type->is_container()) { } else if (type->is_container()) {
generate_serialize_container(out, type, prefix + tfield->get_name(), has_metadata); generate_serialize_container(out, type, prefix + make_valid_java_identifier(tfield->get_name()) + postfix, has_metadata);
} else if (type->is_enum()) { } else if (type->is_enum()) {
indent(out) << "oprot.writeI32(" << prefix + tfield->get_name() << ".getValue());" << endl; indent(out) << "oprot.writeI32(" << prefix + make_valid_java_identifier(tfield->get_name()) + postfix << ".getValue());" << endl;
} else if (type->is_base_type()) { } else if (type->is_base_type()) {
string name = prefix + tfield->get_name(); string name = prefix + make_valid_java_identifier(tfield->get_name()) + postfix;
indent(out) << "oprot."; indent(out) << "oprot.";
if (type->is_base_type()) { if (type->is_base_type()) {
@ -4428,8 +4467,8 @@ void t_java_generator::generate_serialize_field(ostream& out,
} }
out << endl; out << endl;
} else { } else {
printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n", prefix.c_str(), printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s%s' TYPE '%s'\n", prefix.c_str(),
tfield->get_name().c_str(), type_name(type).c_str()); tfield->get_name().c_str(), postfix.c_str(), type_name(type).c_str());
} }
} }
@ -4522,10 +4561,10 @@ void t_java_generator::generate_serialize_map_element(ostream& out,
string map, string map,
bool has_metadata) { bool has_metadata) {
(void)map; (void)map;
t_field kfield(tmap->get_key_type(), iter + ".getKey()"); t_field kfield(tmap->get_key_type(), iter);
generate_serialize_field(out, &kfield, "", has_metadata); generate_serialize_field(out, &kfield, "", ".getKey()", has_metadata);
t_field vfield(tmap->get_val_type(), iter + ".getValue()"); t_field vfield(tmap->get_val_type(), iter);
generate_serialize_field(out, &vfield, "", has_metadata); generate_serialize_field(out, &vfield, "", ".getValue()", has_metadata);
} }
/** /**
@ -4536,7 +4575,7 @@ void t_java_generator::generate_serialize_set_element(ostream& out,
string iter, string iter,
bool has_metadata) { bool has_metadata) {
t_field efield(tset->get_elem_type(), iter); t_field efield(tset->get_elem_type(), iter);
generate_serialize_field(out, &efield, "", has_metadata); generate_serialize_field(out, &efield, "", "", has_metadata);
} }
/** /**
@ -4547,7 +4586,7 @@ void t_java_generator::generate_serialize_list_element(ostream& out,
string iter, string iter,
bool has_metadata) { bool has_metadata) {
t_field efield(tlist->get_elem_type(), iter); t_field efield(tlist->get_elem_type(), iter);
generate_serialize_field(out, &efield, "", has_metadata); generate_serialize_field(out, &efield, "", "", has_metadata);
} }
/** /**
@ -4614,11 +4653,11 @@ string t_java_generator::type_name(t_type* ttype,
if ((program != nullptr) && ((program != program_) || force_namespace)) { if ((program != nullptr) && ((program != program_) || force_namespace)) {
string package = program->get_namespace("java"); string package = program->get_namespace("java");
if (!package.empty()) { if (!package.empty()) {
return package + "." + ttype->get_name(); return package + "." + make_valid_java_identifier(ttype->get_name());
} }
} }
return ttype->get_name(); return make_valid_java_identifier(ttype->get_name());
} }
/** /**
@ -4671,7 +4710,7 @@ string t_java_generator::declare_field(t_field* tfield, bool init, bool comment)
if (type_can_be_null(ttype)) { if (type_can_be_null(ttype)) {
result += java_nullable_annotation() + " "; result += java_nullable_annotation() + " ";
} }
result += type_name(tfield->get_type()) + " " + tfield->get_name(); result += type_name(tfield->get_type()) + " " + make_valid_java_identifier(tfield->get_name());
if (init) { if (init) {
if (ttype->is_base_type() && tfield->get_value() != nullptr) { if (ttype->is_base_type() && tfield->get_value() != nullptr) {
std::ofstream dummy; std::ofstream dummy;
@ -4814,7 +4853,7 @@ string t_java_generator::argument_list(t_struct* tstruct, bool include_types) {
if (include_types) { if (include_types) {
result += type_name((*f_iter)->get_type()) + " "; result += type_name((*f_iter)->get_type()) + " ";
} }
result += (*f_iter)->get_name(); result += make_valid_java_identifier((*f_iter)->get_name());
} }
return result; return result;
} }
@ -4838,7 +4877,7 @@ string t_java_generator::async_argument_list(t_function* tfunct,
if (include_types) { if (include_types) {
result += type_name((*f_iter)->get_type()) + " "; result += type_name((*f_iter)->get_type()) + " ";
} }
result += (*f_iter)->get_name(); result += make_valid_java_identifier((*f_iter)->get_name());
} }
if (!first) { if (!first) {
result += ", "; result += ", ";
@ -4937,7 +4976,7 @@ std::string t_java_generator::make_valid_java_identifier(std::string const& from
} }
} }
return str; return normalize_name(str);
} }
std::string t_java_generator::as_camel_case(std::string name, bool ucfirst) { std::string t_java_generator::as_camel_case(std::string name, bool ucfirst) {
@ -4967,9 +5006,9 @@ std::string t_java_generator::as_camel_case(std::string name, bool ucfirst) {
std::string t_java_generator::get_rpc_method_name(std::string name) { std::string t_java_generator::get_rpc_method_name(std::string name) {
if (fullcamel_style_) { if (fullcamel_style_) {
return as_camel_case(name, false); return make_valid_java_identifier(as_camel_case(name, false));
} else { } else {
return name; return make_valid_java_identifier(name);
} }
} }
@ -5354,19 +5393,19 @@ void t_java_generator::generate_java_struct_clear(std::ostream& out, t_struct* t
t_type* t = get_true_type(field->get_type()); t_type* t = get_true_type(field->get_type());
if (field->get_value() != nullptr) { if (field->get_value() != nullptr) {
print_const_value(out, "this." + field->get_name(), t, field->get_value(), true, true); print_const_value(out, "this." + make_valid_java_identifier(field->get_name()), t, field->get_value(), true, true);
continue; continue;
} }
if (type_can_be_null(t)) { if (type_can_be_null(t)) {
if (reuse_objects_ && (t->is_container() || t->is_struct())) { if (reuse_objects_ && (t->is_container() || t->is_struct())) {
indent(out) << "if (this." << field->get_name() << " != null) {" << endl; indent(out) << "if (this." << make_valid_java_identifier(field->get_name()) << " != null) {" << endl;
indent_up(); indent_up();
indent(out) << "this." << field->get_name() << ".clear();" << endl; indent(out) << "this." << make_valid_java_identifier(field->get_name()) << ".clear();" << endl;
indent_down(); indent_down();
indent(out) << "}" << endl; indent(out) << "}" << endl;
} else { } else {
indent(out) << "this." << field->get_name() << " = null;" << endl; indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = null;" << endl;
} }
continue; continue;
} }
@ -5382,13 +5421,13 @@ void t_java_generator::generate_java_struct_clear(std::ostream& out, t_struct* t
case t_base_type::TYPE_I16: case t_base_type::TYPE_I16:
case t_base_type::TYPE_I32: case t_base_type::TYPE_I32:
case t_base_type::TYPE_I64: case t_base_type::TYPE_I64:
indent(out) << "this." << field->get_name() << " = 0;" << endl; indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = 0;" << endl;
break; break;
case t_base_type::TYPE_DOUBLE: case t_base_type::TYPE_DOUBLE:
indent(out) << "this." << field->get_name() << " = 0.0;" << endl; indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = 0.0;" << endl;
break; break;
case t_base_type::TYPE_BOOL: case t_base_type::TYPE_BOOL:
indent(out) << "this." << field->get_name() << " = false;" << endl; indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = false;" << endl;
break; break;
default: default:
throw "unsupported type: " + base_type->get_name() + " for field " + field->get_name(); throw "unsupported type: " + base_type->get_name() + " for field " + field->get_name();
@ -5453,7 +5492,7 @@ void t_java_generator::generate_java_struct_read_object(ostream& out, t_struct*
void t_java_generator::generate_standard_reader(ostream& out, t_struct* tstruct) { void t_java_generator::generate_standard_reader(ostream& out, t_struct* tstruct) {
indent(out) << java_override_annotation() << endl; indent(out) << java_override_annotation() << endl;
indent(out) << "public void read(org.apache.thrift.protocol.TProtocol iprot, " indent(out) << "public void read(org.apache.thrift.protocol.TProtocol iprot, "
<< tstruct->get_name() << " struct) throws org.apache.thrift.TException {" << endl; << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << endl;
indent_up(); indent_up();
const vector<t_field*>& fields = tstruct->get_members(); const vector<t_field*>& fields = tstruct->get_members();
@ -5550,7 +5589,7 @@ void t_java_generator::generate_standard_writer(ostream& out, t_struct* tstruct,
indent_up(); indent_up();
indent(out) << java_override_annotation() << endl; indent(out) << java_override_annotation() << endl;
indent(out) << "public void write(org.apache.thrift.protocol.TProtocol oprot, " indent(out) << "public void write(org.apache.thrift.protocol.TProtocol oprot, "
<< tstruct->get_name() << " struct) throws org.apache.thrift.TException {" << endl; << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << endl;
indent_up(); indent_up();
const vector<t_field*>& fields = tstruct->get_sorted_members(); const vector<t_field*>& fields = tstruct->get_sorted_members();
vector<t_field*>::const_iterator f_iter; vector<t_field*>::const_iterator f_iter;
@ -5563,7 +5602,7 @@ void t_java_generator::generate_standard_writer(ostream& out, t_struct* tstruct,
for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
bool null_allowed = type_can_be_null((*f_iter)->get_type()); bool null_allowed = type_can_be_null((*f_iter)->get_type());
if (null_allowed) { if (null_allowed) {
out << indent() << "if (struct." << (*f_iter)->get_name() << " != null) {" << endl; out << indent() << "if (struct." << make_valid_java_identifier((*f_iter)->get_name()) << " != null) {" << endl;
indent_up(); indent_up();
} }
bool optional = ((*f_iter)->get_req() == t_field::T_OPTIONAL) || (is_result && !null_allowed); bool optional = ((*f_iter)->get_req() == t_field::T_OPTIONAL) || (is_result && !null_allowed);
@ -5577,7 +5616,7 @@ void t_java_generator::generate_standard_writer(ostream& out, t_struct* tstruct,
<< "_FIELD_DESC);" << endl; << "_FIELD_DESC);" << endl;
// Write field contents // Write field contents
generate_serialize_field(out, *f_iter, "struct.", true); generate_serialize_field(out, *f_iter, "struct.", "", true);
// Write field closer // Write field closer
indent(out) << "oprot.writeFieldEnd();" << endl; indent(out) << "oprot.writeFieldEnd();" << endl;
@ -5617,7 +5656,7 @@ void t_java_generator::generate_java_struct_standard_scheme(ostream& out,
indent(out) << "}" << endl << endl; indent(out) << "}" << endl << endl;
out << indent() << "private static class " << tstruct->get_name() out << indent() << "private static class " << tstruct->get_name()
<< "StandardScheme extends org.apache.thrift.scheme.StandardScheme<" << tstruct->get_name() << "StandardScheme extends org.apache.thrift.scheme.StandardScheme<" << make_valid_java_identifier(tstruct->get_name())
<< "> {" << endl << "> {" << endl
<< endl; << endl;
indent_up(); indent_up();
@ -5632,7 +5671,7 @@ void t_java_generator::generate_java_struct_standard_scheme(ostream& out,
void t_java_generator::generate_java_struct_tuple_reader(ostream& out, t_struct* tstruct) { void t_java_generator::generate_java_struct_tuple_reader(ostream& out, t_struct* tstruct) {
indent(out) << java_override_annotation() << endl; indent(out) << java_override_annotation() << endl;
indent(out) << "public void read(org.apache.thrift.protocol.TProtocol prot, " indent(out) << "public void read(org.apache.thrift.protocol.TProtocol prot, "
<< tstruct->get_name() << " struct) throws org.apache.thrift.TException {" << endl; << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << endl;
indent_up(); indent_up();
indent(out) << "org.apache.thrift.protocol.TTupleProtocol iprot = " indent(out) << "org.apache.thrift.protocol.TTupleProtocol iprot = "
"(org.apache.thrift.protocol.TTupleProtocol) prot;" "(org.apache.thrift.protocol.TTupleProtocol) prot;"
@ -5676,7 +5715,7 @@ void t_java_generator::generate_java_struct_tuple_reader(ostream& out, t_struct*
void t_java_generator::generate_java_struct_tuple_writer(ostream& out, t_struct* tstruct) { void t_java_generator::generate_java_struct_tuple_writer(ostream& out, t_struct* tstruct) {
indent(out) << java_override_annotation() << endl; indent(out) << java_override_annotation() << endl;
indent(out) << "public void write(org.apache.thrift.protocol.TProtocol prot, " indent(out) << "public void write(org.apache.thrift.protocol.TProtocol prot, "
<< tstruct->get_name() << " struct) throws org.apache.thrift.TException {" << endl; << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << endl;
indent_up(); indent_up();
indent(out) << "org.apache.thrift.protocol.TTupleProtocol oprot = " indent(out) << "org.apache.thrift.protocol.TTupleProtocol oprot = "
"(org.apache.thrift.protocol.TTupleProtocol) prot;" "(org.apache.thrift.protocol.TTupleProtocol) prot;"
@ -5693,7 +5732,7 @@ void t_java_generator::generate_java_struct_tuple_writer(ostream& out, t_struct*
has_optional = true; has_optional = true;
} }
if ((*f_iter)->get_req() == t_field::T_REQUIRED) { if ((*f_iter)->get_req() == t_field::T_REQUIRED) {
generate_serialize_field(out, (*f_iter), "struct.", false); generate_serialize_field(out, (*f_iter), "struct.", "", false);
} }
} }
if (has_optional) { if (has_optional) {
@ -5718,7 +5757,7 @@ void t_java_generator::generate_java_struct_tuple_writer(ostream& out, t_struct*
|| (*f_iter)->get_req() == t_field::T_OPT_IN_REQ_OUT) { || (*f_iter)->get_req() == t_field::T_OPT_IN_REQ_OUT) {
indent(out) << "if (struct." << generate_isset_check(*f_iter) << ") {" << endl; indent(out) << "if (struct." << generate_isset_check(*f_iter) << ") {" << endl;
indent_up(); indent_up();
generate_serialize_field(out, (*f_iter), "struct.", false); generate_serialize_field(out, (*f_iter), "struct.", "", false);
indent_down(); indent_down();
indent(out) << "}" << endl; indent(out) << "}" << endl;
j++; j++;
@ -5742,7 +5781,7 @@ void t_java_generator::generate_java_struct_tuple_scheme(ostream& out, t_struct*
indent_down(); indent_down();
indent(out) << "}" << endl << endl; indent(out) << "}" << endl << endl;
out << indent() << "private static class " << tstruct->get_name() out << indent() << "private static class " << tstruct->get_name()
<< "TupleScheme extends org.apache.thrift.scheme.TupleScheme<" << tstruct->get_name() << "> {" << "TupleScheme extends org.apache.thrift.scheme.TupleScheme<" << make_valid_java_identifier(tstruct->get_name()) << "> {"
<< endl << endl
<< endl; << endl;
indent_up(); indent_up();