1111import io.teaql.core.businessid.BusinessIdKeyProvider;
1212import io.teaql.core.businessid.BusinessIdSchemaContributor;
1313import io.teaql.core.businessid.BusinessIdService;
14+ import io.teaql.core.businessid.BusinessClock;
1415import io.teaql.runtime.businessid.DefaultBusinessIdService;
1516import io.teaql.core.reference.RoundTripReferenceCodec;
1617import io.teaql.core.reference.RoundTripReferenceProvider;
18+ import io.teaql.runtime.businessid.SystemBusinessClock;
1719import java.util.*;
1820import java.util.stream.Stream;
1921
@@ -31,6 +33,7 @@ public class TeaQLRuntime {
3133 private final BusinessIdSchemaContributor businessIdSchemaContributor;
3234 private final BusinessIdKeyProvider businessIdKeyProvider;
3335 private final RoundTripReferenceCodec roundTripReferenceCodec;
36+ private final BusinessClock businessClock;
3437 private final Map<String, Checker<?>> checkers = new java.util.concurrent.ConcurrentHashMap<>();
3538 private final List<GeneratedSchemaBootstrap> generatedBootstraps =
3639 new java.util.concurrent.CopyOnWriteArrayList<>();
@@ -51,6 +54,7 @@ private TeaQLRuntime(Builder builder) {
5154 this.roundTripReferenceCodec = builder.roundTripReferenceProvider == null
5255 ? null
5356 : new RoundTripReferenceCodec(builder.roundTripReferenceProvider);
57+ this.businessClock = builder.businessClock;
5458 }
5559
5660 public static Builder builder() {
@@ -101,6 +105,10 @@ BusinessIdService getBusinessIdService() {
101105 return businessIdService;
102106 }
103107
108+ BusinessClock getBusinessClock() {
109+ return businessClock;
110+ }
111+
104112 BusinessIdSchemaContributor getBusinessIdSchemaContributor() {
105113 return businessIdSchemaContributor;
106114 }
@@ -524,7 +532,7 @@ private void checkAndFix(UserContext context, Entity entity) {
524532 context.beginFixEvidence();
525533 boolean ownsFixTime = context.getAttribute(Checker.TEAQL_FIX_TIME) == null;
526534 if (ownsFixTime) {
527- context.putAttribute(Checker.TEAQL_FIX_TIME, java.time.LocalDateTime.now ());
535+ context.putAttribute(Checker.TEAQL_FIX_TIME, context.businessTime ());
528536 }
529537 try {
530538 checker.checkAndFix(context, (BaseEntity) entity);
@@ -1007,6 +1015,7 @@ public static class Builder {
10071015 private BusinessIdSchemaContributor businessIdSchemaContributor;
10081016 private BusinessIdKeyProvider businessIdKeyProvider;
10091017 private RoundTripReferenceProvider roundTripReferenceProvider;
1018+ private BusinessClock businessClock = SystemBusinessClock.INSTANCE;
10101019
10111020 public Builder metadata(EntityMetaFactory metadata) {
10121021 this.metadata = metadata;
@@ -1045,6 +1054,12 @@ public Builder businessIdService(BusinessIdService businessIdService) {
10451054 return this;
10461055 }
10471056
1057+ /** Installs the time source visible to domain behavior in each context. */
1058+ public Builder businessClock(BusinessClock businessClock) {
1059+ this.businessClock = java.util.Objects.requireNonNull(businessClock, "businessClock");
1060+ return this;
1061+ }
1062+
10481063 /**
10491064 * Installs one provider-backed allocator for generated Fix execution and
10501065 * the explicit {@code context.ensureSchema()} lifecycle.
0 commit comments