summaryrefslogtreecommitdiff
path: root/sources/core/VSTask.java
blob: d4813004c1da8252d10bf4d3fac82681d351dc54 (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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package core;

import prefs.VSPrefs;
import events.*;
import protocols.VSProtocol;
import simulator.*;

public class VSTask {
    //public final static int RUN_ON_CLIENT_START = 1;
    private long taskTime;
    private VSEvent event;
    private VSProcess process;
    private VSPrefs prefs;
    private boolean isProgrammed;

    public VSTask(long taskTime, VSProcess process, VSEvent event) {
        this.process = process;
        this.taskTime = taskTime > 0 ? taskTime : 0;
        this.event = event;
        this.prefs = process.getPrefs();
    }

    public void isProgrammed(boolean isProgrammed) {
        this.isProgrammed = isProgrammed;
    }

    public boolean isProgrammed() {
        return isProgrammed;
    }

    public boolean isMessage() {
        return event instanceof VSMessage;
    }

    public boolean isProtocol(VSProtocol protocol) {
        if (event instanceof VSProtocol)
            return ((VSProtocol) event).equals(protocol);

        return false;
    }

    public boolean isGlobalTimed() {
        if (event instanceof VSProtocol)
            return false;

        return true;
    }

    public VSProcess getProcess() {
        return process;
    }

    public void run() {
        if (process.isCrashed())
            return;

        if (event instanceof VSMessage) {
            onMessageRecv();

        } else if (event instanceof VSProtocol) {
            /* Lamport time will get incremented by the VSProtocol class */
            onProtocolStart();

        } else if (event instanceof VSProcessEvent) {
            onProcessEventStart();

        } else {
            onDummy();
        }
    }

    private void onDummy() {
        logg(prefs.getString("lang.process.task"));
    }

    /**
     * If the process recv a message, check if the message's protocol is activated
     * by the process. If yes, run the protocol on the message! If not, just logg
     * that the process does not support this protocol! The process will ignore the
     * message!
     */
    private void onMessageRecv() {
        final VSMessage message = (VSMessage) event;
        final String protocolName = message.getProtocolName();
        final String protocolClassname = message.getProtocolClassname();

        process.updateLamportTime(message.getLamportTime()+1);
        process.updateVectorTime(message.getVectorTime());

        Object protocolObj;

        if (process.objectExists(protocolClassname))
            protocolObj = process.getObject(protocolClassname);
        else
            protocolObj = null;

        String loggVSMessage = prefs.getString("lang.message.recv")
                               + "; " + prefs.getString("lang.protocol") + ": " + protocolName
                               + "; " + prefs.getString("lang.message") + " " + message;

        if (protocolObj == null) {
            logg(loggVSMessage);

        } else {
            final VSProtocol protocol = (VSProtocol) protocolObj;
            logg(loggVSMessage);
            protocol.onMessageRecv(message);
        }
    }

    private void onProtocolStart() {
        ((VSProtocol) event).onStart();
    }

    private void onProcessEventStart() {
        final VSProcessEvent processEvent = (VSProcessEvent) event;
        processEvent.onStart();
    }

    public long getTaskTime() {
        return taskTime;
    }

    public VSEvent getEvent() {
        return event;
    }

    private void logg(String message) {
        process.logg(message);
    }

    public String toString() {
        String descr = "VSTask: " + getTaskTime();

        if (event instanceof VSMessage)
            descr += (VSMessage) event;

        else if (event instanceof VSProtocol)
            descr += (VSProtocol) event;

        return descr;
    }
}