Skip to content

Commit 5271859

Browse files
committed
#177 followup - add test, format and tidy internals
Also exclude include fields in fromJson() that are not used due to being read-only json properties
1 parent f09c2d2 commit 5271859

File tree

6 files changed

+45
-38
lines changed

6 files changed

+45
-38
lines changed

blackbox-test/src/main/java/org/example/customer/naming/WithName.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,11 @@ public record WithName(
1111
String simplePlus,
1212
int myOneRed) {
1313

14+
/**
15+
* A read-only JSON property without an underlying field.
16+
*/
17+
@Json.Property("derived")
18+
public int calculated() {
19+
return myOneRed * 2;
20+
}
1421
}

blackbox-test/src/test/java/org/example/customer/naming/WithNameTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ void toFrom() {
1717
WithName bean = new WithName("sim", "simPlus", 42);
1818

1919
String asJson = jsonType.toJson(bean);
20-
assertThat(asJson).isEqualTo("{\"Some Thing Odd\":\"sim\",\"simple-plus\":\"simPlus\",\"my-one-red\":42}");
20+
assertThat(asJson).isEqualTo("{\"Some Thing Odd\":\"sim\",\"simple-plus\":\"simPlus\",\"my-one-red\":42,\"derived\":84}");
2121

2222
WithName fromJson = jsonType.fromJson(asJson);
2323
assertEquals(fromJson, bean);

jsonb-generator/src/main/java/io/avaje/jsonb/generator/ClassReader.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -424,10 +424,12 @@ private void writeFromJsonImplementation(Append writer, String varName) {
424424
} else {
425425
writer.append(" // variables to read json values into, constructor params don't need _set$ flags").eol();
426426
for (final FieldReader allField : allFields) {
427-
if (isRecord) {
428-
allField.writeFromJsonVariablesRecord(writer);
429-
} else if (allField.includeFromJson()) {
430-
allField.writeFromJsonVariables(writer);
427+
if (allField.includeFromJson()) {
428+
if (isRecord) {
429+
allField.writeFromJsonVariablesRecord(writer);
430+
} else {
431+
allField.writeFromJsonVariables(writer);
432+
}
431433
}
432434
}
433435
}

jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldReader.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,13 @@ final class FieldReader {
3232

3333
final var fieldName = element.getSimpleName().toString();
3434
final var publicField = !isMethod && element.getModifiers().contains(Modifier.PUBLIC);
35+
final var type = isMethod ? ((ExecutableElement) element).getReturnType() : element.asType();
3536

36-
var type = isMethod ? ((ExecutableElement) element).getReturnType() : element.asType();
37-
38-
this.property =
39-
new FieldProperty(type, raw, unmapped, genericTypeParams, publicField, fieldName);
40-
this.propertyName =
41-
PropertyPrism.getOptionalOn(element)
42-
.map(PropertyPrism::value)
43-
.map(Util::escapeQuotes)
44-
.orElse(namingConvention.from(fieldName));
37+
this.property = new FieldProperty(type, raw, unmapped, genericTypeParams, publicField, fieldName);
38+
this.propertyName = PropertyPrism.getOptionalOn(element)
39+
.map(PropertyPrism::value)
40+
.map(Util::escapeQuotes)
41+
.orElse(namingConvention.from(fieldName));
4542

4643
this.aliases = initAliases(element);
4744
}

jsonb-generator/src/main/java/io/avaje/jsonb/generator/TypeReader.java

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,9 @@ final class TypeReader {
5858
if (mixInType == null) {
5959
this.mixInFields = new HashMap<>();
6060
} else {
61-
this.mixInFields =
62-
mixInType.getEnclosedElements().stream()
63-
.filter(e -> e.getKind() == ElementKind.FIELD)
64-
.collect(Collectors.toMap(e -> e.getSimpleName().toString(), e -> e));
61+
this.mixInFields = mixInType.getEnclosedElements().stream()
62+
.filter(e -> e.getKind() == ElementKind.FIELD)
63+
.collect(Collectors.toMap(e -> e.getSimpleName().toString(), e -> e));
6564
}
6665
this.namingConvention = namingConvention;
6766
this.hasJsonAnnotation = JsonPrism.isPresent(baseType) || importedJson(baseType).isPresent();
@@ -129,11 +128,18 @@ private void readField(Element element, List<FieldReader> localFields) {
129128
optional = true;
130129
}
131130
if (includeField(element)) {
132-
final var frequency = frequencyMap.compute(element.getSimpleName().toString(), (k, v) -> v == null ? 0 : v + 1);
131+
final var frequency = frequency(element.getSimpleName().toString());
133132
localFields.add(new FieldReader(element, namingConvention, currentSubType, genericTypeParams, frequency));
134133
}
135134
}
136135

136+
/**
137+
* Compute and return the frequency of the key / json property name.
138+
*/
139+
private Integer frequency(String key) {
140+
return frequencyMap.compute(key, (k, v) -> v == null ? 0 : v + 1);
141+
}
142+
137143
private boolean includeField(Element element) {
138144
if (extendsThrowable) {
139145
return !element.getModifiers().contains(Modifier.TRANSIENT)
@@ -186,24 +192,19 @@ private void readMethod(Element element, TypeElement type, List<FieldReader> loc
186192
}
187193
}
188194
}
189-
// for reading methods
190-
PropertyPrism.getOptionalOn(methodElement)
191-
.ifPresent(
192-
p -> {
193-
if (!methodElement.getParameters().isEmpty()) {
194-
logError("Json.Property can only be placed on Getter Methods", methodElement);
195-
return;
196-
}
197-
198-
final var frequency =
199-
frequencyMap.compute(p.value(), (k, v) -> v == null ? 0 : v + 1);
200-
201-
final var reader =
202-
new FieldReader(
203-
element, namingConvention, currentSubType, genericTypeParams, frequency);
204-
localFields.add(reader);
205-
reader.getterMethod(new MethodReader(methodElement, type));
206-
});
195+
// for getter/accessor methods only, not setters
196+
PropertyPrism.getOptionalOn(methodElement).ifPresent(propertyPrism -> {
197+
if (!methodElement.getParameters().isEmpty()) {
198+
logError("Json.Property can only be placed on Getter Methods, but on %s", methodElement);
199+
return;
200+
}
201+
202+
// getter property as simulated read-only field with getter method
203+
final var frequency = frequency(propertyPrism.value());
204+
final var reader = new FieldReader(element, namingConvention, currentSubType, genericTypeParams, frequency);
205+
reader.getterMethod(new MethodReader(methodElement, type));
206+
localFields.add(reader);
207+
});
207208
}
208209

209210
private boolean checkMethod2(ExecutableElement methodElement) {

jsonb/src/main/java/io/avaje/jsonb/Json.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@
138138
}
139139

140140
/**
141-
* @deprecated - migrate to {@link Json.Alias}.
141+
* Deprecated - migrate to {@link Json.Alias}.
142142
*/
143143
@Deprecated
144144
@Retention(CLASS)

0 commit comments

Comments
 (0)