package events.implementations; import core.VSInternalProcess; /** * Concrete implementation of a Lamport timestamp-triggered event. * This event fires when a specific Lamport timestamp condition is met. * *

This class allows you to create events that trigger based on Lamport logical time. * You can specify conditions such as:

* * *

Example usage:

*
{@code
 * // Create event that fires when Lamport time reaches 100
 * VSLamportTimestampEvent event = new VSLamportTimestampEvent(
 *     100, ComparisonOperator.GREATER_EQUAL, "Checkpoint reached");
 * 
 * // Add custom action
 * event.setCustomAction(() -> {
 *     System.out.println("Lamport time 100 reached!");
 * });
 * }
* * @see VSTimestampTriggeredEvent * @see VSTimestampMonitorEvent * @author Paul C. Buetow */ public class VSLamportTimestampEvent extends VSTimestampTriggeredEvent { private String actionDescription; private Runnable customAction; /** * Constructor for basic Lamport timestamp event */ public VSLamportTimestampEvent(long targetLamport, ComparisonOperator op) { super(targetLamport, op); this.actionDescription = "Lamport timestamp condition met"; } /** * Constructor with custom action description */ public VSLamportTimestampEvent(long targetLamport, ComparisonOperator op, String description) { super(targetLamport, op); this.actionDescription = description; } /** * Constructor with custom action */ public VSLamportTimestampEvent(long targetLamport, ComparisonOperator op, String description, Runnable action) { super(targetLamport, op); this.actionDescription = description; this.customAction = action; } /** * Default constructor for serialization */ public VSLamportTimestampEvent() { super(); this.actionDescription = "Lamport timestamp event"; } @Override public void onInit() { super.onInit(); } @Override protected void onTimestampReached() { VSInternalProcess internalProcess = (VSInternalProcess) process; // Log the event String message = String.format("Lamport timestamp event triggered: %s (current: %d, target: %d %s)", actionDescription, internalProcess.getLamportTime(), targetLamportTime, operator); internalProcess.log(message); // Execute custom action if provided if (customAction != null) { try { customAction.run(); } catch (RuntimeException e) { // Log the error but don't let it stop the event processing internalProcess.log("Error executing custom action: " + e.getMessage()); exceptions.VSErrorHandler.warning("Lamport timestamp event custom action failed", e); } } // Default behavior: change process color to indicate trigger changeProcessColor(); } /** * Change process color to indicate the timestamp event has been triggered */ protected void changeProcessColor() { if (process instanceof VSInternalProcess) { VSInternalProcess internalProcess = (VSInternalProcess) process; // Change to highlight color temporarily internalProcess.highlightOn(); } } @Override public String toString() { return String.format(" [LamportTrigger: %d %s - %s]", targetLamportTime, operator, actionDescription); } // Getters and setters public String getActionDescription() { return actionDescription; } public void setActionDescription(String description) { this.actionDescription = description; } public void setCustomAction(Runnable action) { this.customAction = action; } @Override protected String createShortname(String savedShortname) { return "LamportTrigger"; } }