Skip to content

Commit 5ea4939

Browse files
committed
[java-generator] Add native support for date-time fields
1 parent 449d06b commit 5ea4939

File tree

12 files changed

+81
-4
lines changed

12 files changed

+81
-4
lines changed

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

Lines changed: 14 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,8 @@ public static final AnnotationExpr newGeneratedAnnotation() {
4849
new StringLiteralExpr("io.fabric8.java.generator.CRGeneratorRunner"));
4950
}
5051

52+
public static final String DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ssX";
53+
5154
protected final String description;
5255
protected final Config config;
5356
protected final boolean isNullable;
@@ -197,7 +200,17 @@ public static AbstractJSONSchema2Pojo fromJsonSchema(
197200
return fromJsonSchema.apply(JPrimitiveNameAndType.DOUBLE);
198201
}
199202
case STRING_CRD_TYPE:
200-
return fromJsonSchema.apply(JPrimitiveNameAndType.STRING);
203+
String stringFormat = prop.getFormat();
204+
if (stringFormat == null)
205+
stringFormat = STRING_CRD_TYPE;
206+
207+
switch (stringFormat) {
208+
case DATETIME_CRD_TYPE:
209+
return fromJsonSchema.apply(JPrimitiveNameAndType.DATETIME);
210+
case STRING_CRD_TYPE:
211+
default:
212+
return fromJsonSchema.apply(JPrimitiveNameAndType.STRING);
213+
}
201214
case OBJECT_CRD_TYPE:
202215
if (prop.getAdditionalProperties() != null && prop.getAdditionalProperties().getSchema() != null) {
203216
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+
datetime:
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","datetime","image","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 {
@@ -28,6 +28,19 @@ public class CronTabSpec implements io.fabric8.kubernetes.api.model.KubernetesRe
2828
this.cronSpec = cronSpec;
2929
}
3030

31+
@com.fasterxml.jackson.annotation.JsonProperty("datetime")
32+
@com.fasterxml.jackson.annotation.JsonFormat(timezone = "UTC", pattern = "yyyy-MM-dd'T'HH:mm:ssX")
33+
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SKIP)
34+
private java.time.ZonedDateTime datetime;
35+
36+
public java.time.ZonedDateTime getDatetime() {
37+
return datetime;
38+
}
39+
40+
public void setDatetime(java.time.ZonedDateTime datetime) {
41+
this.datetime = datetime;
42+
}
43+
3144
@com.fasterxml.jackson.annotation.JsonProperty("image")
3245
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SKIP)
3346
private String image;

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","datetime","image","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()
@@ -62,6 +62,19 @@ public class CronTabSpec implements io.fabric8.kubernetes.api.model.KubernetesRe
6262
this.cronSpec = cronSpec;
6363
}
6464

65+
@com.fasterxml.jackson.annotation.JsonProperty("datetime")
66+
@com.fasterxml.jackson.annotation.JsonFormat(timezone = "UTC", pattern = "yyyy-MM-dd'T'HH:mm:ssX")
67+
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SKIP)
68+
private java.time.ZonedDateTime datetime;
69+
70+
public java.time.ZonedDateTime getDatetime() {
71+
return datetime;
72+
}
73+
74+
public void setDatetime(java.time.ZonedDateTime datetime) {
75+
this.datetime = datetime;
76+
}
77+
6578
@com.fasterxml.jackson.annotation.JsonProperty("image")
6679
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SKIP)
6780
private String image;

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

java-generator/it/src/it/enum-ser-deser/src/test/resources/cert-manager.crds.1.7.1.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ spec:
9292
- issuerRef
9393
- request
9494
properties:
95+
datetime:
96+
format: date-time
97+
type: string
9598
duration:
9699
description: The requested 'duration' (i.e. lifetime) of the Certificate. This option may be ignored/overridden by some issuer types.
97100
type: string

0 commit comments

Comments
 (0)