1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
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.
*
* <p>This class allows you to create events that trigger based on Lamport logical time.
* You can specify conditions such as:</p>
* <ul>
* <li>Fire when Lamport time equals 10</li>
* <li>Fire when Lamport time reaches 50 or greater</li>
* <li>Fire when Lamport time is less than 5</li>
* </ul>
*
* <p>Example usage:</p>
* <pre>{@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!");
* });
* }</pre>
*
* @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";
}
}
|