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
|
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.
*
* Example usage:
* - Fire when Lamport time equals 10
* - Fire when Lamport time reaches 50 or greater
* - Fire when Lamport time is less than 5
*
* @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 (Exception e) {
internalProcess.log("Error executing custom action: " + e.getMessage());
}
}
// 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";
}
}
|