summaryrefslogtreecommitdiff
path: root/src/main/java/events/implementations/VSLamportTimestampEvent.java
blob: 272ea0629b73364dfccea1ccd3fa2e9daa3b0c82 (plain)
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";
    }
}