Skip to content

Commit a7c630b

Browse files
andreaTPmanusa
authored andcommitted
[java-generator] Add native support for date-time fields
1 parent b81ebae commit a7c630b

File tree

13 files changed

+83
-4
lines changed

13 files changed

+83
-4
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
#### _**Note**_: Breaking changes
2222
* Fix #2718: KubernetesResourceUtil.isResourceReady was deprecated. Use
23+
* Fix #5279: (java-generator) Add native support for `date-time` fields, they are now mapped to native `java.time.ZonedDateTime`
2324

2425
### 6.7.2 (2023-06-15)
2526

java-generator/core/src/main/java/io/fabric8/java/generator/nodes/AbstractJSONSchema2Pojo.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public abstract class AbstractJSONSchema2Pojo {
3939
static final String FLOAT_CRD_TYPE = "float";
4040
static final String DOUBLE_CRD_TYPE = "double";
4141
static final String STRING_CRD_TYPE = "string";
42+
static final String DATETIME_CRD_TYPE = "date-time";
4243
static final String OBJECT_CRD_TYPE = "object";
4344
static final String ARRAY_CRD_TYPE = "array";
4445

@@ -48,6 +49,9 @@ public static final AnnotationExpr newGeneratedAnnotation() {
4849
new StringLiteralExpr("io.fabric8.java.generator.CRGeneratorRunner"));
4950
}
5051

52+
// RFC 3339 - from: https://swagger.io/docs/specification/data-models/data-types/
53+
public static final String DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ssX";
54+
5155
protected final String description;
5256
protected final Config config;
5357
protected final boolean isNullable;
@@ -197,7 +201,17 @@ public static AbstractJSONSchema2Pojo fromJsonSchema(
197201
return fromJsonSchema.apply(JPrimitiveNameAndType.DOUBLE);
198202
}
199203
case STRING_CRD_TYPE:
200-
return fromJsonSchema.apply(JPrimitiveNameAndType.STRING);
204+
String stringFormat = prop.getFormat();
205+
if (stringFormat == null)
206+
stringFormat = STRING_CRD_TYPE;
207+
208+
switch (stringFormat) {
209+
case DATETIME_CRD_TYPE:
210+
return fromJsonSchema.apply(JPrimitiveNameAndType.DATETIME);
211+
case STRING_CRD_TYPE:
212+
default:
213+
return fromJsonSchema.apply(JPrimitiveNameAndType.STRING);
214+
}
201215
case OBJECT_CRD_TYPE:
202216
if (prop.getAdditionalProperties() != null && prop.getAdditionalProperties().getSchema() != null) {
203217
return fromJsonSchema.apply(new JMapNameAndType(key));

java-generator/core/src/main/java/io/fabric8/java/generator/nodes/JObject.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
import java.util.*;
4040
import java.util.stream.Collectors;
4141

42+
import static io.fabric8.java.generator.nodes.JPrimitiveNameAndType.DATETIME_NAME;
43+
4244
public class JObject extends AbstractJSONSchema2Pojo implements JObjectExtraAnnotations {
4345

4446
public static final String DEPRECATED_FIELD_MARKER = "deprecated";
@@ -215,6 +217,12 @@ public GeneratorResult generateJava() {
215217
new Name("com.fasterxml.jackson.annotation.JsonProperty"),
216218
new StringLiteralExpr(originalFieldName)));
217219

220+
if (prop.getClassType().equals(DATETIME_NAME)) {
221+
objField.addAnnotation(new SingleMemberAnnotationExpr(
222+
new Name("com.fasterxml.jackson.annotation.JsonFormat"),
223+
new NameExpr("timezone = \"UTC\", pattern = \"" + DATETIME_FORMAT + "\"")));
224+
}
225+
218226
if (isRequired) {
219227
objField.addAnnotation("io.fabric8.generator.annotation.Required");
220228
}
@@ -347,6 +355,9 @@ private Expression generatePrimitiveDefaultInitializerExpression(AbstractJSONSch
347355
return new DoubleLiteralExpr(value + "f");
348356
} else if (prop.getClassType().equals("Boolean") && prop.getDefaultValue().isBoolean()) {
349357
return new BooleanLiteralExpr(prop.getDefaultValue().booleanValue());
358+
} else if (prop.getClassType().equals(DATETIME_NAME) && prop.getDefaultValue().isTextual()) {
359+
return new NameExpr(DATETIME_NAME + ".parse(" + prop.getDefaultValue()
360+
+ ", java.time.format.DateTimeFormatter.ofPattern(\"" + DATETIME_FORMAT + "\"))");
350361
} else {
351362
return new NameExpr(value);
352363
}

java-generator/core/src/main/java/io/fabric8/java/generator/nodes/JPrimitiveNameAndType.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616
package io.fabric8.java.generator.nodes;
1717

1818
public class JPrimitiveNameAndType extends JavaNameAndType {
19+
static final String DATETIME_NAME = "java.time.ZonedDateTime";
1920
static final JPrimitiveNameAndType INT_OR_STRING = new JPrimitiveNameAndType("io.fabric8.kubernetes.api.model.IntOrString");
2021
static final JPrimitiveNameAndType BOOL = new JPrimitiveNameAndType("Boolean");
2122
static final JPrimitiveNameAndType INTEGER = new JPrimitiveNameAndType("Integer");
2223
static final JPrimitiveNameAndType LONG = new JPrimitiveNameAndType("Long");
2324
static final JPrimitiveNameAndType FLOAT = new JPrimitiveNameAndType("Float");
2425
static final JPrimitiveNameAndType DOUBLE = new JPrimitiveNameAndType("Double");
2526
static final JPrimitiveNameAndType STRING = new JPrimitiveNameAndType("String");
27+
static final JPrimitiveNameAndType DATETIME = new JPrimitiveNameAndType(DATETIME_NAME);
2628
static final JPrimitiveNameAndType ANY_TYPE = new JPrimitiveNameAndType("io.fabric8.kubernetes.api.model.AnyType");
2729

2830
public JPrimitiveNameAndType(String name) {

java-generator/core/src/test/resources/crontab-crd.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ spec:
3939
type: string
4040
replicas:
4141
type: integer
42+
issuedAt:
43+
format: date-time
44+
type: string
4245
status:
4346
type: object
4447
properties:

java-generator/core/src/test/resources/io/fabric8/java/generator/approvals/ApprovalTest.generate_withValidCrd_shouldGeneratePojos.testCrontabCrd.approved.txt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class CronTab extends io.fabric8.kubernetes.client.CustomResource<org.tes
1111
CrontabJavaCr[1] = package org.test.v1;
1212

1313
@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)
14-
@com.fasterxml.jackson.annotation.JsonPropertyOrder({"cronSpec","image","replicas"})
14+
@com.fasterxml.jackson.annotation.JsonPropertyOrder({"cronSpec","image","issuedAt","replicas"})
1515
@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.fasterxml.jackson.databind.JsonDeserializer.None.class)
1616
@javax.annotation.processing.Generated("io.fabric8.java.generator.CRGeneratorRunner")
1717
public class CronTabSpec implements io.fabric8.kubernetes.api.model.KubernetesResource {
@@ -40,6 +40,19 @@ public class CronTabSpec implements io.fabric8.kubernetes.api.model.KubernetesRe
4040
this.image = image;
4141
}
4242

43+
@com.fasterxml.jackson.annotation.JsonProperty("issuedAt")
44+
@com.fasterxml.jackson.annotation.JsonFormat(timezone = "UTC", pattern = "yyyy-MM-dd'T'HH:mm:ssX")
45+
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SKIP)
46+
private java.time.ZonedDateTime issuedAt;
47+
48+
public java.time.ZonedDateTime getIssuedAt() {
49+
return issuedAt;
50+
}
51+
52+
public void setIssuedAt(java.time.ZonedDateTime issuedAt) {
53+
this.issuedAt = issuedAt;
54+
}
55+
4356
@com.fasterxml.jackson.annotation.JsonProperty("replicas")
4457
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SKIP)
4558
private Long replicas;

java-generator/core/src/test/resources/io/fabric8/java/generator/approvals/ApprovalTest.generate_withValidCrd_shouldGeneratePojos.testCrontabExtraAnnotationsCrd.approved.txt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class CronTab extends io.fabric8.kubernetes.client.CustomResource<org.tes
2828
CrontabJavaExtraAnnotationsCr[1] = package org.test.v1;
2929

3030
@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)
31-
@com.fasterxml.jackson.annotation.JsonPropertyOrder({"cronSpec","image","replicas"})
31+
@com.fasterxml.jackson.annotation.JsonPropertyOrder({"cronSpec","image","issuedAt","replicas"})
3232
@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.fasterxml.jackson.databind.JsonDeserializer.None.class)
3333
@javax.annotation.processing.Generated("io.fabric8.java.generator.CRGeneratorRunner")
3434
@lombok.ToString()
@@ -74,6 +74,19 @@ public class CronTabSpec implements io.fabric8.kubernetes.api.model.KubernetesRe
7474
this.image = image;
7575
}
7676

77+
@com.fasterxml.jackson.annotation.JsonProperty("issuedAt")
78+
@com.fasterxml.jackson.annotation.JsonFormat(timezone = "UTC", pattern = "yyyy-MM-dd'T'HH:mm:ssX")
79+
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SKIP)
80+
private java.time.ZonedDateTime issuedAt;
81+
82+
public java.time.ZonedDateTime getIssuedAt() {
83+
return issuedAt;
84+
}
85+
86+
public void setIssuedAt(java.time.ZonedDateTime issuedAt) {
87+
this.issuedAt = issuedAt;
88+
}
89+
7790
@com.fasterxml.jackson.annotation.JsonProperty("replicas")
7891
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SKIP)
7992
private Long replicas;

java-generator/it/src/it/default-values-instantiation/src/test/java/io/fabric8/it/certmanager/TestDefaultValues.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,17 @@
2121
import io.fabric8.kubernetes.client.utils.Serialization;
2222
import org.junit.jupiter.api.Test;
2323

24+
import java.time.format.DateTimeFormatter;
25+
import java.time.ZonedDateTime;
2426
import java.util.List;
2527

2628
import static io.cert_manager.v1.CertificateRequestSpec.*;
2729
import static org.junit.jupiter.api.Assertions.assertEquals;
2830

2931
class TestDefaultValues {
3032

33+
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssX");
34+
3135
@Test
3236
void testDefaultValues() throws Exception {
3337
// Arrange
@@ -46,6 +50,7 @@ void testDefaultValues() throws Exception {
4650
List<String> nine = cr.getSpec().getNine();
4751
Ten ten = cr.getSpec().getTen();
4852
Eleven eleven = cr.getSpec().getEleven();
53+
ZonedDateTime twelve = cr.getSpec().getTwelve();
4954

5055
// Assert
5156
assertEquals("one", one);
@@ -62,5 +67,6 @@ void testDefaultValues() throws Exception {
6267
assertEquals("tenone", ten.getTenOne());
6368
assertEquals("tentwo", ten.getTenTwo());
6469
assertEquals(Eleven.BAZ, eleven);
70+
assertEquals(ZonedDateTime.parse("2017-07-21T17:32:28Z", formatter), twelve);
6571
}
6672
}

java-generator/it/src/it/default-values-instantiation/src/test/resources/example.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,5 +97,9 @@ spec:
9797
- "bar"
9898
- "baz"
9999
default: "baz"
100+
twelve:
101+
type: string
102+
format: date-time
103+
default: "2017-07-21T17:32:28Z"
100104
served: true
101105
storage: true

java-generator/it/src/it/enum-ser-deser/src/test/java/io/fabric8/it/certmanager/TestEnumSerialization.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,16 @@
2525
import java.nio.file.Path;
2626
import java.nio.file.Paths;
2727
import java.nio.file.Files;
28+
import java.time.format.DateTimeFormatter;
29+
import java.time.ZonedDateTime;
2830
import java.util.List;
2931

3032
import static org.junit.jupiter.api.Assertions.assertEquals;
3133

3234
class TestEnumSerialization {
3335

36+
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssX");
37+
3438
@Test
3539
void testDeserialization() {
3640
// Arrange
@@ -47,6 +51,8 @@ void testDeserialization() {
4751
assertEquals(CertificateRequestSpec.Usages.DIGITAL_SIGNATURE, usagesList.get(2));
4852
assertEquals(CertificateRequestSpec.Usages.SERVER_AUTH, usagesList.get(3));
4953
assertEquals(CertificateRequestSpec.Usages.S_MIME, usagesList.get(4));
54+
55+
assertEquals(ZonedDateTime.parse("2017-07-21T17:32:28Z", formatter), sample.getSpec().getDatetime());
5056
}
5157

5258
@Test

0 commit comments

Comments
 (0)