/*
 * Copyright 2014 Google Inc. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// independent from idl_parser, since this code is not needed for most clients

#include "flatbuffers/code_generators.h"
#include "flatbuffers/flatbuffers.h"
#include "flatbuffers/idl.h"
#include "flatbuffers/util.h"
#include "idl_namer.h"

namespace flatbuffers {
namespace java {

namespace {

static Namer::Config JavaDefaultConfig() {
  return {
    /*types=*/Case::kKeep,
    /*constants=*/Case::kScreamingSnake,
    /*methods=*/Case::kLowerCamel,
    /*functions=*/Case::kLowerCamel,
    /*fields=*/Case::kLowerCamel,
    /*variables=*/Case::kLowerCamel,
    /*variants=*/Case::kKeep,
    /*enum_variant_seperator=*/".",
    /*escape_keywords=*/Namer::Config::Escape::AfterConvertingCase,
    /*namespaces=*/Case::kKeep,
    /*namespace_seperator=*/".",
    /*object_prefix=*/"",
    /*object_suffix=*/"T",
    /*keyword_prefix=*/"",
    /*keyword_suffix=*/"_",
    /*filenames=*/Case::kKeep,
    /*directories=*/Case::kKeep,
    /*output_path=*/"",
    /*filename_suffix=*/"_generated",
    /*filename_extension=*/".java",
  };
}

static std::set<std::string> JavaKeywords() {
  return {
    "abstract", "continue", "for",        "new",       "switch",
    "assert",   "default",  "goto",       "package",   "synchronized",
    "boolean",  "do",       "if",         "private",   "this",
    "break",    "double",   "implements", "protected", "throw",
    "byte",     "else",     "import",     "public",    "throws",
    "case",     "enum",     "instanceof", "return",    "transient",
    "catch",    "extends",  "int",        "short",     "try",
    "char",     "final",    "interface",  "static",    "void",
    "class",    "finally",  "long",       "strictfp",  "volatile",
    "const",    "float",    "native",     "super",     "while",
  };
}

static const TypedFloatConstantGenerator JavaFloatGen("Double.", "Float.", "NaN",
                                                "POSITIVE_INFINITY",
                                                "NEGATIVE_INFINITY");

static const CommentConfig comment_config = {
  "/**",
  " *",
  " */",
};

} // namespace

class JavaGenerator : public BaseGenerator {
  struct FieldArrayLength {
    std::string name;
    int length;
  };

 public:
  JavaGenerator(const Parser &parser, const std::string &path,
                const std::string &file_name)
      : BaseGenerator(parser, path, file_name, "", ".", "java"),
        cur_name_space_(nullptr),
        namer_(WithFlagOptions(JavaDefaultConfig(), parser.opts, path),
               JavaKeywords()) {}

  JavaGenerator &operator=(const JavaGenerator &);
  bool generate() {
    std::string one_file_code;
    cur_name_space_ = parser_.current_namespace_;

    for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();
         ++it) {
      std::string enumcode;
      auto &enum_def = **it;
      if (!parser_.opts.one_file) cur_name_space_ = enum_def.defined_namespace;
      GenEnum(enum_def, enumcode);
      if (parser_.opts.one_file) {
        one_file_code += enumcode;
      } else {
        if (!SaveType(enum_def.name, *enum_def.defined_namespace, enumcode,
                      /* needs_includes= */ false))
          return false;
      }

      if (parser_.opts.generate_object_based_api && enum_def.is_union) {
        enumcode = "";
        GenEnum_ObjectAPI(enum_def, enumcode);
        auto class_name = namer_.Type(enum_def) + "Union";
        if (parser_.opts.one_file) {
          one_file_code += enumcode;
        } else {
          if (!SaveType(class_name, *enum_def.defined_namespace, enumcode,
                        /* needs_includes= */ false))
            return false;
        }
      }
    }

    for (auto it = parser_.structs_.vec.begin();
         it != parser_.structs_.vec.end(); ++it) {
      std::string declcode;
      auto &struct_def = **it;
      if (!parser_.opts.one_file)
        cur_name_space_ = struct_def.defined_namespace;
      GenStruct(struct_def, declcode, parser_.opts);
      if (parser_.opts.one_file) {
        one_file_code += declcode;
      } else {
        if (!SaveType(struct_def.name, *struct_def.defined_namespace, declcode,
                      /* needs_includes= */ true))
          return false;
      }

      if (parser_.opts.generate_object_based_api) {
        declcode = "";
        GenStruct_ObjectAPI(struct_def, declcode);
        auto class_name = namer_.ObjectType(struct_def);
        if (parser_.opts.one_file) {
          one_file_code += declcode;
        } else {
          if (!SaveType(class_name, *struct_def.defined_namespace, declcode,
                        /* needs_includes= */ true))
            return false;
        }
      }
    }

    if (parser_.opts.one_file) {
      return SaveType(file_name_, *parser_.current_namespace_, one_file_code,
                      /* needs_includes= */ true);
    }
    return true;
  }

  // Save out the generated code for a single class while adding
  // declaration boilerplate.
  bool SaveType(const std::string &defname, const Namespace &ns,
                const std::string &classcode, bool needs_includes) const {
    if (!classcode.length()) return true;

    std::string code;
    code = "// " + std::string(FlatBuffersGeneratedWarning()) + "\n\n";

    const std::string namespace_name = FullNamespace(".", ns);
    if (!namespace_name.empty()) {
      code += "package " + namespace_name + ";";
      code += "\n\n";
    }
    if (needs_includes) {
      code +=
          "import com.google.flatbuffers.BaseVector;\n"
          "import com.google.flatbuffers.BooleanVector;\n"
          "import com.google.flatbuffers.ByteVector;\n"
          "import com.google.flatbuffers.Constants;\n"
          "import com.google.flatbuffers.DoubleVector;\n"
          "import com.google.flatbuffers.FlatBufferBuilder;\n"
          "import com.google.flatbuffers.FloatVector;\n"
          "import com.google.flatbuffers.IntVector;\n"
          "import com.google.flatbuffers.LongVector;\n"
          "import com.google.flatbuffers.ShortVector;\n"
          "import com.google.flatbuffers.StringVector;\n"
          "import com.google.flatbuffers.Struct;\n"
          "import com.google.flatbuffers.Table;\n"
          "import com.google.flatbuffers.UnionVector;\n"
          "import java.nio.ByteBuffer;\n"
          "import java.nio.ByteOrder;\n";
      if (parser_.opts.gen_nullable) {
        code += "\nimport javax.annotation.Nullable;\n";
      }
      if (parser_.opts.java_checkerframework) {
        code += "\nimport org.checkerframework.dataflow.qual.Pure;\n";
      }
      code += "\n";
    }

    code += classcode;
    if (!namespace_name.empty()) code += "";
    const std::string dirs = namer_.Directories(ns);
    EnsureDirExists(dirs);
    const std::string filename =
        dirs + namer_.File(defname, /*skips=*/SkipFile::Suffix);
    return SaveFile(filename.c_str(), code, false);
  }

  const Namespace *CurrentNameSpace() const { return cur_name_space_; }

  std::string GenNullableAnnotation(const Type &t) const {
    return parser_.opts.gen_nullable &&
                   !IsScalar(DestinationType(t, true).base_type) &&
                   t.base_type != BASE_TYPE_VECTOR
               ? " @Nullable "
               : "";
  }

  std::string GenPureAnnotation(const Type &t) const {
    return parser_.opts.java_checkerframework &&
                   !IsScalar(DestinationType(t, true).base_type)
               ? " @Pure "
               : "";
  }

  std::string GenTypeBasic(const Type &type) const {
    // clang-format off
    static const char * const java_typename[] = {
      #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, ...) \
        #JTYPE,
        FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)
      #undef FLATBUFFERS_TD
    };
    // clang-format on
    return java_typename[type.base_type];
  }

  std::string GenTypePointer(const Type &type) const {
    switch (type.base_type) {
      case BASE_TYPE_STRING: return "String";
      case BASE_TYPE_VECTOR: return GenTypeGet(type.VectorType());
      case BASE_TYPE_STRUCT: return namer_.NamespacedType(*type.struct_def);
      case BASE_TYPE_UNION: FLATBUFFERS_FALLTHROUGH();  // else fall thru
      default: return "Table";
    }
  }

  std::string GenTypeGet(const Type &type) const {
    return IsScalar(type.base_type)
               ? GenTypeBasic(type)
               : (IsArray(type) ? GenTypeGet(type.VectorType())
                                : GenTypePointer(type));
  }

  // Find the destination type the user wants to receive the value in (e.g.
  // one size higher signed types for unsigned serialized values in Java).
  Type DestinationType(const Type &type, bool vectorelem) const {
    switch (type.base_type) {
      // We use int for both uchar/ushort, since that generally means less
      // casting than using short for uchar.
      case BASE_TYPE_UCHAR: return Type(BASE_TYPE_INT);
      case BASE_TYPE_USHORT: return Type(BASE_TYPE_INT);
      case BASE_TYPE_UINT: return Type(BASE_TYPE_LONG);
      case BASE_TYPE_ARRAY:
      case BASE_TYPE_VECTOR:
        if (vectorelem) return DestinationType(type.VectorType(), vectorelem);
        FLATBUFFERS_FALLTHROUGH();  // else fall thru
      default: return type;
    }
  }

  std::string GenOffsetType() const { return "int"; }

  std::string GenOffsetConstruct(const std::string &variable_name) const {
    return variable_name;
  }

  std::string GenVectorOffsetType() const { return "int"; }

  // Generate destination type name
  std::string GenTypeNameDest(const Type &type) const {
    return GenTypeGet(DestinationType(type, true));
  }

  // Mask to turn serialized value into destination type value.
  std::string DestinationMask(const Type &type, bool vectorelem) const {
    switch (type.base_type) {
      case BASE_TYPE_UCHAR: return " & 0xFF";
      case BASE_TYPE_USHORT: return " & 0xFFFF";
      case BASE_TYPE_UINT: return " & 0xFFFFFFFFL";
      case BASE_TYPE_VECTOR:
        if (vectorelem) return DestinationMask(type.VectorType(), vectorelem);
        FLATBUFFERS_FALLTHROUGH();  // else fall thru
      default: return "";
    }
  }

  // Casts necessary to correctly read serialized data
  std::string DestinationCast(const Type &type) const {
    if (IsSeries(type)) {
      return DestinationCast(type.VectorType());
    } else {
      // Cast necessary to correctly read serialized unsigned values.
      if (type.base_type == BASE_TYPE_UINT) return "(long)";
    }
    return "";
  }

  // Cast statements for mutator method parameters.
  // In Java, parameters representing unsigned numbers need to be cast down to
  // their respective type. For example, a long holding an unsigned int value
  // would be cast down to int before being put onto the buffer.
  std::string SourceCast(const Type &type, bool castFromDest) const {
    if (IsSeries(type)) {
      return SourceCast(type.VectorType(), castFromDest);
    } else {
      if (castFromDest) {
        if (type.base_type == BASE_TYPE_UINT)
          return "(int) ";
        else if (type.base_type == BASE_TYPE_USHORT)
          return "(short) ";
        else if (type.base_type == BASE_TYPE_UCHAR)
          return "(byte) ";
      }
    }
    return "";
  }

  std::string SourceCast(const Type &type) const {
    return SourceCast(type, true);
  }

  std::string SourceCastBasic(const Type &type, bool castFromDest) const {
    return IsScalar(type.base_type) ? SourceCast(type, castFromDest) : "";
  }

  std::string SourceCastBasic(const Type &type) const {
    return SourceCastBasic(type, true);
  }

  std::string GenEnumDefaultValue(const FieldDef &field) const {
    auto &value = field.value;
    FLATBUFFERS_ASSERT(value.type.enum_def);
    auto &enum_def = *value.type.enum_def;
    auto enum_val = enum_def.FindByValue(value.constant);
    return enum_val ? namer_.NamespacedEnumVariant(enum_def, *enum_val)
                    : value.constant;
  }

  std::string GenDefaultValue(const FieldDef &field) const {
    auto &value = field.value;
    auto constant = field.IsScalarOptional() ? "0" : value.constant;
    auto longSuffix = "L";
    switch (value.type.base_type) {
      case BASE_TYPE_BOOL: return constant == "0" ? "false" : "true";
      case BASE_TYPE_ULONG: {
        // Converts the ulong into its bits signed equivalent
        uint64_t defaultValue = StringToUInt(constant.c_str());
        return NumToString(static_cast<int64_t>(defaultValue)) + longSuffix;
      }
      case BASE_TYPE_UINT:
      case BASE_TYPE_LONG: return constant + longSuffix;
      default:
        if (IsFloat(value.type.base_type)) {
          if (field.IsScalarOptional()) {
            return value.type.base_type == BASE_TYPE_DOUBLE ? "0.0" : "0f";
          }
          return JavaFloatGen.GenFloatConstant(field);
        } else {
          return constant;
        }
    }
  }

  std::string GenDefaultValueBasic(const FieldDef &field) const {
    auto &value = field.value;
    if (!IsScalar(value.type.base_type)) { return "0"; }
    return GenDefaultValue(field);
  }

  void GenEnum(EnumDef &enum_def, std::string &code) const {
    if (enum_def.generated) return;

    // Generate enum definitions of the form:
    // public static (final) int name = value;
    // In Java, we use ints rather than the Enum feature, because we want them
    // to map directly to how they're used in C/C++ and file formats.
    // That, and Java Enums are expensive, and not universally liked.
    GenComment(enum_def.doc_comment, &code, &comment_config);

    code += "@SuppressWarnings(\"unused\")\n";
    if (enum_def.attributes.Lookup("private")) {
      // For Java, we leave the enum unmarked to indicate package-private
    } else {
      code += "public ";
    }
    code += "final class " + namer_.Type(enum_def);
    code += " {\n";
    code += "  private " + namer_.Type(enum_def) + "() { }\n";
    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {
      auto &ev = **it;
      GenComment(ev.doc_comment, &code, &comment_config, "  ");
      code += "  public static final ";
      code += GenTypeBasic(DestinationType(enum_def.underlying_type, false));
      code += " ";
      code += namer_.Variant(ev) + " = ";
      code += enum_def.ToString(ev);
      if (enum_def.underlying_type.base_type == BASE_TYPE_LONG ||
          enum_def.underlying_type.base_type == BASE_TYPE_ULONG) {
        code += "L";
      }
      code += ";\n";
    }

    // Generate a string table for enum values.
    // Problem is, if values are very sparse that could generate really big
    // tables. Ideally in that case we generate a map lookup instead, but for
    // the moment we simply don't output a table at all.
    auto range = enum_def.Distance();
    // Average distance between values above which we consider a table
    // "too sparse". Change at will.
    static const uint64_t kMaxSparseness = 5;
    if (range / static_cast<uint64_t>(enum_def.size()) < kMaxSparseness &&
        GenTypeBasic(DestinationType(enum_def.underlying_type, false)) !=
            "long") {
      code += "\n  public static final String";
      code += "[] names = { ";
      const EnumVal *prev = enum_def.Vals().front();
      for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end();
           ++it) {
        const EnumVal &ev = **it;
        for (auto k = enum_def.Distance(prev, &ev); k > 1; --k)
          code += "\"\", ";
        prev = &ev;
        code += "\"" + namer_.Variant(ev) + "\", ";
      }
      code += "};\n\n";
      code += "  public static ";
      code += "String";
      code += " name";
      code += "(int e) { return names[e";
      if (enum_def.MinValue()->IsNonZero())
        code += " - " + namer_.Variant(enum_def.MinValue()->name);
      code += "]; }\n";
    }

    // Close the class
    code += "}\n\n";
  }

  // Returns the function name that is able to read a value of the given type.
  std::string GenGetter(const Type &type) const {
    switch (type.base_type) {
      case BASE_TYPE_STRING: return "__string";
      case BASE_TYPE_STRUCT: return "__struct";
      case BASE_TYPE_UNION: return "__union";
      case BASE_TYPE_VECTOR: return GenGetter(type.VectorType());
      case BASE_TYPE_ARRAY: return GenGetter(type.VectorType());
      default: {
        std::string getter = "bb.get";
        if (type.base_type == BASE_TYPE_BOOL) {
          getter = "0!=" + getter;
        } else if (GenTypeBasic(type) != "byte") {
          getter += ConvertCase(GenTypeBasic(type), Case::kUpperCamel);
        }
        return getter;
      }
    }
  }

  // Returns the function name that is able to read a value of the given type.
  std::string GenGetterForLookupByKey(flatbuffers::FieldDef *key_field,
                                      const std::string &data_buffer,
                                      const char *num = nullptr) const {
    auto type = key_field->value.type;
    auto dest_mask = DestinationMask(type, true);
    auto dest_cast = DestinationCast(type);
    auto getter = data_buffer + ".get";
    if (GenTypeBasic(type) != "byte") {
      getter += ConvertCase(GenTypeBasic(type), Case::kUpperCamel);
    }
    getter = dest_cast + getter + "(" + GenOffsetGetter(key_field, num) + ")" +
             dest_mask;
    return getter;
  }

  // Direct mutation is only allowed for scalar fields.
  // Hence a setter method will only be generated for such fields.
  std::string GenSetter(const Type &type) const {
    if (IsScalar(type.base_type)) {
      std::string setter = "bb.put";
      if (GenTypeBasic(type) != "byte" && type.base_type != BASE_TYPE_BOOL) {
        setter += ConvertCase(GenTypeBasic(type), Case::kUpperCamel);
      }
      return setter;
    } else {
      return "";
    }
  }

  // Returns the method name for use with add/put calls.
  std::string GenMethod(const Type &type) const {
    return IsScalar(type.base_type)
               ? ConvertCase(GenTypeBasic(type), Case::kUpperCamel)
               : (IsStruct(type) ? "Struct" : "Offset");
  }

  // Recursively generate arguments for a constructor, to deal with nested
  // structs.
  void GenStructArgs(const StructDef &struct_def, std::string &code,
                     const char *nameprefix, size_t array_count = 0) const {
    for (auto it = struct_def.fields.vec.begin();
         it != struct_def.fields.vec.end(); ++it) {
      auto &field = **it;
      const auto &field_type = field.value.type;
      const auto array_field = IsArray(field_type);
      const auto &type = array_field ? field_type.VectorType()
                                     : DestinationType(field_type, false);
      const auto array_cnt = array_field ? (array_count + 1) : array_count;
      if (IsStruct(type)) {
        // Generate arguments for a struct inside a struct. To ensure names
        // don't clash, and to make it obvious these arguments are constructing
        // a nested struct, prefix the name with the field name.
        GenStructArgs(*field_type.struct_def, code,
                      (nameprefix + (field.name + "_")).c_str(), array_cnt);
      } else {
        code += ", ";
        code += GenTypeNameDest(field.value.type);
        for (size_t i = 0; i < array_cnt; i++) code += "[]";
        code += " ";
        code += nameprefix;
        code += namer_.Field(field);
      }
    }
  }

  // Recusively generate struct construction statements of the form:
  // builder.putType(name);
  // and insert manual padding.
  void GenStructBody(const StructDef &struct_def, std::string &code,
                     const char *nameprefix, size_t index = 0,
                     bool in_array = false) const {
    std::string indent((index + 1) * 2, ' ');
    code += indent + "  builder.prep(";
    code += NumToString(struct_def.minalign) + ", ";
    code += NumToString(struct_def.bytesize) + ");\n";
    for (auto it = struct_def.fields.vec.rbegin();
         it != struct_def.fields.vec.rend(); ++it) {
      auto &field = **it;
      const auto &field_type = field.value.type;
      if (field.padding) {
        code += indent + "  builder.pad(";
        code += NumToString(field.padding) + ");\n";
      }
      if (IsStruct(field_type)) {
        GenStructBody(*field_type.struct_def, code,
                      (nameprefix + (field.name + "_")).c_str(), index,
                      in_array);
      } else {
        const auto &type =
            IsArray(field_type) ? field_type.VectorType() : field_type;
        const auto index_var = "_idx" + NumToString(index);
        if (IsArray(field_type)) {
          code += indent + "  for (int " + index_var + " = ";
          code += NumToString(field_type.fixed_length);
          code += "; " + index_var + " > 0; " + index_var + "--) {\n";
          in_array = true;
        }
        if (IsStruct(type)) {
          GenStructBody(*field_type.struct_def, code,
                        (nameprefix + (field.name + "_")).c_str(), index + 1,
                        in_array);
        } else {
          code += IsArray(field_type) ? "  " : "";
          code += indent + "  builder.put";
          code += GenMethod(type) + "(";
          code += SourceCast(type);
          auto argname = nameprefix + namer_.Variable(field);
          code += argname;
          size_t array_cnt = index + (IsArray(field_type) ? 1 : 0);
          for (size_t i = 0; in_array && i < array_cnt; i++) {
            code += "[_idx" + NumToString(i) + "-1]";
          }
          code += ");\n";
        }
        if (IsArray(field_type)) { code += indent + "  }\n"; }
      }
    }
  }

  std::string GenOffsetGetter(flatbuffers::FieldDef *key_field,
                              const char *num = nullptr) const {
    std::string key_offset = "";
    key_offset += "__offset(" + NumToString(key_field->value.offset) + ", ";
    if (num) {
      key_offset += num;
      key_offset += ", _bb)";
    } else {
      key_offset += "bb.capacity()";
      key_offset += " - tableOffset, bb)";
    }
    return key_offset;
  }

  std::string GenLookupKeyGetter(flatbuffers::FieldDef *key_field) const {
    std::string key_getter = "      ";
    key_getter += "int tableOffset = ";
    key_getter += "__indirect(vectorLocation + 4 * (start + middle)";
    key_getter += ", bb);\n      ";
    if (IsString(key_field->value.type)) {
      key_getter += "int comp = ";
      key_getter += "compareStrings(";
      key_getter += GenOffsetGetter(key_field);
      key_getter += ", byteKey, bb);\n";
    } else {
      auto get_val = GenGetterForLookupByKey(key_field, "bb");
      key_getter += GenTypeNameDest(key_field->value.type) + " val = ";
      key_getter += get_val + ";\n";
      key_getter += "      int comp = val > key ? 1 : val < key ? -1 : 0;\n";
    }
    return key_getter;
  }

  std::string GenKeyGetter(flatbuffers::FieldDef *key_field) const {
    std::string key_getter = "";
    auto data_buffer = "_bb";
    if (IsString(key_field->value.type)) {
      key_getter += " return ";
      key_getter += "";
      key_getter += "compareStrings(";
      key_getter += GenOffsetGetter(key_field, "o1") + ", ";
      key_getter += GenOffsetGetter(key_field, "o2") + ", " + data_buffer + ")";
      key_getter += ";";
    } else {
      auto field_getter = GenGetterForLookupByKey(key_field, data_buffer, "o1");
      key_getter +=
          "\n    " + GenTypeNameDest(key_field->value.type) + " val_1 = ";
      key_getter +=
          field_getter + ";\n    " + GenTypeNameDest(key_field->value.type);
      key_getter += " val_2 = ";
      field_getter = GenGetterForLookupByKey(key_field, data_buffer, "o2");
      key_getter += field_getter + ";\n";
      key_getter += "    return val_1 > val_2 ? 1 : val_1 < val_2 ? -1 : 0;\n ";
    }
    return key_getter;
  }

  void GenStruct(StructDef &struct_def, std::string &code,
                 const IDLOptions &opts) const {
    if (struct_def.generated) return;

    // Generate a struct accessor class, with methods of the form:
    // public type name() { return bb.getType(i + offset); }
    // or for tables of the form:
    // public type name() {
    //   int o = __offset(offset); return o != 0 ? bb.getType(o + i) : default;
    // }
    GenComment(struct_def.doc_comment, &code, &comment_config);

    if (parser_.opts.gen_generated) {
      code += "@javax.annotation.Generated(value=\"flatc\")\n";
    }
    code += "@SuppressWarnings(\"unused\")\n";
    if (struct_def.attributes.Lookup("private")) {
      // For Java, we leave the struct unmarked to indicate package-private
    } else {
      code += "public ";
    }
    const auto struct_class = namer_.Type(struct_def);
    code += "final class " + struct_class;
    code += " extends ";
    code += struct_def.fixed ? "Struct" : "Table";
    code += " {\n";

    if (!struct_def.fixed) {
      // Generate version check method.
      // Force compile time error if not using the same version runtime.
      code += "  public static void ValidateVersion() {";
      code += " Constants.";
      code += "FLATBUFFERS_23_1_21(); ";
      code += "}\n";

      // Generate a special accessor for the table that when used as the root
      // of a FlatBuffer
      const std::string method_name =
          namer_.LegacyJavaMethod2("getRootAs", struct_def, "");
      const std::string method_signature =
          "  public static " + struct_class + " " + method_name;

      // create convenience method that doesn't require an existing object
      code += method_signature + "(ByteBuffer _bb) ";
      code +=
          "{ return " + method_name + "(_bb, new " + struct_class + "()); }\n";

      // create method that allows object reuse
      code +=
          method_signature + "(ByteBuffer _bb, " + struct_class + " obj) { ";
      code += "_bb.order(ByteOrder.LITTLE_ENDIAN); ";
      code += "return (obj.__assign(_bb.getInt(_bb.";
      code += "position()";
      code += ") + _bb.";
      code += "position()";
      code += ", _bb)); }\n";
      if (parser_.root_struct_def_ == &struct_def) {
        if (parser_.file_identifier_.length()) {
          // Check if a buffer has the identifier.
          code += "  public static ";
          code += "boolean " +
                  namer_.LegacyJavaMethod2(
                      "", struct_def, "BufferHasIdentifier(ByteBuffer _bb)") +
                  " { return ";
          code += "__has_identifier(_bb, \"";
          code += parser_.file_identifier_;
          code += "\"); }\n";
        }
      }
    }
    // Generate the __init method that sets the field in a pre-existing
    // accessor object. This is to allow object reuse.
    code += "  public void __init(int _i, ByteBuffer _bb) ";
    code += "{ ";
    code += "__reset(_i, _bb); ";
    code += "}\n";
    code += "  public " + struct_class + " __assign(int _i, ByteBuffer _bb) ";
    code += "{ __init(_i, _bb); return this; }\n\n";
    for (auto it = struct_def.fields.vec.begin();
         it != struct_def.fields.vec.end(); ++it) {
      auto &field = **it;
      if (field.deprecated) continue;
      GenComment(field.doc_comment, &code, &comment_config, "  ");
      const std::string type_name = GenTypeGet(field.value.type);
      const std::string type_name_dest = GenTypeNameDest(field.value.type);
      const std::string dest_mask = DestinationMask(field.value.type, true);
      const std::string dest_cast = DestinationCast(field.value.type);
      const std::string src_cast = SourceCast(field.value.type);
      const std::string method_start =
          "  public " +
          (field.IsRequired() ? "" : GenNullableAnnotation(field.value.type)) +
          GenPureAnnotation(field.value.type) + type_name_dest + " " +
          namer_.Field(field);
      const std::string obj = "obj";

      // Most field accessors need to retrieve and test the field offset first,
      // this is the prefix code for that:
      auto offset_prefix =
          IsArray(field.value.type)
              ? " { return "
              : (" { int o = __offset(" + NumToString(field.value.offset) +
                 "); return o != 0 ? ");
      // Generate the accessors that don't do object reuse.
      if (field.value.type.base_type == BASE_TYPE_STRUCT) {
        // Calls the accessor that takes an accessor object with a new object.
        code += method_start + "() { return ";
        code += namer_.Field(field);
        code += "(new ";
        code += type_name + "()); }\n";
      } else if (IsSeries(field.value.type) &&
                 field.value.type.element == BASE_TYPE_STRUCT) {
        // Accessors for vectors of structs also take accessor objects, this
        // generates a variant without that argument.
        code += method_start + "(int j) { return ";
        code += namer_.Field(field);
        code += "(new " + type_name + "(), j); }\n";
      }

      if (field.IsScalarOptional()) { code += GenOptionalScalarCheck(field); }
      std::string getter = dest_cast + GenGetter(field.value.type);
      code += method_start;
      std::string member_suffix = "; ";
      if (IsScalar(field.value.type.base_type)) {
        code += "()";
        member_suffix += "";
        if (struct_def.fixed) {
          code += " { return " + getter;
          code += "(bb_pos + ";
          code += NumToString(field.value.offset) + ")";
          code += dest_mask;
        } else {
          code += offset_prefix + getter;
          code += "(o + bb_pos)" + dest_mask;
          code += " : ";
          code += GenDefaultValue(field);
        }
      } else {
        switch (field.value.type.base_type) {
          case BASE_TYPE_STRUCT:
            code += "(" + type_name + " obj)";
            if (struct_def.fixed) {
              code += " { return " + obj + ".__assign(";
              code += "bb_pos + " + NumToString(field.value.offset) + ", ";
              code += "bb)";
            } else {
              code += offset_prefix;
              code += obj + ".__assign(";
              code += field.value.type.struct_def->fixed
                          ? "o + bb_pos"
                          : "__indirect(o + bb_pos)";
              code += ", bb) : null";
            }
            break;
          case BASE_TYPE_STRING:
            code += "()";
            member_suffix += "";
            code += offset_prefix + getter + "(o + ";
            code += "bb_pos) : null";
            break;
          case BASE_TYPE_ARRAY: FLATBUFFERS_FALLTHROUGH();  // fall thru
          case BASE_TYPE_VECTOR: {
            auto vectortype = field.value.type.VectorType();
            code += "(";
            if (vectortype.base_type == BASE_TYPE_STRUCT) {
              code += type_name + " obj, ";
              getter = obj + ".__assign";
            } else if (vectortype.base_type == BASE_TYPE_UNION) {
              code += type_name + " obj, ";
            }
            code += "int j)";
            const auto body = offset_prefix + getter + "(";
            if (vectortype.base_type == BASE_TYPE_UNION) {
              code += body + "obj, ";
            } else {
              code += body;
            }
            std::string index;
            if (IsArray(field.value.type)) {
              index += "bb_pos + " + NumToString(field.value.offset) + " + ";
            } else {
              index += "__vector(o) + ";
            }
            index += "j * " + NumToString(InlineSize(vectortype));
            if (vectortype.base_type == BASE_TYPE_STRUCT) {
              code += vectortype.struct_def->fixed
                          ? index
                          : "__indirect(" + index + ")";
              code += ", bb";
            } else {
              code += index;
            }
            code += ")" + dest_mask;
            if (!IsArray(field.value.type)) {
              code += " : ";
              code += field.value.type.element == BASE_TYPE_BOOL
                          ? "false"
                          : (IsScalar(field.value.type.element) ? "0" : "null");
            }

            break;
          }
          case BASE_TYPE_UNION:
            code += "(" + type_name + " obj)" + offset_prefix + getter;
            code += "(obj, o + bb_pos) : null";
            break;
          default: FLATBUFFERS_ASSERT(0);
        }
      }
      code += member_suffix;
      code += "}\n";
      if (IsVector(field.value.type)) {
        code += "  public int " + namer_.Field(field);
        code += "Length";
        code += "()";
        code += offset_prefix;
        code += "__vector_len(o) : 0; ";
        code += "";
        code += "}\n";
        // See if we should generate a by-key accessor.
        if (field.value.type.element == BASE_TYPE_STRUCT &&
            !field.value.type.struct_def->fixed) {
          auto &sd = *field.value.type.struct_def;
          auto &fields = sd.fields.vec;
          for (auto kit = fields.begin(); kit != fields.end(); ++kit) {
            auto &key_field = **kit;
            if (key_field.key) {
              auto qualified_name = namer_.NamespacedType(sd);
              code += "  public " + qualified_name + " ";
              code += namer_.Method(field) + "ByKey(";
              code += GenTypeNameDest(key_field.value.type) + " key)";
              code += offset_prefix;
              code += qualified_name + ".__lookup_by_key(";
              code += "null, ";
              code += "__vector(o), key, ";
              code += "bb) : null; ";
              code += "}\n";
              code += "  public " + qualified_name + " ";
              code += namer_.Method(field) + "ByKey(";
              code += qualified_name + " obj, ";
              code += GenTypeNameDest(key_field.value.type) + " key)";
              code += offset_prefix;
              code += qualified_name + ".__lookup_by_key(obj, ";
              code += "__vector(o), key, ";
              code += "bb) : null; ";
              code += "}\n";
              break;
            }
          }
        }
      }
      // Generate the accessors for vector of structs with vector access object
      if (IsVector(field.value.type)) {
        std::string vector_type_name;
        const auto &element_base_type = field.value.type.VectorType().base_type;
        if (IsScalar(element_base_type)) {
          vector_type_name =
              ConvertCase(type_name, Case::kUpperCamel) + "Vector";
        } else if (element_base_type == BASE_TYPE_STRING) {
          vector_type_name = "StringVector";
        } else if (element_base_type == BASE_TYPE_UNION) {
          vector_type_name = "UnionVector";
        } else {
          vector_type_name = type_name + ".Vector";
        }
        auto vector_method_start = GenNullableAnnotation(field.value.type) +
                                   "  public " + vector_type_name + " " +
                                   namer_.Field(field, "vector");
        code += vector_method_start + "() { return ";
        code += namer_.Field(field, "vector");
        code += "(new " + vector_type_name + "()); }\n";
        code += vector_method_start + "(" + vector_type_name + " obj)";
        code += offset_prefix + obj + ".__assign(";
        code += "__vector(o), ";
        if (!IsScalar(element_base_type)) {
          auto vectortype = field.value.type.VectorType();
          code += NumToString(InlineSize(vectortype)) + ", ";
        }
        code += "bb) : null" + member_suffix + "}\n";
      }
      // Generate a ByteBuffer accessor for strings & vectors of scalars.
      if ((IsVector(field.value.type) &&
           IsScalar(field.value.type.VectorType().base_type)) ||
          IsString(field.value.type)) {
        code += "  public ByteBuffer ";
        code += namer_.Field(field);
        code += "AsByteBuffer() { return ";
        code += "__vector_as_bytebuffer(";
        code += NumToString(field.value.offset) + ", ";
        code += NumToString(IsString(field.value.type)
                                ? 1
                                : InlineSize(field.value.type.VectorType()));
        code += "); }\n";
        code += "  public ByteBuffer ";
        code += namer_.Field(field);
        code += "InByteBuffer(ByteBuffer _bb) { return ";
        code += "__vector_in_bytebuffer(_bb, ";
        code += NumToString(field.value.offset) + ", ";
        code += NumToString(IsString(field.value.type)
                                ? 1
                                : InlineSize(field.value.type.VectorType()));
        code += "); }\n";
      }
      // generate object accessors if is nested_flatbuffer
      if (field.nested_flatbuffer) {
        auto nested_type_name = namer_.NamespacedType(*field.nested_flatbuffer);
        auto nested_method_name =
            namer_.Field(field) + "As" + field.nested_flatbuffer->name;
        auto get_nested_method_name = nested_method_name;
        code += "  public " + nested_type_name + " ";
        code += nested_method_name + "() { return ";
        code +=
            get_nested_method_name + "(new " + nested_type_name + "()); }\n";
        code += "  public " + nested_type_name + " ";
        code += get_nested_method_name + "(";
        code += nested_type_name + " obj";
        code += ") { int o = __offset(";
        code += NumToString(field.value.offset) + "); ";
        code += "return o != 0 ? " + obj + ".__assign(";
        code += "";
        code += "__indirect(__vector(o)), ";
        code += "bb) : null; }\n";
      }
      // Generate mutators for scalar fields or vectors of scalars.
      if (parser_.opts.mutable_buffer) {
        auto is_series = (IsSeries(field.value.type));
        const auto &underlying_type =
            is_series ? field.value.type.VectorType() : field.value.type;
        // Boolean parameters have to be explicitly converted to byte
        // representation.
        auto setter_parameter = underlying_type.base_type == BASE_TYPE_BOOL
                                    ? "(byte)(" + field.name + " ? 1 : 0)"
                                    : field.name;
        // A vector mutator also needs the index of the vector element it should
        // mutate.
        auto mutator_params = (is_series ? "(int j, " : "(") +
                              GenTypeNameDest(underlying_type) + " " +
                              field.name + ") { ";
        auto setter_index =
            is_series
                ? (IsArray(field.value.type)
                       ? "bb_pos + " + NumToString(field.value.offset)
                       : "__vector(o)") +
                      +" + j * " + NumToString(InlineSize(underlying_type))
                : (struct_def.fixed
                       ? "bb_pos + " + NumToString(field.value.offset)
                       : "o + bb_pos");
        if (IsScalar(underlying_type.base_type) && !IsUnion(field.value.type)) {
          code += "  public ";
          code += struct_def.fixed ? "void " : "boolean ";
          code += namer_.Method("mutate", field);
          code += mutator_params;
          if (struct_def.fixed) {
            code += GenSetter(underlying_type) + "(" + setter_index + ", ";
            code += src_cast + setter_parameter + "); }\n";
          } else {
            code += "int o = __offset(";
            code += NumToString(field.value.offset) + ");";
            code += " if (o != 0) { " + GenSetter(underlying_type);
            code += "(" + setter_index + ", " + src_cast + setter_parameter +
                    "); return true; } else { return false; } }\n";
          }
        }
      }
      if (parser_.opts.java_primitive_has_method &&
          IsScalar(field.value.type.base_type) && !struct_def.fixed) {
        auto vt_offset_constant = "  public static final int VT_" +
                                  namer_.Constant(field) + " = " +
                                  NumToString(field.value.offset) + ";";

        code += vt_offset_constant;
        code += "\n";
      }
    }
    code += "\n";
    auto struct_has_create = false;
    std::set<flatbuffers::FieldDef *> field_has_create_set;
    flatbuffers::FieldDef *key_field = nullptr;
    if (struct_def.fixed) {
      struct_has_create = true;
      // create a struct constructor function
      code += "  public static " + GenOffsetType() + " ";
      code += "create";
      code += struct_class + "(FlatBufferBuilder builder";
      GenStructArgs(struct_def, code, "");
      code += ") {\n";
      GenStructBody(struct_def, code, "");
      code += "    return ";
      code += GenOffsetConstruct("builder." + std::string("offset()"));
      code += ";\n  }\n";
    } else {
      // Generate a method that creates a table in one go. This is only possible
      // when the table has no struct fields, since those have to be created
      // inline, and there's no way to do so in Java.
      bool has_no_struct_fields = true;
      int num_fields = 0;
      for (auto it = struct_def.fields.vec.begin();
           it != struct_def.fields.vec.end(); ++it) {
        auto &field = **it;
        if (field.deprecated) continue;
        if (IsStruct(field.value.type)) {
          has_no_struct_fields = false;
        } else {
          num_fields++;
        }
      }
      // JVM specifications restrict default constructor params to be < 255.
      // Longs and doubles take up 2 units, so we set the limit to be < 127.
      if (has_no_struct_fields && num_fields && num_fields < 127) {
        struct_has_create = true;
        // Generate a table constructor of the form:
        // public static int createName(FlatBufferBuilder builder, args...)
        code += "  public static " + GenOffsetType() + " ";
        code += namer_.LegacyJavaMethod2("create", struct_def, "");
        code += "(FlatBufferBuilder builder";
        for (auto it = struct_def.fields.vec.begin();
             it != struct_def.fields.vec.end(); ++it) {
          auto &field = **it;
          auto field_name = namer_.Field(field);
          if (field.deprecated) continue;
          code += ",\n      ";
          code += GenTypeBasic(DestinationType(field.value.type, false));
          code += " ";
          code += field_name;
          if (!IsScalar(field.value.type.base_type)) code += "Offset";
        }
        code += ") {\n    builder.";
        code += "startTable(";
        code += NumToString(struct_def.fields.vec.size()) + ");\n";
        for (size_t size = struct_def.sortbysize ? sizeof(largest_scalar_t) : 1;
             size; size /= 2) {
          for (auto it = struct_def.fields.vec.rbegin();
               it != struct_def.fields.vec.rend(); ++it) {
            auto &field = **it;
            auto field_name = namer_.Field(field);
            if (!field.deprecated &&
                (!struct_def.sortbysize ||
                 size == SizeOf(field.value.type.base_type))) {
              code += "    " + struct_class + ".";
              code += namer_.Method("add", field) + "(builder, " + field_name;
              if (!IsScalar(field.value.type.base_type)) code += "Offset";
              code += ");\n";
            }
          }
        }
        code += "    return " + struct_class + ".";
        code += namer_.LegacyJavaMethod2("end", struct_def, "");
        code += "(builder);\n  }\n\n";
      }
      // Generate a set of static methods that allow table construction,
      // of the form:
      // public static void addName(FlatBufferBuilder builder, short name)
      // { builder.addShort(id, name, default); }
      // Unlike the Create function, these always work.
      code += "  public static void start";
      code += struct_class;
      code += "(FlatBufferBuilder builder) { builder.";
      code += "startTable(";
      code += NumToString(struct_def.fields.vec.size()) + "); }\n";
      for (auto it = struct_def.fields.vec.begin();
           it != struct_def.fields.vec.end(); ++it) {
        auto &field = **it;
        if (field.deprecated) continue;

        code += "  public static void " + namer_.Method("add", field);
        code += "(FlatBufferBuilder builder, ";
        code += GenTypeBasic(DestinationType(field.value.type, false));
        auto argname = namer_.Field(field);
        if (!IsScalar(field.value.type.base_type)) argname += "Offset";
        code += " " + argname + ") { builder.add";
        code += GenMethod(field.value.type) + "(";

        if (field.key) {
          // field has key attribute, so always need to exist
          // even if its value is equal to default.
          // Generated code will bypass default checking
          // resulting in { builder.addShort(name); slot(id); }
          key_field = &field;
          code += SourceCastBasic(field.value.type);
          code += argname;
          code += "); builder.slot(" +
                  NumToString(it - struct_def.fields.vec.begin()) + "); }\n";
        } else {
          code += NumToString(it - struct_def.fields.vec.begin()) + ", ";
          code += SourceCastBasic(field.value.type);
          code += argname;
          code += ", ";
          code += SourceCastBasic(field.value.type);
          code += GenDefaultValue(field);
          code += "); }\n";
        }
        if (IsVector(field.value.type)) {
          auto vector_type = field.value.type.VectorType();
          auto alignment = InlineAlignment(vector_type);
          auto elem_size = InlineSize(vector_type);
          if (!IsStruct(vector_type)) {
            field_has_create_set.insert(&field);
            // generate a method to create a vector from a java array.
            if ((vector_type.base_type == BASE_TYPE_CHAR ||
                 vector_type.base_type == BASE_TYPE_UCHAR)) {
              // Handle byte[] and ByteBuffers separately for Java
              code += "  public static " + GenVectorOffsetType() + " ";
              code += namer_.Method("create", field);
              code += "Vector(FlatBufferBuilder builder, byte[] data) ";
              code += "{ return builder.createByteVector(data); }\n";

              code += "  public static " + GenVectorOffsetType() + " ";
              code += namer_.Method("create", field);
              code += "Vector(FlatBufferBuilder builder, ByteBuffer data) ";
              code += "{ return builder.createByteVector(data); }\n";
            } else {
              code += "  public static " + GenVectorOffsetType() + " ";
              code += namer_.Method("create", field);
              code += "Vector(FlatBufferBuilder builder, ";
              code += GenTypeBasic(DestinationType(vector_type, false)) +
                      "[] data) ";
              code += "{ builder.startVector(";
              code += NumToString(elem_size);
              code += ", data.length, ";
              code += NumToString(alignment);
              code += "); for (int i = data.";
              code += "length - 1; i >= 0; i--) builder.";
              code += "add";
              code += GenMethod(vector_type);
              code += "(";
              code += SourceCastBasic(vector_type);
              code += "data[i]";
              code += "); return ";
              code += "builder.endVector(); }\n";
            }
          }
          // Generate a method to start a vector, data to be added manually
          // after.
          code += "  public static void " + namer_.Method("start", field);
          code += "Vector(FlatBufferBuilder builder, int numElems) ";
          code += "{ builder.startVector(";
          code += NumToString(elem_size);
          code += ", numElems, " + NumToString(alignment);
          code += "); }\n";
        }
      }
      code += "  public static " + GenOffsetType() + " ";
      code += namer_.LegacyJavaMethod2("end", struct_def, "");
      code += "(FlatBufferBuilder builder) {\n    int o = builder.";
      code += "endTable();\n";
      for (auto it = struct_def.fields.vec.begin();
           it != struct_def.fields.vec.end(); ++it) {
        auto &field = **it;
        if (!field.deprecated && field.IsRequired()) {
          code += "    builder.required(o, ";
          code += NumToString(field.value.offset);
          code += ");  // " + field.name + "\n";
        }
      }
      code += "    return " + GenOffsetConstruct("o") + ";\n  }\n";
      if (parser_.root_struct_def_ == &struct_def) {
        std::string size_prefix[] = { "", "SizePrefixed" };
        for (int i = 0; i < 2; ++i) {
          code += "  public static void ";
          code += namer_.LegacyJavaMethod2("finish" + size_prefix[i],
                                           struct_def, "Buffer");
          code += "(FlatBufferBuilder builder, " + GenOffsetType();
          code += " offset) {";
          code += " builder.finish" + size_prefix[i] + "(offset";

          if (parser_.file_identifier_.length())
            code += ", \"" + parser_.file_identifier_ + "\"";
          code += "); }\n";
        }
      }
    }
    // Only generate key compare function for table,
    // because `key_field` is not set for struct
    if (struct_def.has_key && !struct_def.fixed) {
      FLATBUFFERS_ASSERT(key_field);
      code += "\n  @Override\n  protected int keysCompare(";
      code += "Integer o1, Integer o2, ByteBuffer _bb) {";
      code += GenKeyGetter(key_field);
      code += " }\n";

      code += "\n  public static " + struct_class;
      code += " __lookup_by_key(";
      code += struct_class + " obj, ";
      code += "int vectorLocation, ";
      code += GenTypeNameDest(key_field->value.type);
      code += " key, ByteBuffer bb) {\n";
      if (IsString(key_field->value.type)) {
        code += "    byte[] byteKey = ";
        code += "key.getBytes(java.nio.charset.StandardCharsets.UTF_8);\n";
      }
      code += "    int span = ";
      code += "bb.getInt(vectorLocation - 4);\n";
      code += "    int start = 0;\n";
      code += "    while (span != 0) {\n";
      code += "      int middle = span / 2;\n";
      code += GenLookupKeyGetter(key_field);
      code += "      if (comp > 0) {\n";
      code += "        span = middle;\n";
      code += "      } else if (comp < 0) {\n";
      code += "        middle++;\n";
      code += "        start += middle;\n";
      code += "        span -= middle;\n";
      code += "      } else {\n";
      code += "        return ";
      code += "(obj == null ? new " + struct_class + "() : obj)";
      code += ".__assign(tableOffset, bb);\n";
      code += "      }\n    }\n";
      code += "    return null;\n";
      code += "  }\n";
    }
    GenVectorAccessObject(struct_def, code);
    if (opts.generate_object_based_api) {
      GenPackUnPack_ObjectAPI(struct_def, code, opts, struct_has_create,
                              field_has_create_set);
    }
    code += "}\n\n";
  }

  std::string GenOptionalScalarCheck(FieldDef &field) const {
    if (!field.IsScalarOptional()) return "";
    return "  public boolean " + namer_.Method("has", field) +
           "() { return 0 != __offset(" + NumToString(field.value.offset) +
           "); }\n";
  }

  void GenVectorAccessObject(StructDef &struct_def, std::string &code) const {
    // Generate a vector of structs accessor class.
    code += "\n";
    code += "  ";
    if (!struct_def.attributes.Lookup("private")) code += "public ";
    code += "static ";
    code += "final ";
    code += "class Vector extends ";
    code += "BaseVector {\n";

    // Generate the __assign method that sets the field in a pre-existing
    // accessor object. This is to allow object reuse.
    std::string method_indent = "    ";
    code += method_indent + "public Vector ";
    code += "__assign(int _vector, int _element_size, ByteBuffer _bb) { ";
    code += "__reset(_vector, _element_size, _bb); return this; }\n\n";

    auto type_name = namer_.Type(struct_def);
    auto method_start = method_indent + "public " + type_name + " get";
    // Generate the accessors that don't do object reuse.
    code += method_start + "(int j) { return get";
    code += "(new " + type_name + "(), j); }\n";
    code += method_start + "(" + type_name + " obj, int j) { ";
    code += " return obj.__assign(";
    std::string index = "__element(j)";
    code += struct_def.fixed ? index : "__indirect(" + index + ", bb)";
    code += ", bb); }\n";
    // See if we should generate a by-key accessor.
    if (!struct_def.fixed) {
      auto &fields = struct_def.fields.vec;
      for (auto kit = fields.begin(); kit != fields.end(); ++kit) {
        auto &key_field = **kit;
        if (key_field.key) {
          auto nullable_annotation =
              parser_.opts.gen_nullable ? "@Nullable " : "";
          code += method_indent + nullable_annotation;
          code += "public " + type_name + " ";
          code += "getByKey(";
          code += GenTypeNameDest(key_field.value.type) + " key) { ";
          code += " return __lookup_by_key(null, ";
          code += "__vector(), key, ";
          code += "bb); ";
          code += "}\n";
          code += method_indent + nullable_annotation;
          code += "public " + type_name + " ";
          code += "getByKey(";
          code += type_name + " obj, ";
          code += GenTypeNameDest(key_field.value.type) + " key) { ";
          code += " return __lookup_by_key(obj, ";
          code += "__vector(), key, ";
          code += "bb); ";
          code += "}\n";
          break;
        }
      }
    }
    code += "  }\n";
  }

  void GenEnum_ObjectAPI(EnumDef &enum_def, std::string &code) const {
    if (enum_def.generated) return;
    code += "import com.google.flatbuffers.FlatBufferBuilder;\n\n";

    if (!enum_def.attributes.Lookup("private")) { code += "public "; }
    auto union_name = namer_.Type(enum_def) + "Union";
    auto union_type =
        GenTypeBasic(DestinationType(enum_def.underlying_type, false));
    code += "class " + union_name + " {\n";
    // Type
    code += "  private " + union_type + " type;\n";
    // Value
    code += "  private Object value;\n";
    code += "\n";
    // getters and setters
    code += "  public " + union_type + " getType() { return type; }\n\n";
    code += "  public void setType(" + union_type +
            " type) { this.type = type; }\n\n";
    code += "  public Object getValue() { return value; }\n\n";
    code += "  public void setValue(Object value) { this.value = value; }\n\n";
    // Constructor
    code += "  public " + union_name + "() {\n";
    code +=
        "    this.type = " + namer_.EnumVariant(enum_def, *enum_def.Vals()[0]) +
        ";\n";
    code += "    this.value = null;\n";
    code += "  }\n\n";
    // As
    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {
      auto &ev = **it;
      if (ev.union_type.base_type == BASE_TYPE_NONE) continue;
      auto type_name = GenTypeGet_ObjectAPI(ev.union_type, false, true);
      if (ev.union_type.base_type == BASE_TYPE_STRUCT &&
          ev.union_type.struct_def->attributes.Lookup("private")) {
        code += "  ";
      } else {
        code += "  public ";
      }
      code += type_name + " as" + ev.name + "() { return (" + type_name +
              ") value; }\n";
    }
    code += "\n";
    // pack()
    code += "  public static int pack(FlatBufferBuilder builder, " +
            union_name + " _o) {\n";
    code += "    switch (_o.type) {\n";
    for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {
      auto &ev = **it;
      if (ev.union_type.base_type == BASE_TYPE_NONE) {
        continue;
      } else {
        code += "      case " + namer_.EnumVariant(enum_def, ev) + ": return ";
        if (IsString(ev.union_type)) {
          code += "builder.createString(_o.as" + ev.name + "());\n";
        } else {
          code += GenTypeGet(ev.union_type) + ".pack(builder, _o.as" + ev.name +
                  "());\n";
        }
      }
    }
    code += "      default: return 0;\n";
    code += "    }\n";
    code += "  }\n";
    code += "}\n\n";
  }

  void GenUnionUnPack_ObjectAPI(const EnumDef &enum_def, std::string &code,
                                const std::string &type_name,
                                const std::string &field_name,
                                bool is_vector) const {
    const std::string variable_type =
        is_vector ? type_name.substr(0, type_name.length() - 2) : type_name;
    const std::string variable_name =
        "_" + namer_.Variable("o", field_name) + (is_vector ? "Element" : "");
    const std::string type_params = is_vector ? "_j" : "";
    const std::string value_params = is_vector ? ", _j" : "";
    const std::string indent = (is_vector ? "      " : "    ");

    code += indent + variable_type + " " + variable_name + " = new " +
            variable_type + "();\n";
    code += indent +
            GenTypeBasic(DestinationType(enum_def.underlying_type, false)) +
            " " + variable_name + "Type = " + field_name + "Type(" +
            type_params + ");\n";
    code += indent + variable_name + ".setType(" + variable_name + "Type);\n";
    code += indent + "Table " + variable_name + "Value;\n";
    code += indent + "switch (" + variable_name + "Type) {\n";
    for (auto eit = enum_def.Vals().begin(); eit != enum_def.Vals().end();
         ++eit) {
      auto &ev = **eit;
      if (ev.union_type.base_type == BASE_TYPE_NONE) {
        continue;
      } else {
        if (ev.union_type.base_type == BASE_TYPE_STRING ||
            (ev.union_type.base_type == BASE_TYPE_STRUCT &&
             ev.union_type.struct_def->fixed)) {
          continue;  // This branch is due to bad implemantation of Unions in
                     // Java which doesn't handle non Table types. Should be
                     // deleted when issue #6561 is fixed.
        }
        code += indent + "  case " +
                namer_.NamespacedEnumVariant(enum_def, ev) + ":\n";
        auto actual_type = GenTypeGet(ev.union_type);
        code += indent + "    " + variable_name + "Value = " + field_name +
                "(new " + actual_type + "()" + value_params + ");\n";
        code += indent + "    " + variable_name + ".setValue(" + variable_name +
                "Value != null ? ((" + actual_type + ") " + variable_name +
                "Value).unpack() : null);\n";
        code += indent + "    break;\n";
      }
    }
    code += indent + "  default: break;\n";
    code += indent + "}\n";
    if (is_vector) {
      code += indent + "_" + namer_.Variable("o", field_name) +
              "[_j] = " + variable_name + ";\n";
    }
  }

  void GenPackUnPack_ObjectAPI(
      StructDef &struct_def, std::string &code, const IDLOptions &opts,
      bool struct_has_create,
      const std::set<FieldDef *> &field_has_create) const {
    auto struct_name = namer_.ObjectType(struct_def);
    // unpack()
    code += "  public " + struct_name + " unpack() {\n";
    code += "    " + struct_name + " _o = new " + struct_name + "();\n";
    code += "    unpackTo(_o);\n";
    code += "    return _o;\n";
    code += "  }\n";
    // unpackTo()
    code += "  public void unpackTo(" + struct_name + " _o) {\n";
    for (auto it = struct_def.fields.vec.begin();
         it != struct_def.fields.vec.end(); ++it) {
      const auto &field = **it;
      if (field.deprecated) continue;
      if (field.value.type.base_type == BASE_TYPE_UTYPE) continue;
      if (field.value.type.element == BASE_TYPE_UTYPE) continue;
      const auto accessor = namer_.Method(field);
      const auto variable = "_" + namer_.Variable("o", field);
      const auto get_field = namer_.Method("get", field);
      const auto set_field = namer_.Method("set", field);

      auto type_name = GenTypeGet_ObjectAPI(field.value.type, false, true);
      if (field.IsScalarOptional())
        type_name = ConvertPrimitiveTypeToObjectWrapper_ObjectAPI(type_name);
      auto start = "    " + type_name + " " + variable + " = ";
      auto call_setter = true;
      switch (field.value.type.base_type) {
        case BASE_TYPE_STRUCT: {
          auto fixed = struct_def.fixed && field.value.type.struct_def->fixed;
          if (fixed) {
            code +=
                "    " + accessor + "().unpackTo(_o." + get_field + "());\n";
          } else {
            code += "    if (" + accessor + "() != null) ";
            if (field.value.type.struct_def->fixed) {
              code += accessor + "().unpackTo(_o." + get_field + "());\n";
            } else {
              code += "_o." + set_field + "(" + accessor + "().unpack());\n";
            }
            code += "    else _o." + set_field + "(null);\n";
          }
          call_setter = false;
          break;
        }
        case BASE_TYPE_ARRAY: {
          auto length_str = NumToString(field.value.type.fixed_length);
          auto unpack_method =
              field.value.type.struct_def == nullptr ? "" : ".unpack()";
          code += start + "_o." + get_field + "();\n";
          code += "    for (int _j = 0; _j < " + length_str + "; ++_j) { " +
                  variable + "[_j] = " + accessor + "(_j)" + unpack_method +
                  "; }\n";
          call_setter = false;
          break;
        }
        case BASE_TYPE_VECTOR:
          if (field.value.type.element == BASE_TYPE_UNION) {
            code += start + "new " +
                    GenConcreteTypeGet_ObjectAPI(field.value.type)
                        .substr(0, type_name.length() - 1) +
                    accessor + "Length()];\n";
            code +=
                "    for (int _j = 0; _j < " + accessor + "Length(); ++_j) {\n";
            GenUnionUnPack_ObjectAPI(*field.value.type.enum_def, code,
                                     type_name, accessor, true);
            code += "    }\n";
          } else if (field.value.type.element != BASE_TYPE_UTYPE) {
            auto fixed = field.value.type.struct_def == nullptr;
            const auto length_accessor = namer_.Method(field, "length");
            code += start + "new " +
                    GenConcreteTypeGet_ObjectAPI(field.value.type)
                        .substr(0, type_name.length() - 1) +
                    length_accessor + "()];\n";
            code +=
                "    for (int _j = 0; _j < " + length_accessor + "(); ++_j) {";
            code += variable + "[_j] = ";
            if (fixed) {
              code += accessor + "(_j)";
            } else {
              code += "(" + accessor + "(_j) != null ? " + accessor +
                      "(_j).unpack() : null)";
            }
            code += ";}\n";
          }
          break;
        case BASE_TYPE_UTYPE: break;
        case BASE_TYPE_UNION: {
          GenUnionUnPack_ObjectAPI(*field.value.type.enum_def, code, type_name,
                                   accessor, false);
          break;
        }
        default: {
          if (field.IsScalarOptional()) {
            code += start + namer_.Method("has", field) + "() ? " + accessor +
                    "() : null;\n";
          } else {
            code += start + accessor + "();\n";
          }
          break;
        }
      }
      if (call_setter) {
        code += "    _o." + set_field + "(" + variable + ");\n";
      }
    }
    code += "  }\n";
    // pack()
    code += "  public static " + GenOffsetType() +
            " pack(FlatBufferBuilder builder, " + struct_name + " _o) {\n";
    code += "    if (_o == null) return 0;\n";
    for (auto it = struct_def.fields.vec.begin();
         it != struct_def.fields.vec.end(); ++it) {
      auto &field = **it;
      if (field.deprecated) continue;
      const auto field_name = namer_.Field(field);
      const auto variable = "_" + namer_.Variable("o", field);
      const auto get_field = namer_.Method("get", field);
      // pre
      switch (field.value.type.base_type) {
        case BASE_TYPE_STRUCT: {
          if (!field.value.type.struct_def->fixed) {
            code += "    " + GenOffsetType() + " _" + namer_.Variable(field) +
                    " = _o." + get_field +
                    "() == null ? 0 : " + GenTypeGet(field.value.type) +
                    ".pack(builder, _o." + get_field + "());\n";
          } else if (struct_def.fixed && struct_has_create) {
            std::vector<FieldArrayLength> array_lengths;
            FieldArrayLength tmp_array_length = {
              field.name,
              field.value.type.fixed_length,
            };
            array_lengths.push_back(tmp_array_length);
            GenStructPackDecl_ObjectAPI(*field.value.type.struct_def,
                                        array_lengths, code);
          }
          break;
        }
        case BASE_TYPE_STRING: {
          code += "    int _" + field_name + " = _o." + get_field +
                  "() == null ? 0 : "
                  "builder.createString(_o." +
                  get_field + "());\n";
          break;
        }
        case BASE_TYPE_VECTOR: {
          if (field_has_create.find(&field) != field_has_create.end()) {
            auto property_name = field_name;
            auto gen_for_loop = true;
            std::string array_name = "__" + field_name;
            std::string array_type = "";
            std::string element_type = "";
            std::string to_array = "";
            switch (field.value.type.element) {
              case BASE_TYPE_STRING: {
                array_type = "int";
                element_type = "String";
                to_array = "builder.createString(_e)";
                break;
              }
              case BASE_TYPE_STRUCT:
                array_type = "int";
                element_type =
                    GenTypeGet_ObjectAPI(field.value.type, true, true);
                ;
                to_array = GenTypeGet(field.value.type) + ".pack(builder, _e)";
                break;
              case BASE_TYPE_UTYPE:
                property_name = field_name.substr(0, field_name.size() - 4);
                array_type = GenTypeBasic(DestinationType(
                    field.value.type.enum_def->underlying_type, false));
                element_type = field.value.type.enum_def->name + "Union";
                to_array = "_o." + namer_.Method("get", property_name) +
                           "()[_j].getType()";
                break;
              case BASE_TYPE_UNION:
                array_type = "int";
                element_type =
                    namer_.NamespacedType(*field.value.type.enum_def) + "Union";
                to_array = element_type + ".pack(builder,  _o." +
                           namer_.Method("get", property_name) + "()[_j])";
                break;
              case BASE_TYPE_UCHAR:  // TODO this branch of the switch is due to
                                     // inconsistent behavior in unsigned byte.
                                     // Read further at Issue #6574.
                array_type = "byte";
                element_type = "int";
                to_array = "(byte) _e";
                break;
              default:
                gen_for_loop = false;
                array_name = "_o." + namer_.Method("get", property_name) + "()";
                array_type = GenTypeNameDest(field.value.type);
                element_type = array_type;
                to_array = "_e";
                break;
            }
            code += "    int _" + field_name + " = 0;\n";
            code += "    if (_o." + namer_.Method("get", property_name) +
                    "() != null) {\n";
            if (gen_for_loop) {
              code += "      " + array_type + "[] " + array_name + " = new " +
                      array_type + "[_o." +
                      namer_.Method("get", property_name) + "().length];\n";
              code += "      int _j = 0;\n";
              code += "      for (" + element_type + " _e : _o." +
                      namer_.Method("get", property_name) + "()) { ";
              code += array_name + "[_j] = " + to_array + "; _j++;}\n";
            }
            code += "      _" + field_name + " = " +
                    namer_.Method("create", field) + "Vector(builder, " +
                    array_name + ");\n";
            code += "    }\n";
          } else {
            auto type_name = GenTypeGet(field.value.type);
            auto element_type_name =
                GenTypeGet_ObjectAPI(field.value.type, true, true);
            auto pack_method =
                field.value.type.struct_def == nullptr
                    ? "builder.add" + GenMethod(field.value.type.VectorType()) +
                          "(" + variable + "[_j]);"
                    : "_unused_offset = " + type_name + ".pack(builder, " +
                          variable + "[_j]);";
            code += "    int _" + field_name + " = 0;\n";
            code += "    " + element_type_name + "[] " + variable + " = _o." +
                    get_field + "();\n";
            code += "    if (" + variable + " != null) {\n";
            if (field.value.type.struct_def != nullptr) {
              code += "      int _unused_offset = 0;\n";
            }
            code += "      " + namer_.Method("start", field) +
                    "Vector(builder, " + variable + ".length);\n";
            code += "      for (int _j = " + variable +
                    ".length - 1; _j >=0; _j--) { ";
            code += pack_method + "}\n";
            code += "      _" + field_name + " = builder.endVector();\n";
            code += "    }\n";
          }
          break;
        }
        case BASE_TYPE_ARRAY: {
          if (field.value.type.struct_def != nullptr) {
            std::vector<FieldArrayLength> array_lengths;
            FieldArrayLength tmp_array_length = {
              field.name,
              field.value.type.fixed_length,
            };
            array_lengths.push_back(tmp_array_length);
            GenStructPackDecl_ObjectAPI(*field.value.type.struct_def,
                                        array_lengths, code);
          } else {
            code += "    " +
                    GenTypeGet_ObjectAPI(field.value.type, false, true) + " _" +
                    field_name + " = _o." + get_field + "();\n";
          }
          break;
        }
        case BASE_TYPE_UNION: {
          code += "    " +
                  GenTypeBasic(DestinationType(
                      field.value.type.enum_def->underlying_type, false)) +
                  " _" + field_name + "Type = _o." + get_field +
                  "() == null ? " +
                  namer_.NamespacedType(*field.value.type.enum_def) +
                  ".NONE : " + "_o." + get_field + "().getType();\n";
          code += "    " + GenOffsetType() + " _" + field_name + " = _o." +
                  get_field + "() == null ? 0 : " +
                  namer_.NamespacedType(*field.value.type.enum_def) +
                  "Union.pack(builder, _o." + get_field + "());\n";
          break;
        }
        default: break;
      }
    }
    if (struct_has_create) {
      // Create
      code += "    return " +
              namer_.LegacyJavaMethod2("create", struct_def, "") + "(\n";
      code += "      builder";
      for (auto it = struct_def.fields.vec.begin();
           it != struct_def.fields.vec.end(); ++it) {
        auto &field = **it;
        if (field.deprecated) continue;
        const auto field_name = namer_.Field(field);
        const auto get_field = namer_.Method("get", field);
        switch (field.value.type.base_type) {
          case BASE_TYPE_STRUCT: {
            if (struct_def.fixed) {
              GenStructPackCall_ObjectAPI(*field.value.type.struct_def, code,
                                          "      _" + field_name + "_");
            } else {
              code += ",\n";
              if (field.value.type.struct_def->fixed) {
                if (opts.generate_object_based_api)
                  code += "      _o." + field_name;
                else
                  // Seems like unreachable code
                  code += "      " + GenTypeGet(field.value.type) +
                          ".Pack(builder, _o." + field_name + ")";
              } else {
                code += "      _" + field_name;
              }
            }
            break;
          }
          case BASE_TYPE_ARRAY: {
            if (field.value.type.struct_def != nullptr) {
              GenStructPackCall_ObjectAPI(*field.value.type.struct_def, code,
                                          "      _" + field_name + "_");
            } else {
              code += ",\n";
              code += "      _" + field_name;
            }
            break;
          }
          case BASE_TYPE_UNION: FLATBUFFERS_FALLTHROUGH();   // fall thru
          case BASE_TYPE_UTYPE: FLATBUFFERS_FALLTHROUGH();   // fall thru
          case BASE_TYPE_STRING: FLATBUFFERS_FALLTHROUGH();  // fall thru
          case BASE_TYPE_VECTOR: {
            code += ",\n";
            code += "      _" + field_name;
            break;
          }
          default:  // scalar
            code += ",\n";
            code += "      _o." + get_field + "()";
            break;
        }
      }
      code += ");\n";
    } else {
      // Start, End
      code += "    " + namer_.LegacyJavaMethod2("start", struct_def, "") +
              "(builder);\n";
      for (auto it = struct_def.fields.vec.begin();
           it != struct_def.fields.vec.end(); ++it) {
        auto &field = **it;
        if (field.deprecated) continue;
        const auto arg = "_" + namer_.Variable(field);
        const auto get_field = namer_.Method("get", field);
        const auto add_field = namer_.Method("add", field);

        switch (field.value.type.base_type) {
          case BASE_TYPE_STRUCT: {
            if (field.value.type.struct_def->fixed) {
              code += "    " + add_field + "(builder, " +
                      GenTypeGet(field.value.type) + ".pack(builder, _o." +
                      get_field + "()));\n";
            } else {
              code += "    " + add_field + "(builder, " + arg + ");\n";
            }
            break;
          }
          case BASE_TYPE_STRING: FLATBUFFERS_FALLTHROUGH();  // fall thru
          case BASE_TYPE_ARRAY: FLATBUFFERS_FALLTHROUGH();   // fall thru
          case BASE_TYPE_VECTOR: {
            code += "    " + add_field + "(builder, " + arg + ");\n";
            break;
          }
          case BASE_TYPE_UTYPE: break;
          case BASE_TYPE_UNION: {
            code += "    " + add_field + "Type(builder, " + arg + "Type);\n";
            code += "    " + add_field + "(builder, " + arg + ");\n";
            break;
          }
          // scalar
          default: {
            if (field.IsScalarOptional()) {
              code += "    if (_o." + get_field + "() != null) { " + add_field +
                      "(builder, _o." + get_field + "()); }\n";
            } else {
              code +=
                  "    " + add_field + "(builder, _o." + get_field + "());\n";
            }
            break;
          }
        }
      }
      code += "    return " + namer_.LegacyJavaMethod2("end", struct_def, "") +
              "(builder);\n";
    }
    code += "  }\n";
  }

  void GenStructPackDecl_ObjectAPI(const StructDef &struct_def,
                                   std::vector<FieldArrayLength> &array_lengths,
                                   std::string &code) const {
    for (auto it = struct_def.fields.vec.begin();
         it != struct_def.fields.vec.end(); ++it) {
      const FieldDef &field = **it;
      const bool is_array = IsArray(field.value.type);
      const Type &field_type =
          is_array ? field.value.type.VectorType() : field.value.type;
      FieldArrayLength tmp_array_length = {
        field.name,
        field_type.fixed_length,
      };
      array_lengths.push_back(tmp_array_length);
      if (field_type.struct_def != nullptr) {
        GenStructPackDecl_ObjectAPI(*field_type.struct_def, array_lengths,
                                    code);
      } else {
        std::vector<FieldArrayLength> array_only_lengths;
        for (size_t i = 0; i < array_lengths.size(); ++i) {
          if (array_lengths[i].length > 0) {
            array_only_lengths.push_back(array_lengths[i]);
          }
        }
        std::string name;
        for (size_t i = 0; i < array_lengths.size(); ++i) {
          name += "_" + namer_.Variable(array_lengths[i].name);
        }
        code += "    " + GenTypeBasic(field_type);
        if (array_only_lengths.size() > 0) {
          for (size_t i = 0; i < array_only_lengths.size(); ++i) {
            code += "[]";
          }
          code += " " + name + " = ";
          code += "new " + GenTypeBasic(field_type) + "[";
          for (size_t i = 0; i < array_only_lengths.size(); ++i) {
            if (i != 0) { code += "]["; }
            code += NumToString(array_only_lengths[i].length);
          }
          code += "];\n";
          code += "    ";
          // initialize array
          for (size_t i = 0; i < array_only_lengths.size(); ++i) {
            auto idx = "idx" + NumToString(i);
            code += "for (int " + idx + " = 0; " + idx + " < " +
                    NumToString(array_only_lengths[i].length) + "; ++" + idx +
                    ") {";
          }
          for (size_t i = 0; i < array_only_lengths.size(); ++i) {
            auto idx = "idx" + NumToString(i);
            if (i == 0) {
              code += name + "[" + idx;
            } else {
              code += "][" + idx;
            }
          }
          code += "] = _o";
          for (size_t i = 0, j = 0; i < array_lengths.size(); ++i) {
            code += "." + namer_.Method("get", array_lengths[i].name) + "()";
            if (array_lengths[i].length <= 0) continue;
            code += "[idx" + NumToString(j++) + "]";
          }
          code += ";";
          for (size_t i = 0; i < array_only_lengths.size(); ++i) {
            code += "}";
          }
        } else {
          code += " " + name + " = ";
          code += SourceCast(field_type);
          code += "_o";
          for (size_t i = 0; i < array_lengths.size(); ++i) {
            code += "." + namer_.Method("get", array_lengths[i].name) + "()";
          }
          code += ";";
        }
        code += "\n";
      }
      array_lengths.pop_back();
    }
  }

  void GenStructPackCall_ObjectAPI(const StructDef &struct_def,
                                   std::string &code,
                                   std::string prefix) const {
    for (auto it = struct_def.fields.vec.begin();
         it != struct_def.fields.vec.end(); ++it) {
      auto &field = **it;
      const auto &field_type = field.value.type;
      if (field_type.struct_def != nullptr) {
        GenStructPackCall_ObjectAPI(*field_type.struct_def, code,
                                    prefix + namer_.Field(field) + "_");
      } else {
        code += ",\n";
        code += prefix + namer_.Field(field);
      }
    }
  }

  std::string ConvertPrimitiveTypeToObjectWrapper_ObjectAPI(
      const std::string &type_name) const {
    if (type_name == "boolean")
      return "Boolean";
    else if (type_name == "byte")
      return "Byte";
    else if (type_name == "char")
      return "Character";
    else if (type_name == "short")
      return "Short";
    else if (type_name == "int")
      return "Integer";
    else if (type_name == "long")
      return "Long";
    else if (type_name == "float")
      return "Float";
    else if (type_name == "double")
      return "Double";
    return type_name;
  }

  std::string GenTypeGet_ObjectAPI(const flatbuffers::Type &type,
                                   bool vectorelem,
                                   bool wrap_in_namespace) const {
    auto type_name = GenTypeNameDest(type);
    // Replace to ObjectBaseAPI Type Name
    switch (type.base_type) {
      case BASE_TYPE_STRUCT: FLATBUFFERS_FALLTHROUGH();  // fall thru
      case BASE_TYPE_ARRAY: FLATBUFFERS_FALLTHROUGH();   // fall thru
      case BASE_TYPE_VECTOR: {
        if (type.struct_def != nullptr) {
          auto type_name_length = type.struct_def->name.length();
          auto new_type_name = namer_.ObjectType(*type.struct_def);
          type_name.replace(type_name.length() - type_name_length,
                            type_name_length, new_type_name);
        } else if (type.element == BASE_TYPE_UNION) {
          if (wrap_in_namespace) {
            type_name = namer_.NamespacedType(*type.enum_def) + "Union";
          } else {
            type_name = namer_.Type(*type.enum_def) + "Union";
          }
        }
        break;
      }

      case BASE_TYPE_UNION: {
        if (wrap_in_namespace) {
          type_name = namer_.NamespacedType(*type.enum_def) + "Union";
        } else {
          type_name = namer_.Type(*type.enum_def) + "Union";
        }
        break;
      }
      default: break;
    }
    if (vectorelem) { return type_name; }
    switch (type.base_type) {
      case BASE_TYPE_ARRAY: FLATBUFFERS_FALLTHROUGH();  // fall thru
      case BASE_TYPE_VECTOR: {
        type_name = type_name + "[]";
        break;
      }
      default: break;
    }
    return type_name;
  }

  std::string GenConcreteTypeGet_ObjectAPI(
      const flatbuffers::Type &type) const {
    auto type_name = GenTypeNameDest(type);
    // Replace to ObjectBaseAPI Type Name
    switch (type.base_type) {
      case BASE_TYPE_STRUCT: FLATBUFFERS_FALLTHROUGH();  // fall thru
      case BASE_TYPE_ARRAY: FLATBUFFERS_FALLTHROUGH();   // fall thru
      case BASE_TYPE_VECTOR: {
        if (type.struct_def != nullptr) {
          auto type_name_length = type.struct_def->name.length();
          auto new_type_name = namer_.ObjectType(*type.struct_def);
          type_name.replace(type_name.length() - type_name_length,
                            type_name_length, new_type_name);
        } else if (type.element == BASE_TYPE_UNION) {
          type_name = namer_.NamespacedType(*type.enum_def) + "Union";
        }
        break;
      }

      case BASE_TYPE_UNION: {
        type_name = namer_.NamespacedType(*type.enum_def) + "Union";
        break;
      }
      default: break;
    }

    switch (type.base_type) {
      case BASE_TYPE_ARRAY: FLATBUFFERS_FALLTHROUGH();  // fall thru
      case BASE_TYPE_VECTOR: {
        type_name = type_name + "[]";
        break;
      }
      default: break;
    }
    return type_name;
  }

  void GenStruct_ObjectAPI(const StructDef &struct_def,
                           std::string &code) const {
    if (struct_def.generated) return;
    if (struct_def.attributes.Lookup("private")) {
      // For Java, we leave the enum unmarked to indicate package-private
    } else {
      code += "public ";
    }

    const auto class_name = namer_.ObjectType(struct_def);
    code += "class " + class_name;
    code += " {\n";
    // Generate Properties
    for (auto it = struct_def.fields.vec.begin();
         it != struct_def.fields.vec.end(); ++it) {
      const auto &field = **it;
      if (field.deprecated) continue;
      if (field.value.type.base_type == BASE_TYPE_UTYPE) continue;
      if (field.value.type.element == BASE_TYPE_UTYPE) continue;
      auto type_name = GenTypeGet_ObjectAPI(field.value.type, false, true);
      if (field.IsScalarOptional())
        type_name = ConvertPrimitiveTypeToObjectWrapper_ObjectAPI(type_name);
      const auto field_name = namer_.Field(field);
      code += "  private " + type_name + " " + field_name + ";\n";
    }
    // Generate Java getters and setters
    code += "\n";
    for (auto it = struct_def.fields.vec.begin();
         it != struct_def.fields.vec.end(); ++it) {
      const auto &field = **it;
      if (field.deprecated) continue;
      if (field.value.type.base_type == BASE_TYPE_UTYPE) continue;
      if (field.value.type.element == BASE_TYPE_UTYPE) continue;
      const auto field_name = namer_.Field(field);
      const auto get_field = namer_.Method("get", field);
      auto type_name = GenTypeGet_ObjectAPI(field.value.type, false, true);
      if (field.IsScalarOptional())
        type_name = ConvertPrimitiveTypeToObjectWrapper_ObjectAPI(type_name);

      code += "  public " + type_name + " " + get_field + "() { return " +
              field_name + "; }\n\n";
      std::string array_validation = "";
      if (field.value.type.base_type == BASE_TYPE_ARRAY) {
        array_validation =
            "if (" + field_name + " != null && " + field_name +
            ".length == " + NumToString(field.value.type.fixed_length) + ") ";
      }
      code += "  public void " + namer_.Method("set", field) + "(" + type_name +
              " " + field_name + ") { " + array_validation + "this." +
              field_name + " = " + field_name + "; }\n\n";
    }
    // Generate Constructor
    code += "\n";
    code += "  public " + class_name + "() {\n";
    for (auto it = struct_def.fields.vec.begin();
         it != struct_def.fields.vec.end(); ++it) {
      const auto &field = **it;
      if (field.deprecated) continue;
      if (field.value.type.base_type == BASE_TYPE_UTYPE) continue;
      if (field.value.type.element == BASE_TYPE_UTYPE) continue;
      const auto get_field = namer_.Method("get", field);

      code += "    this." + namer_.Field(field) + " = ";
      const auto type_name =
          GenTypeGet_ObjectAPI(field.value.type, false, true);
      if (IsScalar(field.value.type.base_type)) {
        if (field.IsScalarOptional()) {
          code += "null;\n";
        } else {
          code += GenDefaultValue(field) + ";\n";
        }
      } else {
        switch (field.value.type.base_type) {
          case BASE_TYPE_STRUCT: {
            if (IsStruct(field.value.type)) {
              code += "new " + type_name + "();\n";
            } else {
              code += "null;\n";
            }
            break;
          }
          case BASE_TYPE_ARRAY: {
            code += "new " + type_name.substr(0, type_name.length() - 1) +
                    NumToString(field.value.type.fixed_length) + "];\n";
            break;
          }
          default: {
            code += "null;\n";
            break;
          }
        }
      }
    }
    code += "  }\n";
    if (parser_.root_struct_def_ == &struct_def) {
      const std::string struct_type = namer_.Type(struct_def);
      code += "  public static " + class_name +
              " deserializeFromBinary(byte[] fbBuffer) {\n";
      code += "    return " + struct_type + "." +
              namer_.LegacyJavaMethod2("getRootAs", struct_def, "") +
              "(ByteBuffer.wrap(fbBuffer)).unpack();\n";
      code += "  }\n";
      code += "  public byte[] serializeToBinary() {\n";
      code += "    FlatBufferBuilder fbb = new FlatBufferBuilder();\n";
      code += "    " + struct_type + "." +
              namer_.LegacyJavaMethod2("finish", struct_def, "Buffer") +
              "(fbb, " + struct_type + ".pack(fbb, this));\n";
      code += "    return fbb.sizedByteArray();\n";
      code += "  }\n";
    }
    code += "}\n\n";
  }

  // This tracks the current namespace used to determine if a type need to be
  // prefixed by its namespace
  const Namespace *cur_name_space_;
  const IdlNamer namer_;
};
}  // namespace java

bool GenerateJava(const Parser &parser, const std::string &path,
                  const std::string &file_name) {
  java::JavaGenerator generator(parser, path, file_name);
  return generator.generate();
}

}  // namespace flatbuffers
