Skip to content

Commit ddfdc1b

Browse files
Jackson2 enums with JsonFormat.Shape.OBJECT (refs #140)
1 parent eed856e commit ddfdc1b

File tree

5 files changed

+50
-12
lines changed

5 files changed

+50
-12
lines changed

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/parser/BeanModel.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22
package cz.habarta.typescript.generator.parser;
33

4+
import cz.habarta.typescript.generator.util.Utils;
45
import java.lang.reflect.Type;
56
import java.util.*;
67

@@ -20,7 +21,7 @@ public BeanModel(Class<?> origin, Type parent, List<Class<?>> taggedUnionClasses
2021
this.taggedUnionClasses = taggedUnionClasses;
2122
this.discriminantProperty = discriminantProperty;
2223
this.discriminantLiteral = discriminantLiteral;
23-
this.interfaces = interfaces;
24+
this.interfaces = Utils.listFromNullable(interfaces);
2425
this.properties = properties;
2526
}
2627

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/parser/Jackson1Parser.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,15 @@ public boolean isHandled(Annotation ann) {
3434
}
3535

3636
@Override
37-
protected BeanModel parseBean(SourceType<Class<?>> sourceClass) {
37+
protected DeclarationModel parseClass(SourceType<Class<?>> sourceClass) {
38+
if (sourceClass.type.isEnum()) {
39+
return ModelParser.parseEnum(sourceClass);
40+
} else {
41+
return parseBean(sourceClass);
42+
}
43+
}
44+
45+
private BeanModel parseBean(SourceType<Class<?>> sourceClass) {
3846
final List<PropertyModel> properties = new ArrayList<>();
3947

4048
final BeanHelper beanHelper = getBeanHelper(sourceClass.type);

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/parser/Jackson2Parser.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,15 @@ public Jackson2Parser(Settings settings, TypeProcessor typeProcessor, boolean us
4848
}
4949

5050
@Override
51-
protected BeanModel parseBean(SourceType<Class<?>> sourceClass) {
51+
protected DeclarationModel parseClass(SourceType<Class<?>> sourceClass) {
52+
if (sourceClass.type.isEnum()) {
53+
return parseEnumOrObjectEnum(sourceClass);
54+
} else {
55+
return parseBean(sourceClass);
56+
}
57+
}
58+
59+
private BeanModel parseBean(SourceType<Class<?>> sourceClass) {
5260
final List<PropertyModel> properties = new ArrayList<>();
5361

5462
final BeanHelper beanHelper = getBeanHelper(sourceClass.type);
@@ -92,6 +100,9 @@ protected BeanModel parseBean(SourceType<Class<?>> sourceClass) {
92100
properties.add(processTypeAndCreateProperty(beanPropertyWriter.getName(), propertyType, optional, sourceClass.type, originalMember, pullProperties));
93101
}
94102
}
103+
if (sourceClass.type.isEnum()) {
104+
return new BeanModel(sourceClass.type, null, null, null, null, null, properties, null);
105+
}
95106

96107
final String discriminantProperty;
97108
final String discriminantLiteral;
@@ -252,9 +263,11 @@ public BeanPropertyWriter[] getProperties() {
252263

253264
}
254265

255-
@Override
256-
protected EnumModel<?> parseEnum(SourceType<Class<?>> sourceClass) {
266+
private DeclarationModel parseEnumOrObjectEnum(SourceType<Class<?>> sourceClass) {
257267
final JsonFormat jsonFormat = sourceClass.type.getAnnotation(JsonFormat.class);
268+
if (jsonFormat != null && jsonFormat.shape() == JsonFormat.Shape.OBJECT) {
269+
return parseBean(sourceClass);
270+
}
258271
final boolean isNumberBased = jsonFormat != null && (
259272
jsonFormat.shape() == JsonFormat.Shape.NUMBER ||
260273
jsonFormat.shape() == JsonFormat.Shape.NUMBER_FLOAT ||

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/parser/ModelParser.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,13 @@ private Model parseQueue() {
6060
final Class<?> cls = (Class<?>) sourceType.type;
6161
System.out.println("Parsing '" + cls.getName() + "'" +
6262
(sourceType.usedInClass != null ? " used in '" + sourceType.usedInClass.getSimpleName() + "." + sourceType.usedInMember + "'" : ""));
63-
if (cls.isEnum()) {
64-
final EnumModel<?> enumModel = parseEnum(sourceType.asSourceClass());
65-
enums.add(enumModel);
63+
final DeclarationModel model = parseClass(sourceType.asSourceClass());
64+
if (model instanceof EnumModel) {
65+
enums.add((EnumModel) model);
66+
} else if (model instanceof BeanModel) {
67+
beans.add((BeanModel) model);
6668
} else {
67-
final BeanModel bean = parseBean(sourceType.asSourceClass());
68-
beans.add(bean);
69+
throw new RuntimeException();
6970
}
7071
}
7172
for (Class<?> cls : result.getDiscoveredClasses()) {
@@ -76,9 +77,9 @@ private Model parseQueue() {
7677
return new Model(beans, enums, jaxrsApplicationParser.getModel());
7778
}
7879

79-
protected abstract BeanModel parseBean(SourceType<Class<?>> sourceClass);
80+
protected abstract DeclarationModel parseClass(SourceType<Class<?>> sourceClass);
8081

81-
protected EnumModel<?> parseEnum(SourceType<Class<?>> sourceClass) {
82+
protected static DeclarationModel parseEnum(SourceType<Class<?>> sourceClass) {
8283
final List<EnumMemberModel<String>> values = new ArrayList<>();
8384
if (sourceClass.type.isEnum()) {
8485
@SuppressWarnings("unchecked")

typescript-generator-core/src/test/java/cz/habarta/typescript/generator/EnumTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.fasterxml.jackson.annotation.JsonFormat;
55
import com.fasterxml.jackson.annotation.JsonProperty;
66
import com.fasterxml.jackson.annotation.JsonValue;
7+
import com.fasterxml.jackson.core.JsonProcessingException;
8+
import com.fasterxml.jackson.databind.ObjectMapper;
79
import java.util.*;
810
import static org.junit.Assert.*;
911
import org.junit.Test;
@@ -114,6 +116,19 @@ public void testExcludeObjectEnum() {
114116
assertTrue(!output.contains("StatusType"));
115117
}
116118

119+
@Test
120+
public void testObjectEnum() {
121+
final Settings settings = TestUtils.settings();
122+
final String output = new TypeScriptGenerator(settings).generateTypeScript(Input.from(StatusType.class));
123+
System.out.println(output);
124+
final String expected = "" +
125+
"interface StatusType {\n" +
126+
" code: number;\n" +
127+
" label: string;\n" +
128+
"}";
129+
assertEquals(expected.trim(), output.trim());
130+
}
131+
117132
private static class AClass {
118133
public Direction direction;
119134
}

0 commit comments

Comments
 (0)