From 630f5a4dc444219a9fa72f3d67c4fff337cbf3ea Mon Sep 17 00:00:00 2001 From: command-line Date: Sun, 3 Mar 2024 11:45:34 +0000 Subject: [PATCH] add race tracker example --- .../cookbook/racing/RaceCalculator.java | 60 +++ .../racing/RaceCalculatorAotBuilder.java | 22 + .../cookbook/racing/RaceCalculatorApp.java | 28 ++ .../generated/RaceCalculatorProcessor.java | 386 ++++++++++++++++++ .../generated/RaceCalculatorProcessor.graphml | 127 ++++++ .../generated/RaceCalculatorProcessor.png | Bin 0 -> 39349 bytes 6 files changed, 623 insertions(+) create mode 100644 cookbook/src/main/java/com/fluxtion/example/cookbook/racing/RaceCalculator.java create mode 100644 cookbook/src/main/java/com/fluxtion/example/cookbook/racing/RaceCalculatorAotBuilder.java create mode 100644 cookbook/src/main/java/com/fluxtion/example/cookbook/racing/RaceCalculatorApp.java create mode 100644 cookbook/src/main/java/com/fluxtion/example/cookbook/racing/generated/RaceCalculatorProcessor.java create mode 100644 cookbook/src/main/resources/com/fluxtion/example/cookbook/racing/generated/RaceCalculatorProcessor.graphml create mode 100644 cookbook/src/main/resources/com/fluxtion/example/cookbook/racing/generated/RaceCalculatorProcessor.png diff --git a/cookbook/src/main/java/com/fluxtion/example/cookbook/racing/RaceCalculator.java b/cookbook/src/main/java/com/fluxtion/example/cookbook/racing/RaceCalculator.java new file mode 100644 index 0000000..dcb1ab5 --- /dev/null +++ b/cookbook/src/main/java/com/fluxtion/example/cookbook/racing/RaceCalculator.java @@ -0,0 +1,60 @@ +package com.fluxtion.example.cookbook.racing; + +import com.fluxtion.runtime.annotations.ExportService; +import com.fluxtion.runtime.annotations.OnEventHandler; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.time.Instant; +import java.util.HashMap; +import java.util.Map; + +public class RaceCalculator { + + public record RunnerStarted(long runnerId, Instant startTime) { + } + + public record RunnerFinished(long runnerId, Instant finishTime) { + } + + public interface ResultsPublisher { + void publishAllResults(); + } + + @Getter + public static class RaceTimeTracker { + + private final transient Map runnerRaceTimeMap = new HashMap<>(); + + @OnEventHandler(propagate = false) + public boolean runnerStarted(RunnerStarted runnerStarted) { + //add runner start time to map + return false; + } + + @OnEventHandler + public boolean runnerFinished(RunnerFinished runnerFinished) { + //calc runner total race time and add to map + return true; + } + } + + @RequiredArgsConstructor + public static class ResultsPublisherImpl implements @ExportService ResultsPublisher{ + + private final RaceTimeTracker raceTimeTracker; + + @OnEventHandler(propagate = false) + public boolean runnerFinished(RunnerFinished runnerFinished) { + //get the runner race time and send individual their results + long raceTime = raceTimeTracker.getRunnerRaceTimeMap().get(runnerFinished.runnerId()); + return false; + } + + @Override + public void publishAllResults() { + //get all results and publish + var runnerRaceTimeMap = raceTimeTracker.getRunnerRaceTimeMap(); + } + } +} diff --git a/cookbook/src/main/java/com/fluxtion/example/cookbook/racing/RaceCalculatorAotBuilder.java b/cookbook/src/main/java/com/fluxtion/example/cookbook/racing/RaceCalculatorAotBuilder.java new file mode 100644 index 0000000..c0c2be1 --- /dev/null +++ b/cookbook/src/main/java/com/fluxtion/example/cookbook/racing/RaceCalculatorAotBuilder.java @@ -0,0 +1,22 @@ +package com.fluxtion.example.cookbook.racing; + +import com.fluxtion.compiler.EventProcessorConfig; +import com.fluxtion.compiler.FluxtionCompilerConfig; +import com.fluxtion.compiler.FluxtionGraphBuilder; +import com.fluxtion.example.cookbook.racing.RaceCalculator.RaceTimeTracker; +import com.fluxtion.example.cookbook.racing.RaceCalculator.ResultsPublisherImpl; + +public class RaceCalculatorAotBuilder implements FluxtionGraphBuilder { + @Override + public void buildGraph(EventProcessorConfig eventProcessorConfig) { + RaceTimeTracker raceCalculator = eventProcessorConfig.addNode(new RaceTimeTracker(), "raceCalculator"); + eventProcessorConfig.addNode(new ResultsPublisherImpl(raceCalculator), "resultsPublisher"); + } + + @Override + public void configureGeneration(FluxtionCompilerConfig fluxtionCompilerConfig) { + fluxtionCompilerConfig.setClassName("RaceCalculatorProcessor"); + fluxtionCompilerConfig.setPackageName("com.fluxtion.example.cookbook.racing.generated"); + } +} + diff --git a/cookbook/src/main/java/com/fluxtion/example/cookbook/racing/RaceCalculatorApp.java b/cookbook/src/main/java/com/fluxtion/example/cookbook/racing/RaceCalculatorApp.java new file mode 100644 index 0000000..cfae436 --- /dev/null +++ b/cookbook/src/main/java/com/fluxtion/example/cookbook/racing/RaceCalculatorApp.java @@ -0,0 +1,28 @@ +package com.fluxtion.example.cookbook.racing; + +import com.fluxtion.example.cookbook.racing.generated.RaceCalculatorProcessor; + +import java.time.Instant; + +import static com.fluxtion.example.cookbook.racing.RaceCalculator.*; + +public class RaceCalculatorApp { + public static void main(String[] args) { + RaceCalculatorProcessor raceCalculatorProcessor = new RaceCalculatorProcessor(); + raceCalculatorProcessor.init(); + + ResultsPublisher resultsPublisher = raceCalculatorProcessor.getExportedService(); + + //connect to event stream and process runner timing events + raceCalculatorProcessor.onEvent(new RunnerStarted(1, Instant.now())); + raceCalculatorProcessor.onEvent(new RunnerStarted(2, Instant.now())); + raceCalculatorProcessor.onEvent(new RunnerStarted(3, Instant.now())); + + raceCalculatorProcessor.onEvent(new RunnerFinished(2, Instant.now())); + raceCalculatorProcessor.onEvent(new RunnerFinished(3, Instant.now())); + raceCalculatorProcessor.onEvent(new RunnerFinished(1, Instant.now())); + + //publish full results + resultsPublisher.publishAllResults(); + } +} diff --git a/cookbook/src/main/java/com/fluxtion/example/cookbook/racing/generated/RaceCalculatorProcessor.java b/cookbook/src/main/java/com/fluxtion/example/cookbook/racing/generated/RaceCalculatorProcessor.java new file mode 100644 index 0000000..9f1a707 --- /dev/null +++ b/cookbook/src/main/java/com/fluxtion/example/cookbook/racing/generated/RaceCalculatorProcessor.java @@ -0,0 +1,386 @@ +/* +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the Server Side Public License, version 1, +* as published by MongoDB, Inc. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* Server Side License for more details. +* +* You should have received a copy of the Server Side Public License +* along with this program. If not, see +* +. +*/ +package com.fluxtion.example.cookbook.racing.generated; + +import com.fluxtion.runtime.StaticEventProcessor; +import com.fluxtion.runtime.lifecycle.BatchHandler; +import com.fluxtion.runtime.lifecycle.Lifecycle; +import com.fluxtion.runtime.EventProcessor; +import com.fluxtion.runtime.callback.InternalEventProcessor; +import com.fluxtion.example.cookbook.racing.RaceCalculator.RaceTimeTracker; +import com.fluxtion.example.cookbook.racing.RaceCalculator.ResultsPublisher; +import com.fluxtion.example.cookbook.racing.RaceCalculator.ResultsPublisherImpl; +import com.fluxtion.example.cookbook.racing.RaceCalculator.RunnerFinished; +import com.fluxtion.example.cookbook.racing.RaceCalculator.RunnerStarted; +import com.fluxtion.runtime.EventProcessorContext; +import com.fluxtion.runtime.audit.Auditor; +import com.fluxtion.runtime.audit.EventLogManager; +import com.fluxtion.runtime.audit.NodeNameAuditor; +import com.fluxtion.runtime.callback.CallbackDispatcherImpl; +import com.fluxtion.runtime.callback.ExportFunctionAuditEvent; +import com.fluxtion.runtime.event.Event; +import com.fluxtion.runtime.input.EventFeed; +import com.fluxtion.runtime.input.SubscriptionManagerNode; +import com.fluxtion.runtime.node.ForkedTriggerTask; +import com.fluxtion.runtime.node.MutableEventProcessorContext; +import com.fluxtion.runtime.time.Clock; +import com.fluxtion.runtime.time.ClockStrategy.ClockStrategyEvent; +import java.util.Map; + +import java.util.IdentityHashMap; +import java.util.function.BooleanSupplier; +import java.util.function.Consumer; + +/** + * + * + *
+ * generation time                 : Not available
+ * eventProcessorGenerator version : 9.2.17
+ * api version                     : 9.2.17
+ * 
+ * + * Event classes supported: + * + *
    + *
  • com.fluxtion.compiler.generation.model.ExportFunctionMarker + *
  • com.fluxtion.example.cookbook.racing.RaceCalculator.RunnerFinished + *
  • com.fluxtion.example.cookbook.racing.RaceCalculator.RunnerStarted + *
  • com.fluxtion.runtime.time.ClockStrategy.ClockStrategyEvent + *
+ * + * @author Greg Higgins + */ +@SuppressWarnings({"unchecked", "rawtypes"}) +public class RaceCalculatorProcessor + implements EventProcessor, + StaticEventProcessor, + InternalEventProcessor, + BatchHandler, + Lifecycle, + ResultsPublisher { + + // Node declarations + private final CallbackDispatcherImpl callbackDispatcher = new CallbackDispatcherImpl(); + public final NodeNameAuditor nodeNameLookup = new NodeNameAuditor(); + public final RaceTimeTracker raceCalculator = new RaceTimeTracker(); + public final ResultsPublisherImpl resultsPublisher = new ResultsPublisherImpl(raceCalculator); + private final SubscriptionManagerNode subscriptionManager = new SubscriptionManagerNode(); + private final MutableEventProcessorContext context = + new MutableEventProcessorContext( + nodeNameLookup, callbackDispatcher, subscriptionManager, callbackDispatcher); + public final Clock clock = new Clock(); + private final ExportFunctionAuditEvent functionAudit = new ExportFunctionAuditEvent(); + // Dirty flags + private boolean initCalled = false; + private boolean processing = false; + private boolean buffering = false; + private final IdentityHashMap dirtyFlagSupplierMap = + new IdentityHashMap<>(1); + private final IdentityHashMap> dirtyFlagUpdateMap = + new IdentityHashMap<>(1); + + private boolean isDirty_raceCalculator = false; + // Forked declarations + + // Filter constants + + public RaceCalculatorProcessor(Map contextMap) { + context.replaceMappings(contextMap); + // node auditors + initialiseAuditor(clock); + initialiseAuditor(nodeNameLookup); + subscriptionManager.setSubscribingEventProcessor(this); + context.setEventProcessorCallback(this); + } + + public RaceCalculatorProcessor() { + this(null); + } + + @Override + public void init() { + initCalled = true; + auditEvent(Lifecycle.LifecycleEvent.Init); + // initialise dirty lookup map + isDirty("test"); + clock.init(); + afterEvent(); + } + + @Override + public void start() { + if (!initCalled) { + throw new RuntimeException("init() must be called before start()"); + } + processing = true; + auditEvent(Lifecycle.LifecycleEvent.Start); + + afterEvent(); + callbackDispatcher.dispatchQueuedCallbacks(); + processing = false; + } + + @Override + public void stop() { + if (!initCalled) { + throw new RuntimeException("init() must be called before stop()"); + } + processing = true; + auditEvent(Lifecycle.LifecycleEvent.Stop); + + afterEvent(); + callbackDispatcher.dispatchQueuedCallbacks(); + processing = false; + } + + @Override + public void tearDown() { + initCalled = false; + auditEvent(Lifecycle.LifecycleEvent.TearDown); + nodeNameLookup.tearDown(); + clock.tearDown(); + subscriptionManager.tearDown(); + afterEvent(); + } + + @Override + public void setContextParameterMap(Map newContextMapping) { + context.replaceMappings(newContextMapping); + } + + @Override + public void addContextParameter(Object key, Object value) { + context.addMapping(key, value); + } + + // EVENT DISPATCH - START + @Override + public void onEvent(Object event) { + if (buffering) { + triggerCalculation(); + } + if (processing) { + callbackDispatcher.processReentrantEvent(event); + } else { + processing = true; + onEventInternal(event); + callbackDispatcher.dispatchQueuedCallbacks(); + processing = false; + } + } + + @Override + public void onEventInternal(Object event) { + if (event instanceof com.fluxtion.example.cookbook.racing.RaceCalculator.RunnerFinished) { + RunnerFinished typedEvent = (RunnerFinished) event; + handleEvent(typedEvent); + } else if (event instanceof com.fluxtion.example.cookbook.racing.RaceCalculator.RunnerStarted) { + RunnerStarted typedEvent = (RunnerStarted) event; + handleEvent(typedEvent); + } else if (event instanceof com.fluxtion.runtime.time.ClockStrategy.ClockStrategyEvent) { + ClockStrategyEvent typedEvent = (ClockStrategyEvent) event; + handleEvent(typedEvent); + } + } + + public void handleEvent(RunnerFinished typedEvent) { + auditEvent(typedEvent); + // Default, no filter methods + isDirty_raceCalculator = raceCalculator.runnerFinished(typedEvent); + resultsPublisher.runnerFinished(typedEvent); + afterEvent(); + } + + public void handleEvent(RunnerStarted typedEvent) { + auditEvent(typedEvent); + // Default, no filter methods + isDirty_raceCalculator = raceCalculator.runnerStarted(typedEvent); + afterEvent(); + } + + public void handleEvent(ClockStrategyEvent typedEvent) { + auditEvent(typedEvent); + // Default, no filter methods + clock.setClockStrategy(typedEvent); + afterEvent(); + } + // EVENT DISPATCH - END + + // EXPORTED SERVICE FUNCTIONS - START + @Override + public void publishAllResults() { + beforeServiceCall( + "public void com.fluxtion.example.cookbook.racing.RaceCalculator$ResultsPublisherImpl.publishAllResults()"); + ExportFunctionAuditEvent typedEvent = functionAudit; + resultsPublisher.publishAllResults(); + afterServiceCall(); + } + // EXPORTED SERVICE FUNCTIONS - END + + public void bufferEvent(Object event) { + buffering = true; + if (event instanceof com.fluxtion.example.cookbook.racing.RaceCalculator.RunnerFinished) { + RunnerFinished typedEvent = (RunnerFinished) event; + auditEvent(typedEvent); + isDirty_raceCalculator = raceCalculator.runnerFinished(typedEvent); + resultsPublisher.runnerFinished(typedEvent); + } else if (event instanceof com.fluxtion.example.cookbook.racing.RaceCalculator.RunnerStarted) { + RunnerStarted typedEvent = (RunnerStarted) event; + auditEvent(typedEvent); + isDirty_raceCalculator = raceCalculator.runnerStarted(typedEvent); + } else if (event instanceof com.fluxtion.runtime.time.ClockStrategy.ClockStrategyEvent) { + ClockStrategyEvent typedEvent = (ClockStrategyEvent) event; + auditEvent(typedEvent); + clock.setClockStrategy(typedEvent); + } + } + + public void triggerCalculation() { + buffering = false; + String typedEvent = "No event information - buffered dispatch"; + afterEvent(); + } + + private void auditEvent(Object typedEvent) { + clock.eventReceived(typedEvent); + nodeNameLookup.eventReceived(typedEvent); + } + + private void auditEvent(Event typedEvent) { + clock.eventReceived(typedEvent); + nodeNameLookup.eventReceived(typedEvent); + } + + private void initialiseAuditor(Auditor auditor) { + auditor.init(); + auditor.nodeRegistered(raceCalculator, "raceCalculator"); + auditor.nodeRegistered(resultsPublisher, "resultsPublisher"); + auditor.nodeRegistered(callbackDispatcher, "callbackDispatcher"); + auditor.nodeRegistered(subscriptionManager, "subscriptionManager"); + auditor.nodeRegistered(context, "context"); + } + + private void beforeServiceCall(String functionDescription) { + functionAudit.setFunctionDescription(functionDescription); + auditEvent(functionAudit); + if (buffering) { + triggerCalculation(); + } + processing = true; + } + + private void afterServiceCall() { + afterEvent(); + callbackDispatcher.dispatchQueuedCallbacks(); + processing = false; + } + + private void afterEvent() { + + clock.processingComplete(); + nodeNameLookup.processingComplete(); + isDirty_raceCalculator = false; + } + + @Override + public void batchPause() { + auditEvent(Lifecycle.LifecycleEvent.BatchPause); + processing = true; + + afterEvent(); + callbackDispatcher.dispatchQueuedCallbacks(); + processing = false; + } + + @Override + public void batchEnd() { + auditEvent(Lifecycle.LifecycleEvent.BatchEnd); + processing = true; + + afterEvent(); + callbackDispatcher.dispatchQueuedCallbacks(); + processing = false; + } + + @Override + public boolean isDirty(Object node) { + return dirtySupplier(node).getAsBoolean(); + } + + @Override + public BooleanSupplier dirtySupplier(Object node) { + if (dirtyFlagSupplierMap.isEmpty()) { + dirtyFlagSupplierMap.put(raceCalculator, () -> isDirty_raceCalculator); + } + return dirtyFlagSupplierMap.getOrDefault(node, StaticEventProcessor.ALWAYS_FALSE); + } + + @Override + public void setDirty(Object node, boolean dirtyFlag) { + if (dirtyFlagUpdateMap.isEmpty()) { + dirtyFlagUpdateMap.put(raceCalculator, (b) -> isDirty_raceCalculator = b); + } + dirtyFlagUpdateMap.get(node).accept(dirtyFlag); + } + + private boolean guardCheck_resultsPublisher() { + return isDirty_raceCalculator; + } + + @Override + public T getNodeById(String id) throws NoSuchFieldException { + return nodeNameLookup.getInstanceById(id); + } + + @Override + public A getAuditorById(String id) + throws NoSuchFieldException, IllegalAccessException { + return (A) this.getClass().getField(id).get(this); + } + + @Override + public void addEventFeed(EventFeed eventProcessorFeed) { + subscriptionManager.addEventProcessorFeed(eventProcessorFeed); + } + + @Override + public void removeEventFeed(EventFeed eventProcessorFeed) { + subscriptionManager.removeEventProcessorFeed(eventProcessorFeed); + } + + @Override + public RaceCalculatorProcessor newInstance() { + return new RaceCalculatorProcessor(); + } + + @Override + public RaceCalculatorProcessor newInstance(Map contextMap) { + return new RaceCalculatorProcessor(); + } + + @Override + public String getLastAuditLogRecord() { + try { + EventLogManager eventLogManager = + (EventLogManager) this.getClass().getField(EventLogManager.NODE_NAME).get(this); + return eventLogManager.lastRecordAsString(); + } catch (Throwable e) { + return ""; + } + } +} diff --git a/cookbook/src/main/resources/com/fluxtion/example/cookbook/racing/generated/RaceCalculatorProcessor.graphml b/cookbook/src/main/resources/com/fluxtion/example/cookbook/racing/generated/RaceCalculatorProcessor.graphml new file mode 100644 index 0000000..17d0415 --- /dev/null +++ b/cookbook/src/main/resources/com/fluxtion/example/cookbook/racing/generated/RaceCalculatorProcessor.graphml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cookbook/src/main/resources/com/fluxtion/example/cookbook/racing/generated/RaceCalculatorProcessor.png b/cookbook/src/main/resources/com/fluxtion/example/cookbook/racing/generated/RaceCalculatorProcessor.png new file mode 100644 index 0000000000000000000000000000000000000000..c1a5a29fc7f8991270a9dd8a24992bab90a8d426 GIT binary patch literal 39349 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 N%EHdP{HV``{{kZNsVD#d literal 0 HcmV?d00001