11package com .fasterxml .jackson .dataformat .protobuf .schemagen ;
22
3- import java .util .Arrays ;
43import java .util .HashSet ;
54import java .util .Set ;
65
7- import com .fasterxml .jackson .databind .BeanProperty ;
8- import com .fasterxml .jackson .databind .JavaType ;
9- import com .fasterxml .jackson .databind .JsonMappingException ;
10- import com .fasterxml .jackson .databind .SerializerProvider ;
6+ import com .fasterxml .jackson .databind .*;
117import com .fasterxml .jackson .databind .jsonFormatVisitors .JsonFormatVisitable ;
128import com .fasterxml .jackson .databind .jsonFormatVisitors .JsonObjectFormatVisitor ;
9+
1310import com .squareup .protoparser .DataType ;
1411import com .squareup .protoparser .DataType .NamedType ;
1512import com .squareup .protoparser .DataType .ScalarType ;
1815import com .squareup .protoparser .MessageElement ;
1916import com .squareup .protoparser .TypeElement ;
2017
21- public class MessageElementVisitor extends JsonObjectFormatVisitor .Base implements TypeElementBuilder
18+ public class MessageElementVisitor extends JsonObjectFormatVisitor .Base
19+ implements TypeElementBuilder
2220{
2321 protected MessageElement .Builder _builder ;
2422
@@ -34,11 +32,8 @@ public MessageElementVisitor(SerializerProvider provider, JavaType type,
3432 DefinedTypeElementBuilders definedTypeElementBuilders , boolean isNested )
3533 {
3634 super (provider );
37-
3835 _definedTypeElementBuilders = definedTypeElementBuilders ;
39-
4036 _type = type ;
41-
4237 _builder = MessageElement .builder ();
4338 _builder .name (type .getRawClass ().getSimpleName ());
4439 _builder .documentation ("Message for " + type .toCanonical ());
@@ -79,8 +74,13 @@ protected FieldElement buildFieldElement(BeanProperty writer, Label label) throw
7974 JavaType type = writer .getType ();
8075
8176 if (type .isArrayType () || type .isCollectionLikeType ()) {
82- fBuilder .label (Label .REPEATED );
83- fBuilder .type (getDataType (type .getContentType ()));
77+ if (ProtobufSchemaHelper .isBinaryType (type )) {
78+ fBuilder .label (label );
79+ fBuilder .type (ScalarType .BYTES );
80+ } else {
81+ fBuilder .label (Label .REPEATED );
82+ fBuilder .type (getDataType (type .getContentType ()));
83+ }
8484 } else {
8585 fBuilder .label (label );
8686 fBuilder .type (getDataType (type ));
@@ -103,25 +103,49 @@ protected void getTagGenerator(BeanProperty writer) {
103103 }
104104 }
105105
106- protected DataType getDataType (JavaType type ) throws JsonMappingException {
107- ScalarType sType = ProtobufSchemaHelper .getScalarType (type );
108- if (sType != null ) { // Is scalar type ref
109- return sType ;
110- }
111-
106+ protected DataType getDataType (JavaType type ) throws JsonMappingException
107+ {
112108 if (!_definedTypeElementBuilders .containsBuilderFor (type )) { // No self ref
113- if (Arrays . asList ( _type . getRawClass (). getDeclaredClasses ()). contains ( type . getRawClass ())) { // nested
109+ if (isNested ( type )) {
114110 if (!_nestedTypes .contains (type )) { // create nested type
115111 _nestedTypes .add (type );
116- TypeElementBuilder nestedTypeBuilder = ProtobufSchemaHelper . acceptTypeElement (_provider , type ,
112+ ProtoBufSchemaVisitor builder = acceptTypeElement (_provider , type ,
117113 _definedTypeElementBuilders , true );
118-
119- _builder .addType (nestedTypeBuilder .build ());
114+ DataType scalarType = builder .getSimpleType ();
115+ if (scalarType != null ){
116+ return scalarType ;
117+ }
118+ _builder .addType (builder .build ());
119+ }
120+ } else { // track non-nested types to generate them later
121+ ProtoBufSchemaVisitor builder = acceptTypeElement (_provider , type ,
122+ _definedTypeElementBuilders , false );
123+ DataType scalarType = builder .getSimpleType ();
124+ if (scalarType != null ){
125+ return scalarType ;
120126 }
121- } else { // tracking non-nested types to generate them later
122- ProtobufSchemaHelper .acceptTypeElement (_provider , type , _definedTypeElementBuilders , false );
123127 }
124128 }
125129 return NamedType .create (type .getRawClass ().getSimpleName ());
126130 }
131+
132+ private ProtoBufSchemaVisitor acceptTypeElement (SerializerProvider provider , JavaType type ,
133+ DefinedTypeElementBuilders definedTypeElementBuilders , boolean isNested ) throws JsonMappingException
134+ {
135+ JsonSerializer <Object > serializer = provider .findValueSerializer (type , null );
136+ ProtoBufSchemaVisitor visitor = new ProtoBufSchemaVisitor (provider , definedTypeElementBuilders , isNested );
137+ serializer .acceptJsonFormatVisitor (visitor , type );
138+ return visitor ;
139+ }
140+
141+ private boolean isNested (JavaType type )
142+ {
143+ Class <?> match = type .getRawClass ();
144+ for (Class <?> cls : _type .getRawClass ().getDeclaredClasses ()) {
145+ if (cls == match ) {
146+ return true ;
147+ }
148+ }
149+ return false ;
150+ }
127151}
0 commit comments