Skip to content
This repository was archived by the owner on Jan 22, 2019. It is now read-only.

Commit e366dd2

Browse files
committed
Minor simplification of #11 implementation, update release notes
1 parent 1b7fe15 commit e366dd2

File tree

6 files changed

+148
-146
lines changed

6 files changed

+148
-146
lines changed

release-notes/CREDITS

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
Project: jackson-dataformat-protobuf
2+
3+
Here are people who have contributed to development of this project:
4+
(version numbers in parenthesis indicate release in which the problem was fixed)
5+
6+
Tatu Saloranta, [email protected]: author
7+
8+
Damiaan van der Kruk (dvdkruk@github)
9+
10+
* Contributed #11: Add Support for Generating Protobuf Schema From POJO Definition
11+
(2.7.0)

release-notes/VERSION

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ Project: jackson-dataformat-protobuf
66

77
2.7.0 (not yet released)
88

9+
#11: Add Support for Generating Protobuf Schema From POJO Definition
10+
(contributed by Damiaan K)
11+
912
2.6.2 (15-Sep-2015)
1013
2.6.1 (09-Aug-2015)
1114

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

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22

33
import com.fasterxml.jackson.databind.BeanProperty;
44

5-
public class AnnotationBasedTagGenerator implements TagGenerator {
6-
7-
@Override
8-
public int nextTag(BeanProperty writer) {
9-
if (ProtobuffSchemaHelper.hasIndexAnnotation(writer)) {
10-
return ProtobuffSchemaHelper.getJsonProperty(writer).index();
11-
}
12-
throw new IllegalStateException("No 'JsonProperty.index' annotation found for " + writer.getFullName()
13-
+ ", either annotate all properties of type " + writer.getWrapperName().getSimpleName() + " with indexes or none at all");
14-
}
15-
5+
public class AnnotationBasedTagGenerator implements TagGenerator
6+
{
7+
@Override
8+
public int nextTag(BeanProperty writer) {
9+
Integer ix = writer.getMetadata().getIndex();
10+
if (ix != null) {
11+
return ix.intValue();
12+
}
13+
throw new IllegalStateException("No index metadata found for " + writer.getFullName()
14+
+ " (usually annotated with @JsonProperty.index): either annotate all properties of type " + writer.getWrapperName().getSimpleName() + " with indexes or none at all");
15+
}
1616
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public DefaultTagGenerator(int startingTag) {
1616

1717
@Override
1818
public int nextTag(BeanProperty writer) {
19-
if (ProtobuffSchemaHelper.hasIndexAnnotation(writer)) {
19+
if (ProtobuffSchemaHelper.hasIndex(writer)) {
2020
throw new IllegalStateException(writer.getFullName()
2121
+ " is annotated with 'JsonProperty.index', however not all properties of type "
2222
+ writer.getWrapperName().getSimpleName()

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

Lines changed: 107 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -18,114 +18,111 @@
1818
import com.squareup.protoparser.MessageElement;
1919
import com.squareup.protoparser.TypeElement;
2020

21-
public class MessageElementVisitor extends JsonObjectFormatVisitor.Base implements TypeElementBuilder {
22-
23-
MessageElement.Builder _builder;
24-
25-
TagGenerator _tagGenerator;
26-
27-
JavaType _type;
28-
29-
Set<JavaType> _nestedTypes = new HashSet<>();
30-
31-
DefinedTypeElementBuilders _definedTypeElementBuilders;
32-
33-
public MessageElementVisitor(SerializerProvider provider, JavaType type,
34-
DefinedTypeElementBuilders definedTypeElementBuilders, boolean isNested) {
35-
super(provider);
36-
37-
_definedTypeElementBuilders = definedTypeElementBuilders;
38-
39-
_type = type;
40-
41-
_builder = MessageElement.builder();
42-
_builder.name(type.getRawClass().getSimpleName());
43-
_builder.documentation("Message for " + type.toCanonical());
44-
45-
_definedTypeElementBuilders.AddTypeElement(type, this, isNested);
46-
}
47-
48-
@Override
49-
public TypeElement build() {
50-
return _builder.build();
51-
}
52-
53-
@Override
54-
public void property(BeanProperty writer) throws JsonMappingException {
55-
FieldElement fElement = buildFieldElement(writer, Label.REQUIRED);
56-
_builder.addField(fElement);
57-
}
58-
59-
@Override
60-
public void property(String name, JsonFormatVisitable handler, JavaType propertyTypeHint) {
61-
}
62-
63-
@Override
64-
public void optionalProperty(BeanProperty writer) throws JsonMappingException {
65-
FieldElement fElement = buildFieldElement(writer, Label.OPTIONAL);
66-
_builder.addField(fElement);
67-
}
68-
69-
@Override
70-
public void optionalProperty(String name, JsonFormatVisitable handler, JavaType propertyTypeHint) {
71-
}
72-
73-
protected FieldElement buildFieldElement(BeanProperty writer, Label label) throws JsonMappingException {
74-
FieldElement.Builder fBuilder = FieldElement.builder();
75-
76-
fBuilder.name(writer.getName());
77-
78-
fBuilder.tag(nextTag(writer));
79-
80-
JavaType type = writer.getType();
81-
82-
if (type.isArrayType() || type.isCollectionLikeType()) {
83-
fBuilder.label(Label.REPEATED);
84-
fBuilder.type(getDataType(type.getContentType()));
85-
} else {
86-
fBuilder.label(label);
87-
fBuilder.type(getDataType(type));
88-
}
89-
return fBuilder.build();
90-
}
91-
92-
protected int nextTag(BeanProperty writer) {
93-
getTagGenerator(writer);
94-
return _tagGenerator.nextTag(writer);
95-
}
96-
97-
protected void getTagGenerator(BeanProperty writer) {
98-
if (_tagGenerator == null) {
99-
if (ProtobuffSchemaHelper.hasIndexAnnotation(writer)) {
100-
_tagGenerator = new AnnotationBasedTagGenerator();
101-
} else {
102-
_tagGenerator = new DefaultTagGenerator();
103-
}
104-
}
105-
}
106-
107-
protected DataType getDataType(JavaType type) throws JsonMappingException {
108-
ScalarType sType = ProtobuffSchemaHelper.getScalarType(type);
109-
if (sType != null) { // Is scalar type ref
110-
return sType;
111-
}
112-
113-
if (!_definedTypeElementBuilders.containsBuilderFor(type)) { // No self
114-
// ref
115-
if (Arrays.asList(_type.getRawClass().getDeclaredClasses()).contains(type.getRawClass())) { // nested
116-
// class
117-
if (!_nestedTypes.contains(type)) { // create nested type
118-
_nestedTypes.add(type);
119-
120-
TypeElementBuilder nestedTypeBuilder = ProtobuffSchemaHelper.acceptTypeElement(_provider, type,
121-
_definedTypeElementBuilders, true);
122-
123-
_builder.addType(nestedTypeBuilder.build());
124-
}
125-
} else { // tracking non-nested types to generate them later
126-
ProtobuffSchemaHelper.acceptTypeElement(_provider, type, _definedTypeElementBuilders, false);
127-
}
128-
}
129-
return NamedType.create(type.getRawClass().getSimpleName());
130-
}
21+
public class MessageElementVisitor extends JsonObjectFormatVisitor.Base implements TypeElementBuilder
22+
{
23+
protected MessageElement.Builder _builder;
24+
25+
protected TagGenerator _tagGenerator;
26+
27+
protected JavaType _type;
28+
29+
protected Set<JavaType> _nestedTypes = new HashSet<>();
30+
31+
protected DefinedTypeElementBuilders _definedTypeElementBuilders;
32+
33+
public MessageElementVisitor(SerializerProvider provider, JavaType type,
34+
DefinedTypeElementBuilders definedTypeElementBuilders, boolean isNested)
35+
{
36+
super(provider);
37+
38+
_definedTypeElementBuilders = definedTypeElementBuilders;
39+
40+
_type = type;
41+
42+
_builder = MessageElement.builder();
43+
_builder.name(type.getRawClass().getSimpleName());
44+
_builder.documentation("Message for " + type.toCanonical());
45+
46+
_definedTypeElementBuilders.AddTypeElement(type, this, isNested);
47+
}
48+
49+
@Override
50+
public TypeElement build() {
51+
return _builder.build();
52+
}
53+
54+
@Override
55+
public void property(BeanProperty writer) throws JsonMappingException {
56+
FieldElement fElement = buildFieldElement(writer, Label.REQUIRED);
57+
_builder.addField(fElement);
58+
}
59+
60+
@Override
61+
public void property(String name, JsonFormatVisitable handler, JavaType propertyTypeHint) { }
62+
63+
@Override
64+
public void optionalProperty(BeanProperty writer) throws JsonMappingException {
65+
FieldElement fElement = buildFieldElement(writer, Label.OPTIONAL);
66+
_builder.addField(fElement);
67+
}
68+
69+
@Override
70+
public void optionalProperty(String name, JsonFormatVisitable handler, JavaType propertyTypeHint) { }
71+
72+
protected FieldElement buildFieldElement(BeanProperty writer, Label label) throws JsonMappingException
73+
{
74+
FieldElement.Builder fBuilder = FieldElement.builder();
75+
76+
fBuilder.name(writer.getName());
77+
78+
fBuilder.tag(nextTag(writer));
79+
80+
JavaType type = writer.getType();
81+
82+
if (type.isArrayType() || type.isCollectionLikeType()) {
83+
fBuilder.label(Label.REPEATED);
84+
fBuilder.type(getDataType(type.getContentType()));
85+
} else {
86+
fBuilder.label(label);
87+
fBuilder.type(getDataType(type));
88+
}
89+
return fBuilder.build();
90+
}
91+
92+
protected int nextTag(BeanProperty writer) {
93+
getTagGenerator(writer);
94+
return _tagGenerator.nextTag(writer);
95+
}
96+
97+
protected void getTagGenerator(BeanProperty writer) {
98+
if (_tagGenerator == null) {
99+
if (ProtobuffSchemaHelper.hasIndex(writer)) {
100+
_tagGenerator = new AnnotationBasedTagGenerator();
101+
} else {
102+
_tagGenerator = new DefaultTagGenerator();
103+
}
104+
}
105+
}
106+
107+
protected DataType getDataType(JavaType type) throws JsonMappingException {
108+
ScalarType sType = ProtobuffSchemaHelper.getScalarType(type);
109+
if (sType != null) { // Is scalar type ref
110+
return sType;
111+
}
112+
113+
if (!_definedTypeElementBuilders.containsBuilderFor(type)) { // No self ref
114+
if (Arrays.asList(_type.getRawClass().getDeclaredClasses()).contains(type.getRawClass())) { // nested
115+
if (!_nestedTypes.contains(type)) { // create nested type
116+
_nestedTypes.add(type);
117+
TypeElementBuilder nestedTypeBuilder = ProtobuffSchemaHelper.acceptTypeElement(_provider, type,
118+
_definedTypeElementBuilders, true);
119+
120+
_builder.addType(nestedTypeBuilder.build());
121+
}
122+
} else { // tracking non-nested types to generate them later
123+
ProtobuffSchemaHelper.acceptTypeElement(_provider, type, _definedTypeElementBuilders, false);
124+
}
125+
}
126+
return NamedType.create(type.getRawClass().getSimpleName());
127+
}
131128
}

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

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,13 @@
44
import java.math.BigInteger;
55
import java.nio.ByteBuffer;
66

7-
import com.fasterxml.jackson.annotation.JsonProperty;
8-
import com.fasterxml.jackson.databind.BeanProperty;
9-
import com.fasterxml.jackson.databind.JavaType;
10-
import com.fasterxml.jackson.databind.JsonMappingException;
11-
import com.fasterxml.jackson.databind.JsonSerializer;
12-
import com.fasterxml.jackson.databind.SerializerProvider;
7+
import com.fasterxml.jackson.databind.*;
8+
139
import com.squareup.protoparser.DataType;
1410
import com.squareup.protoparser.DataType.ScalarType;
1511

16-
public class ProtobuffSchemaHelper {
17-
12+
public class ProtobuffSchemaHelper
13+
{
1814
private ProtobuffSchemaHelper(){}
1915

2016
public static String getNamespace(JavaType type) {
@@ -41,21 +37,16 @@ public static ScalarType getScalarType(JavaType type) {
4137
}
4238
return null;
4339
}
44-
45-
public static JsonProperty getJsonProperty(BeanProperty writer) {
46-
return writer.getAnnotation(JsonProperty.class);
47-
}
48-
49-
public static boolean hasIndexAnnotation(BeanProperty writer) {
50-
JsonProperty jProperty = getJsonProperty(writer);
51-
return jProperty != null && jProperty.index() != JsonProperty.INDEX_UNKNOWN;
52-
}
5340

54-
public static TypeElementBuilder acceptTypeElement(SerializerProvider provider, JavaType type,
55-
DefinedTypeElementBuilders definedTypeElementBuilders, boolean isNested) throws JsonMappingException {
56-
JsonSerializer<Object> serializer = provider.findValueSerializer(type, null);
57-
ProtoBufSchemaVisitor visitor = new ProtoBufSchemaVisitor(provider, definedTypeElementBuilders, isNested);
58-
serializer.acceptJsonFormatVisitor(visitor, type);
59-
return visitor;
60-
}
41+
public static boolean hasIndex(BeanProperty writer) {
42+
return writer.getMetadata().hasIndex();
43+
}
44+
45+
public static TypeElementBuilder acceptTypeElement(SerializerProvider provider, JavaType type,
46+
DefinedTypeElementBuilders definedTypeElementBuilders, boolean isNested) throws JsonMappingException {
47+
JsonSerializer<Object> serializer = provider.findValueSerializer(type, null);
48+
ProtoBufSchemaVisitor visitor = new ProtoBufSchemaVisitor(provider, definedTypeElementBuilders, isNested);
49+
serializer.acceptJsonFormatVisitor(visitor, type);
50+
return visitor;
51+
}
6152
}

0 commit comments

Comments
 (0)