Skip to content

Commit ac7f821

Browse files
Reading annotations using Jackson method (#440)
1 parent c3aef12 commit ac7f821

File tree

6 files changed

+66
-70
lines changed

6 files changed

+66
-70
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ private BeanModel parseBean(SourceType<Class<?>> sourceClass) {
8383
if (beanHelper != null) {
8484
for (final BeanPropertyWriter beanPropertyWriter : beanHelper.getProperties()) {
8585
final Member member = beanPropertyWriter.getMember().getMember();
86-
final PropertyMember propertyMember = wrapMember(settings.getTypeParser(), member, beanPropertyWriter.getName(), sourceClass.type);
86+
final PropertyMember propertyMember = wrapMember(settings.getTypeParser(), member, beanPropertyWriter::getAnnotation, beanPropertyWriter.getName(), sourceClass.type);
8787
Type propertyType = beanPropertyWriter.getGenericPropertyType();
8888
if (!isAnnotatedPropertyIncluded(beanPropertyWriter::getAnnotation, sourceClass.type.getName() + "." + beanPropertyWriter.getName())) {
8989
continue;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ private BeanModel parseBean(SourceType<Class<?>> sourceClass, List<String> class
213213
if (beanHelper != null) {
214214
for (final BeanPropertyWriter beanPropertyWriter : beanHelper.getProperties()) {
215215
final Member member = beanPropertyWriter.getMember().getMember();
216-
final PropertyMember propertyMember = wrapMember(settings.getTypeParser(), member, beanPropertyWriter.getName(), sourceClass.type);
216+
final PropertyMember propertyMember = wrapMember(settings.getTypeParser(), member, beanPropertyWriter::getAnnotation, beanPropertyWriter.getName(), sourceClass.type);
217217
Type propertyType = propertyMember.getType();
218218
final List<String> propertyComments = getComments(beanPropertyWriter.getAnnotation(JsonPropertyDescription.class));
219219

@@ -323,7 +323,7 @@ private Type processIdentity(Type propertyType, BeanPropertyWriter propertyWrite
323323
if (idProperty.isPresent()) {
324324
final BeanPropertyWriter idPropertyWriter = idProperty.get();
325325
final Member idMember = idPropertyWriter.getMember().getMember();
326-
final PropertyMember idPropertyMember = wrapMember(settings.getTypeParser(), idMember, idPropertyWriter.getName(), cls);
326+
final PropertyMember idPropertyMember = wrapMember(settings.getTypeParser(), idMember, idPropertyWriter::getAnnotation, idPropertyWriter.getName(), cls);
327327
idType = idPropertyMember.getType();
328328
} else {
329329
return null;

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import cz.habarta.typescript.generator.TypeScriptGenerator;
99
import cz.habarta.typescript.generator.compiler.EnumKind;
1010
import cz.habarta.typescript.generator.compiler.EnumMemberModel;
11+
import cz.habarta.typescript.generator.util.AnnotationGetter;
1112
import cz.habarta.typescript.generator.util.GenericsResolver;
1213
import cz.habarta.typescript.generator.util.PropertyMember;
1314
import cz.habarta.typescript.generator.util.Utils;
@@ -118,14 +119,15 @@ private Model parseQueue() {
118119

119120
protected abstract DeclarationModel parseClass(SourceType<Class<?>> sourceClass);
120121

121-
protected static PropertyMember wrapMember(TypeParser typeParser, Member propertyMember, String propertyName, Class<?> sourceClass) {
122+
protected static PropertyMember wrapMember(TypeParser typeParser, Member propertyMember, AnnotationGetter annotationGetter,
123+
String propertyName, Class<?> sourceClass) {
122124
if (propertyMember instanceof Field) {
123125
final Field field = (Field) propertyMember;
124-
return new PropertyMember.FieldPropertyMember(field, typeParser.getFieldType(field));
126+
return new PropertyMember(field, typeParser.getFieldType(field), field.getAnnotatedType(), annotationGetter);
125127
}
126128
if (propertyMember instanceof Method) {
127129
final Method method = (Method) propertyMember;
128-
return new PropertyMember.MethodPropertyMember(method, typeParser.getMethodReturnType(method));
130+
return new PropertyMember(method, typeParser.getMethodReturnType(method), method.getAnnotatedReturnType(), annotationGetter);
129131
}
130132
throw new RuntimeException(String.format(
131133
"Unexpected member type '%s' in property '%s' in class '%s'",
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
package cz.habarta.typescript.generator.util;
3+
4+
import java.lang.annotation.Annotation;
5+
6+
7+
@FunctionalInterface
8+
public interface AnnotationGetter {
9+
public <A extends Annotation> A getAnnotation(Class<A> annotationClass);
10+
}

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/util/PropertyMember.java

Lines changed: 19 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -4,80 +4,35 @@
44
import java.lang.annotation.Annotation;
55
import java.lang.reflect.AnnotatedElement;
66
import java.lang.reflect.AnnotatedType;
7-
import java.lang.reflect.Field;
8-
import java.lang.reflect.Method;
97
import java.lang.reflect.Type;
108
import java.util.Objects;
119

1210

13-
public abstract class PropertyMember {
11+
public class PropertyMember {
1412

15-
public abstract Type getType();
13+
private final AnnotatedElement annotatedElement;
14+
private final Type type;
15+
private final AnnotatedType annotatedType;
16+
private final AnnotationGetter annotationGetter;
1617

17-
public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {
18-
final A annotation = getAnnotatedElement().getAnnotation(annotationClass);
19-
return annotation != null
20-
? annotation
21-
: getAnnotatedType().getAnnotation(annotationClass);
18+
public PropertyMember(AnnotatedElement annotatedElement, Type type, AnnotatedType annotatedType, AnnotationGetter annotationGetter) {
19+
this.annotatedElement = Objects.requireNonNull(annotatedElement);
20+
this.type = Objects.requireNonNull(type);
21+
this.annotatedType = Objects.requireNonNull(annotatedType);
22+
this.annotationGetter = annotationGetter;
2223
}
2324

24-
protected abstract AnnotatedElement getAnnotatedElement();
25-
26-
protected abstract AnnotatedType getAnnotatedType();
27-
28-
29-
public static class FieldPropertyMember extends PropertyMember {
30-
31-
private final Field field;
32-
private final Type type;
33-
34-
public FieldPropertyMember(Field field, Type type) {
35-
this.field = Objects.requireNonNull(field);
36-
this.type = Objects.requireNonNull(type);
37-
}
38-
39-
@Override
40-
public Type getType() {
41-
return type;
42-
}
43-
44-
@Override
45-
public AnnotatedElement getAnnotatedElement() {
46-
return field;
47-
}
48-
49-
@Override
50-
public AnnotatedType getAnnotatedType() {
51-
return field.getAnnotatedType();
52-
}
53-
25+
public Type getType() {
26+
return type;
5427
}
5528

56-
public static class MethodPropertyMember extends PropertyMember {
57-
58-
private final Method method;
59-
private final Type type;
60-
61-
public MethodPropertyMember(Method method, Type type) {
62-
this.method = Objects.requireNonNull(method);
63-
this.type = Objects.requireNonNull(type);
64-
}
65-
66-
@Override
67-
public Type getType() {
68-
return type;
69-
}
70-
71-
@Override
72-
public AnnotatedElement getAnnotatedElement() {
73-
return method;
74-
}
75-
76-
@Override
77-
public AnnotatedType getAnnotatedType() {
78-
return method.getAnnotatedReturnType();
79-
}
80-
29+
public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {
30+
final A annotation = annotationGetter != null
31+
? annotationGetter.getAnnotation(annotationClass)
32+
: annotatedElement.getAnnotation(annotationClass);
33+
return annotation != null
34+
? annotation
35+
: annotatedType.getAnnotation(annotationClass);
8136
}
8237

8338
}

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,4 +132,33 @@ public String getProperty2() {
132132
}
133133
}
134134

135+
@Test
136+
public void testAnnotatedPrivateField() {
137+
final Settings settings = TestUtils.settings();
138+
settings.optionalAnnotations.add(TypescriptOptional.class);
139+
final String output = new TypeScriptGenerator(settings).generateTypeScript(Input.from(SearchDTO.class));
140+
Assert.assertTrue(output.contains("selectedId?: number;"));
141+
}
142+
143+
public class SearchDTO {
144+
145+
private Integer year;
146+
147+
@TypescriptOptional
148+
private Long selectedId;
149+
150+
public Integer getYear() {
151+
return year;
152+
}
153+
154+
public Long getSelectedId() {
155+
return selectedId;
156+
}
157+
158+
}
159+
160+
@Retention(RetentionPolicy.RUNTIME)
161+
public @interface TypescriptOptional {
162+
}
163+
135164
}

0 commit comments

Comments
 (0)