Skip to content

Commit bd70298

Browse files
committed
Fixed #68
1 parent 44ebb50 commit bd70298

File tree

11 files changed

+340
-179
lines changed

11 files changed

+340
-179
lines changed

protobuf/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ abstractions.
2727
<dependency>
2828
<groupId>com.squareup</groupId>
2929
<artifactId>protoparser</artifactId>
30-
<version>4.0.0</version>
30+
<version>4.0.3</version>
3131
</dependency>
3232

3333
<!-- Hmmh. Need databind for schema generation, convenience ProtobufMapper.

protobuf/src/main/java/com/fasterxml/jackson/dataformat/protobuf/schema/NativeProtobufSchema.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class NativeProtobufSchema
1616
protected final Collection<TypeElement> _nativeTypes;
1717

1818
protected volatile String[] _messageNames;
19-
19+
2020
protected NativeProtobufSchema(ProtoFile input)
2121
{
2222
this(input.filePath(), input.typeElements());

protobuf/src/main/java/com/fasterxml/jackson/dataformat/protobuf/schema/ProtobufSchema.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ public class ProtobufSchema implements FormatSchema
2020
* in which case this would be `null`.
2121
*/
2222
protected final NativeProtobufSchema _source;
23-
23+
2424
protected final ProtobufMessage _rootType;
25-
25+
2626
/*
27-
/**********************************************************
27+
/************************************************************
2828
/* Construction
29-
/**********************************************************
29+
/************************************************************
3030
*/
3131

3232
public ProtobufSchema(NativeProtobufSchema src, ProtobufMessage rootType) {
@@ -95,4 +95,15 @@ public List<String> getMessageTypes() {
9595
public String getSchemaType() {
9696
return FORMAT_NAME_PROTOBUF;
9797
}
98+
99+
/*
100+
/**********************************************************
101+
/* API
102+
/**********************************************************
103+
*/
104+
105+
@Override
106+
public String toString() {
107+
return String.valueOf(_source);
108+
}
98109
}

protobuf/src/main/java/com/fasterxml/jackson/dataformat/protobuf/schemagen/MessageElementVisitor.java

Lines changed: 47 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
package com.fasterxml.jackson.dataformat.protobuf.schemagen;
22

3-
import java.util.Arrays;
43
import java.util.HashSet;
54
import 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.*;
117
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitable;
128
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonObjectFormatVisitor;
9+
1310
import com.squareup.protoparser.DataType;
1411
import com.squareup.protoparser.DataType.NamedType;
1512
import com.squareup.protoparser.DataType.ScalarType;
@@ -18,7 +15,8 @@
1815
import com.squareup.protoparser.MessageElement;
1916
import 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

Comments
 (0)