Skip to content

Commit 6001658

Browse files
committed
issue #334 - move microsecond truncation logic to ModelSupport
per feedback from john Signed-off-by: Lee Surprenant <lmsurpre@us.ibm.com>
1 parent 2b358e1 commit 6001658

4 files changed

Lines changed: 37 additions & 18 deletions

File tree

fhir-model/src/main/java/com/ibm/fhir/model/type/DateTime.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import javax.annotation.Generated;
2323

24+
import com.ibm.fhir.model.util.ModelSupport;
2425
import com.ibm.fhir.model.util.ValidationSupport;
2526
import com.ibm.fhir.model.visitor.Visitor;
2627

@@ -39,13 +40,7 @@ public class DateTime extends Element {
3940

4041
private DateTime(Builder builder) {
4142
super(builder);
42-
if (builder.value instanceof java.time.Instant) {
43-
value = ((java.time.Instant) builder.value).truncatedTo(ChronoUnit.MICROS);
44-
} else if (builder.value instanceof ZonedDateTime) {
45-
value = ((ZonedDateTime) builder.value).truncatedTo(ChronoUnit.MICROS);
46-
} else {
47-
value = builder.value;
48-
}
43+
value = ModelSupport.truncateTime(builder.value, ChronoUnit.MICROS);
4944
ValidationSupport.checkValueType(value, ZonedDateTime.class, LocalDate.class, YearMonth.class, Year.class);
5045
ValidationSupport.requireValueOrChildren(this);
5146
}

fhir-model/src/main/java/com/ibm/fhir/model/type/Instant.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import javax.annotation.Generated;
1919

20+
import com.ibm.fhir.model.util.ModelSupport;
2021
import com.ibm.fhir.model.util.ValidationSupport;
2122
import com.ibm.fhir.model.visitor.Visitor;
2223

@@ -33,7 +34,7 @@ public class Instant extends Element {
3334

3435
private Instant(Builder builder) {
3536
super(builder);
36-
value = builder.value == null ? null : builder.value.truncatedTo(ChronoUnit.MICROS);
37+
value = ModelSupport.truncateTime(builder.value, ChronoUnit.MICROS);
3738
ValidationSupport.requireValueOrChildren(this);
3839
}
3940

fhir-model/src/main/java/com/ibm/fhir/model/util/ModelSupport.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@
1414
import java.lang.reflect.ParameterizedType;
1515
import java.lang.reflect.Type;
1616
import java.nio.charset.StandardCharsets;
17+
import java.time.LocalDateTime;
18+
import java.time.LocalTime;
19+
import java.time.OffsetDateTime;
20+
import java.time.OffsetTime;
21+
import java.time.ZonedDateTime;
22+
import java.time.temporal.ChronoUnit;
23+
import java.time.temporal.TemporalAccessor;
1724
import java.util.ArrayList;
1825
import java.util.Arrays;
1926
import java.util.Collection;
@@ -568,4 +575,26 @@ public static boolean isSummaryElement(Class<?> modelClass, String elementName)
568575
}
569576
return false;
570577
}
578+
579+
public static ZonedDateTime truncateTime(ZonedDateTime dateTime, ChronoUnit unit) {
580+
return dateTime == null ? null : dateTime.truncatedTo(unit);
581+
}
582+
583+
public static TemporalAccessor truncateTime(TemporalAccessor ta, ChronoUnit unit) {
584+
if (ta instanceof java.time.Instant) {
585+
ta = ((java.time.Instant) ta).truncatedTo(unit);
586+
} else if (ta instanceof ZonedDateTime) {
587+
ta = ((ZonedDateTime) ta).truncatedTo(unit);
588+
} else if (ta instanceof LocalDateTime) {
589+
ta = ((LocalDateTime) ta).truncatedTo(unit);
590+
} else if (ta instanceof LocalTime) {
591+
ta = ((LocalTime) ta).truncatedTo(unit);
592+
} else if (ta instanceof OffsetTime) {
593+
ta = ((OffsetTime) ta).truncatedTo(unit);
594+
} else if (ta instanceof OffsetDateTime) {
595+
ta = ((OffsetDateTime) ta).truncatedTo(unit);
596+
}
597+
598+
return ta;
599+
}
571600
}

fhir-tools/src/main/java/com/ibm/fhir/tools/CodeGenerator.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -998,16 +998,9 @@ private void generateClass(JsonObject structureDefinition, List<String> paths, C
998998
cb.assign(fieldName, "ValidationSupport.choiceElement(builder." + fieldName + ", " + quote(elementName) + ", " + types + ")");
999999
} else {
10001000
// Instant and DateTime values require special handling
1001-
if (isInstant(structureDefinition) && "value".equals(fieldName)) {
1002-
cb.assign(fieldName, "builder.value == null ? null : builder.value.truncatedTo(ChronoUnit.MICROS)");
1003-
} else if (isDateTime(structureDefinition) && "value".equals(fieldName)) {
1004-
cb._if("builder.value instanceof java.time.Instant")
1005-
.assign(fieldName, "((java.time.Instant) builder.value).truncatedTo(ChronoUnit.MICROS)")
1006-
._elseif("builder.value instanceof ZonedDateTime")
1007-
.assign(fieldName, "((ZonedDateTime) builder.value).truncatedTo(ChronoUnit.MICROS)")
1008-
._else()
1009-
.assign(fieldName, "builder." + fieldName)
1010-
.end();
1001+
if ((isInstant(structureDefinition) || isDateTime(structureDefinition))
1002+
&& "value".equals(fieldName)) {
1003+
cb.assign(fieldName, "ModelSupport.truncateTime(builder.value, ChronoUnit.MICROS)");
10111004
} else {
10121005
cb.assign(fieldName, "builder." + fieldName);
10131006
}
@@ -1603,6 +1596,7 @@ private void generateImports(JsonObject structureDefinition, String className, C
16031596
if (isDateTime(structureDefinition) || isInstant(structureDefinition)) {
16041597
imports.add("java.time.ZonedDateTime");
16051598
imports.add("java.time.temporal.ChronoUnit");
1599+
imports.add("com.ibm.fhir.model.util.ModelSupport");
16061600
}
16071601

16081602
if (isTime(structureDefinition)) {

0 commit comments

Comments
 (0)