Skip to content

Commit 7972d18

Browse files
committed
Add support for java.time.Duration as part of the JSON generator.
Motivation: The pattern (number, time unit) is often used to express a duration in Vert.x data objects, such as a timeout. The type java.time.Duration is a good alternative and can be used to express the same property in a better fashion. Changes: The JSON generator handles now java.time.Duration and converts it back and forth a number in milliseconds.
1 parent 9ec5b50 commit 7972d18

File tree

3 files changed

+156
-52
lines changed

3 files changed

+156
-52
lines changed

vertx-codegen-json/src/main/java/io/vertx/codegen/json/generator/DataObjectJsonGen.java

Lines changed: 55 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package io.vertx.codegen.json.generator;
22

33
import io.vertx.codegen.processor.DataObjectModel;
4-
import io.vertx.codegen.processor.GenException;
54
import io.vertx.codegen.processor.Generator;
65
import io.vertx.codegen.processor.PropertyInfo;
76
import io.vertx.codegen.annotations.DataObject;
@@ -23,6 +22,7 @@
2322
import java.io.PrintWriter;
2423
import java.io.StringWriter;
2524
import java.lang.annotation.Annotation;
25+
import java.time.Duration;
2626
import java.time.Instant;
2727
import java.util.Collection;
2828
import java.util.Collections;
@@ -94,8 +94,6 @@ public String renderJson(DataObjectModel model) {
9494
writer.print("\n");
9595
writer.print("import io.vertx.core.json.JsonObject;\n");
9696
writer.print("import io.vertx.core.json.JsonArray;\n");
97-
writer.print("import java.time.Instant;\n");
98-
writer.print("import java.time.format.DateTimeFormatter;\n");
9997
writer.print("\n");
10098
writer.print("/**\n");
10199
writer.print(" * Converter and mapper for {@link " + model.getType() + "}.\n");
@@ -122,59 +120,65 @@ private void genToJson(String visibility, boolean inheritConverter, DataObjectMo
122120
writer.print("\n");
123121
writer.print(" " + visibility + " static void toJson(" + simpleName + " obj, java.util.Map<String, Object> json) {\n");
124122
model_.getPropertyMap().values().forEach(prop -> {
125-
if ((prop.isDeclared() || inheritConverter) && prop.getGetterMethod() != null && prop.isJsonifiable()) {
126-
ClassKind propKind = prop.getType().getKind();
127-
if (propKind.basic) {
128-
if (propKind == ClassKind.STRING) {
129-
genPropToJson("", "", prop, writer);
130-
} else {
131-
switch (prop.getType().getSimpleName()) {
132-
case "char":
133-
case "Character":
134-
genPropToJson("Character.toString(", ")", prop, writer);
135-
break;
136-
default:
137-
genPropToJson("", "", prop, writer);
138-
}
139-
}
140-
} else {
141-
DataObjectInfo dataObject = prop.getType().getDataObject();
142-
if (dataObject != null) {
143-
if (dataObject.isSerializable()) {
144-
String m;
145-
MapperInfo mapperInfo = dataObject.getSerializer();
146-
String match;
147-
switch (mapperInfo.getKind()) {
148-
case SELF:
149-
m = "";
150-
match = "." + String.join(".", mapperInfo.getSelectors()) + "()";
151-
break;
152-
case STATIC_METHOD:
153-
m = mapperInfo.getQualifiedName() + "." + String.join(".", mapperInfo.getSelectors()) + "(";
154-
match = ")";
123+
if ((prop.isDeclared() || inheritConverter) && prop.getGetterMethod() != null) {
124+
if (prop.isJsonifiable()) {
125+
ClassKind propKind = prop.getType().getKind();
126+
if (propKind.basic) {
127+
if (propKind == ClassKind.STRING) {
128+
genPropToJson("", "", prop, writer);
129+
} else {
130+
switch (prop.getType().getSimpleName()) {
131+
case "char":
132+
case "Character":
133+
genPropToJson("Character.toString(", ")", prop, writer);
155134
break;
156135
default:
157-
throw new UnsupportedOperationException();
136+
genPropToJson("", "", prop, writer);
158137
}
159-
genPropToJson(m, match, prop, writer);
160138
}
161139
} else {
162-
switch (propKind) {
163-
case ENUM:
164-
genPropToJson("", ".name()", prop, writer);
165-
break;
166-
case JSON_OBJECT:
167-
case JSON_ARRAY:
168-
case OBJECT:
169-
genPropToJson("", "", prop, writer);
170-
break;
171-
case OTHER:
172-
if (prop.getType().getName().equals(Instant.class.getName())) {
173-
genPropToJson("DateTimeFormatter.ISO_INSTANT.format(", ")", prop, writer);
140+
DataObjectInfo dataObject = prop.getType().getDataObject();
141+
if (dataObject != null) {
142+
if (dataObject.isSerializable()) {
143+
String m;
144+
MapperInfo mapperInfo = dataObject.getSerializer();
145+
String match;
146+
switch (mapperInfo.getKind()) {
147+
case SELF:
148+
m = "";
149+
match = "." + String.join(".", mapperInfo.getSelectors()) + "()";
150+
break;
151+
case STATIC_METHOD:
152+
m = mapperInfo.getQualifiedName() + "." + String.join(".", mapperInfo.getSelectors()) + "(";
153+
match = ")";
154+
break;
155+
default:
156+
throw new UnsupportedOperationException();
174157
}
175-
break;
158+
genPropToJson(m, match, prop, writer);
159+
}
160+
} else {
161+
switch (propKind) {
162+
case ENUM:
163+
genPropToJson("", ".name()", prop, writer);
164+
break;
165+
case JSON_OBJECT:
166+
case JSON_ARRAY:
167+
case OBJECT:
168+
genPropToJson("", "", prop, writer);
169+
break;
170+
case OTHER:
171+
if (prop.getType().getName().equals(Instant.class.getName())) {
172+
genPropToJson("java.time.format.DateTimeFormatter.ISO_INSTANT.format(", ")", prop, writer);
173+
}
174+
break;
175+
}
176176
}
177177
}
178+
} else {
179+
if (prop.getType().getName().equals(Duration.class.getName())) {
180+
genPropToJson("", ".toMillis()", prop, writer);
181+
}
178182
}
179183
}
180184
});
@@ -302,7 +306,9 @@ private void genFromJson(String visibility, boolean inheritConverter, DataObject
302306
break;
303307
case OTHER:
304308
if (prop.getType().getName().equals(Instant.class.getName())) {
305-
genPropFromJson("String", "Instant.from(DateTimeFormatter.ISO_INSTANT.parse((String)", "))", prop, writer);
309+
genPropFromJson("String", "java.time.Instant.from(java.time.format.DateTimeFormatter.ISO_INSTANT.parse((String)", "))", prop, writer);
310+
} else if (prop.getType().getName().equals(Duration.class.getName())) {
311+
genPropFromJson("Number", "java.time.Duration.of(((Number)", ").longValue(), java.time.temporal.ChronoUnit.MILLIS)", prop, writer);
306312
}
307313
break;
308314
default:

0 commit comments

Comments
 (0)