@@ -89,11 +89,21 @@ class JavaGenerator : public BaseGenerator {
8989
9090 public:
9191 JavaGenerator (const Parser &parser, const std::string &path,
92- const std::string &file_name)
92+ const std::string &file_name,
93+ const std::string &package_prefix)
9394 : BaseGenerator(parser, path, file_name, " " , " ." , " java" ),
94- cur_name_space_ (nullptr ),
95+ cur_name_space_ (nullptr ),
9596 namer_(WithFlagOptions(JavaDefaultConfig(), parser.opts, path),
96- JavaKeywords()) {}
97+ JavaKeywords()) {
98+ if (!package_prefix.empty ()) {
99+ std::istringstream iss (package_prefix);
100+ std::string component;
101+ while (std::getline (iss, component, ' .' )) {
102+ package_prefix_ns_.components .push_back (component);
103+ }
104+ package_prefix_ = package_prefix_ns_.GetFullyQualifiedName (" " ) + " ." ;
105+ }
106+ }
97107
98108 JavaGenerator &operator =(const JavaGenerator &);
99109 bool generate () {
@@ -173,7 +183,13 @@ class JavaGenerator : public BaseGenerator {
173183 std::string code;
174184 code = " // " + std::string (FlatBuffersGeneratedWarning ()) + " \n\n " ;
175185
176- const std::string namespace_name = FullNamespace (" ." , ns);
186+ Namespace combined_ns = package_prefix_ns_;
187+ std::copy (
188+ ns.components .begin (),
189+ ns.components .end (),
190+ std::back_inserter (combined_ns.components ));
191+
192+ const std::string namespace_name = FullNamespace (" ." , combined_ns);
177193 if (!namespace_name.empty ()) {
178194 code += " package " + namespace_name + " ;" ;
179195 code += " \n\n " ;
@@ -207,7 +223,7 @@ class JavaGenerator : public BaseGenerator {
207223
208224 code += classcode;
209225 if (!namespace_name.empty ()) code += " " ;
210- const std::string dirs = namer_.Directories (ns );
226+ const std::string dirs = namer_.Directories (combined_ns );
211227 EnsureDirExists (dirs);
212228 const std::string filename =
213229 dirs + namer_.File (defname, /* skips=*/ SkipFile::Suffix);
@@ -247,7 +263,8 @@ class JavaGenerator : public BaseGenerator {
247263 switch (type.base_type ) {
248264 case BASE_TYPE_STRING: return " String" ;
249265 case BASE_TYPE_VECTOR: return GenTypeGet (type.VectorType ());
250- case BASE_TYPE_STRUCT: return namer_.NamespacedType (*type.struct_def );
266+ case BASE_TYPE_STRUCT:
267+ return Prefixed (namer_.NamespacedType (*type.struct_def ));
251268 case BASE_TYPE_UNION: FLATBUFFERS_FALLTHROUGH (); // else fall thru
252269 default : return " Table" ;
253270 }
@@ -351,8 +368,9 @@ class JavaGenerator : public BaseGenerator {
351368 FLATBUFFERS_ASSERT (value.type .enum_def );
352369 auto &enum_def = *value.type .enum_def ;
353370 auto enum_val = enum_def.FindByValue (value.constant );
354- return enum_val ? namer_.NamespacedEnumVariant (enum_def, *enum_val)
355- : value.constant ;
371+ return
372+ enum_val ? Prefixed (namer_.NamespacedEnumVariant (enum_def, *enum_val))
373+ : value.constant ;
356374 }
357375
358376 std::string GenDefaultValue (const FieldDef &field) const {
@@ -879,7 +897,7 @@ class JavaGenerator : public BaseGenerator {
879897 for (auto kit = fields.begin (); kit != fields.end (); ++kit) {
880898 auto &key_field = **kit;
881899 if (key_field.key ) {
882- auto qualified_name = namer_.NamespacedType (sd);
900+ auto qualified_name = Prefixed ( namer_.NamespacedType (sd) );
883901 code += " public " + qualified_name + " " ;
884902 code += namer_.Method (field) + " ByKey(" ;
885903 code += GenTypeNameDest (key_field.value .type ) + " key)" ;
@@ -957,7 +975,8 @@ class JavaGenerator : public BaseGenerator {
957975 }
958976 // generate object accessors if is nested_flatbuffer
959977 if (field.nested_flatbuffer ) {
960- auto nested_type_name = namer_.NamespacedType (*field.nested_flatbuffer );
978+ auto nested_type_name =
979+ Prefixed (namer_.NamespacedType (*field.nested_flatbuffer ));
961980 auto nested_method_name =
962981 namer_.Field (field) + " As" + field.nested_flatbuffer ->name ;
963982 auto get_nested_method_name = nested_method_name;
@@ -1437,7 +1456,7 @@ class JavaGenerator : public BaseGenerator {
14371456 // deleted when issue #6561 is fixed.
14381457 }
14391458 code += indent + " case " +
1440- namer_.NamespacedEnumVariant (enum_def, ev) + " :\n " ;
1459+ Prefixed ( namer_.NamespacedEnumVariant (enum_def, ev) ) + " :\n " ;
14411460 auto actual_type = GenTypeGet (ev.union_type );
14421461 code += indent + " " + variable_name + " Value = " + field_name +
14431462 " (new " + actual_type + " ()" + value_params + " );\n " ;
@@ -1635,7 +1654,8 @@ class JavaGenerator : public BaseGenerator {
16351654 case BASE_TYPE_UNION:
16361655 array_type = " int" ;
16371656 element_type =
1638- namer_.NamespacedType (*field.value .type .enum_def ) + " Union" ;
1657+ Prefixed (namer_.NamespacedType (*field.value .type .enum_def ))
1658+ + " Union" ;
16391659 to_array = element_type + " .pack(builder, _o." +
16401660 namer_.Method (" get" , property_name) + " ()[_j])" ;
16411661 break ;
@@ -1720,11 +1740,11 @@ class JavaGenerator : public BaseGenerator {
17201740 field.value .type .enum_def ->underlying_type , false )) +
17211741 " _" + field_name + " Type = _o." + get_field +
17221742 " () == null ? " +
1723- namer_.NamespacedType (*field.value .type .enum_def ) +
1743+ Prefixed ( namer_.NamespacedType (*field.value .type .enum_def ) ) +
17241744 " .NONE : " + " _o." + get_field + " ().getType();\n " ;
17251745 code += " " + GenOffsetType () + " _" + field_name + " = _o." +
17261746 get_field + " () == null ? 0 : " +
1727- namer_.NamespacedType (*field.value .type .enum_def ) +
1747+ Prefixed ( namer_.NamespacedType (*field.value .type .enum_def ) ) +
17281748 " Union.pack(builder, _o." + get_field + " ());\n " ;
17291749 break ;
17301750 }
@@ -1976,7 +1996,8 @@ class JavaGenerator : public BaseGenerator {
19761996 type_name_length, new_type_name);
19771997 } else if (type.element == BASE_TYPE_UNION) {
19781998 if (wrap_in_namespace) {
1979- type_name = namer_.NamespacedType (*type.enum_def ) + " Union" ;
1999+ type_name =
2000+ Prefixed (namer_.NamespacedType (*type.enum_def )) + " Union" ;
19802001 } else {
19812002 type_name = namer_.Type (*type.enum_def ) + " Union" ;
19822003 }
@@ -1986,7 +2007,8 @@ class JavaGenerator : public BaseGenerator {
19862007
19872008 case BASE_TYPE_UNION: {
19882009 if (wrap_in_namespace) {
1989- type_name = namer_.NamespacedType (*type.enum_def ) + " Union" ;
2010+ type_name =
2011+ Prefixed (namer_.NamespacedType (*type.enum_def )) + " Union" ;
19902012 } else {
19912013 type_name = namer_.Type (*type.enum_def ) + " Union" ;
19922014 }
@@ -2020,13 +2042,15 @@ class JavaGenerator : public BaseGenerator {
20202042 type_name.replace (type_name.length () - type_name_length,
20212043 type_name_length, new_type_name);
20222044 } else if (type.element == BASE_TYPE_UNION) {
2023- type_name = namer_.NamespacedType (*type.enum_def ) + " Union" ;
2045+ type_name =
2046+ Prefixed (namer_.NamespacedType (*type.enum_def )) + " Union" ;
20242047 }
20252048 break ;
20262049 }
20272050
20282051 case BASE_TYPE_UNION: {
2029- type_name = namer_.NamespacedType (*type.enum_def ) + " Union" ;
2052+ type_name =
2053+ Prefixed (namer_.NamespacedType (*type.enum_def )) + " Union" ;
20302054 break ;
20312055 }
20322056 default : break ;
@@ -2160,12 +2184,22 @@ class JavaGenerator : public BaseGenerator {
21602184 // prefixed by its namespace
21612185 const Namespace *cur_name_space_;
21622186 const IdlNamer namer_;
2187+
2188+ private:
2189+ std::string Prefixed (const std::string &str) const {
2190+ return package_prefix_ + str;
2191+ }
2192+
2193+ std::string package_prefix_;
2194+ Namespace package_prefix_ns_;
2195+
21632196};
21642197} // namespace java
21652198
21662199bool GenerateJava (const Parser &parser, const std::string &path,
21672200 const std::string &file_name) {
2168- java::JavaGenerator generator (parser, path, file_name);
2201+ java::JavaGenerator generator (parser, path, file_name,
2202+ parser.opts .java_package_prefix );
21692203 return generator.generate ();
21702204}
21712205
0 commit comments