-
Notifications
You must be signed in to change notification settings - Fork 0
/
messages.py
152 lines (113 loc) · 4.25 KB
/
messages.py
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
145
146
147
148
149
150
151
152
from utils import VectClock
""" Class
Message: class for messages transmitted between netSite
attribute:
- who: destination of the message,
- fromWho: source of the message,
- messageType: type of the message :
- LockRequestMessage,
- AckMessage,
- ReleaseMessage,
- StateMessage,
- SnapshotRequestMessage
- color: color of the message (and the netSite who send it),
- isPrepost: is this message a prepost ?
- vectClock: vectorized clock of the source of the message (Snapshot Algorithm),
- what: content of the message
method:
- __str__(self) --> "who~fromWho~messageType~color~isPrepost~vectClock~what",
- toPrepost(self) --> return the same message after switching "toPrepost" to "True",
- setColor(self, color) --> setter for color attribute,
- fromString(cls, s) --> get Message instance from a string (static method)
"""
class Message:
def __init__(
self,
who,
fromWho,
messageType,
vectClock,
what
):
self.who = who
self.fromWho = fromWho
self.messageType = messageType
self.color = "white"
self.isPrepost = False
self.vectClock = vectClock
self.what = what
def __str__(self):
return f"{self.who}~" \
f"{self.fromWho}~" \
f"{self.messageType}~" \
f"{self.color}~" \
f"{self.isPrepost}~" \
f"{self.vectClock}~" \
f"{self.what}"
def toPrepost(self):
self.isPrepost = True
return self
def setColor(self, color):
self.color = color
@classmethod
def fromString(cls, s):
content = s.split('~')
m = Message(
content[0],
content[1],
content[2],
VectClock.fromString(content[5]),
content[6]
)
m.color = content[3]
if content[4] == "True":
m.toPrepost()
return m
""" Class
Message --> BroadcastMessage : Message with "All" in who attribute
"""
class BroadcastMessage(Message):
def __init__(self, fromWho, messageType, vectClock, what):
super().__init__("ALL", fromWho, messageType, vectClock, what)
""" Class
BroadcastMessage --> EditMessage : Message with "EditMessage" in messageType attribute
"""
class EditMessage(BroadcastMessage):
def __init__(self, fromWho, vectClock, what):
super().__init__(fromWho, "EditMessage", vectClock, what)
""" Class
BroadcastMessage --> LockRequestMessage : Message with "LockRequestMessage" in type attribute
"""
class LockRequestMessage(BroadcastMessage):
def __init__(self, fromWho, vectClock, stamp):
super().__init__(fromWho, "LockRequestMessage", vectClock, stamp)
""" Class
Message --> AckMessage : Message with "AckMessage" in type attribute
"""
class AckMessage(Message):
def __init__(self, who, fromWho, vectClock, stamp):
super().__init__(who, fromWho, "AckMessage", vectClock, stamp)
""" Class
BroadcastMessage --> ReleaseMessage : Message with "ReleaseMessage" in type attribute
"""
class ReleaseMessage(BroadcastMessage):
def __init__(self, fromWho, vectClock, stamp):
super().__init__(fromWho, "ReleaseMessage", vectClock, stamp)
""" Class
BroadcastMessage --> StateMessage : Message with "StateMessage" in type attribute
"""
class StateMessage(BroadcastMessage):
def __init__(self, fromWho, vectClock, etat):
super().__init__(fromWho, "StateMessage", vectClock, etat)
""" Class
BroadcastMessage --> SnapshotRequestMessage : Message with "SnapshotRequestMessage" in type attribute,
what doesn't matter
"""
class SnapshotRequestMessage(BroadcastMessage):
def __init__(self, fromWho, vectClock):
super().__init__(fromWho, "SnapshotRequestMessage", vectClock, "This is a snapshot request!")
''' class linked to implementation of multiple snapshot
class SnapshotReleaseMessage(BroadcastMessage):
def __init__(self, fromWho, vectClock):
super().__init__(fromWho, "SnapshotReleaseMessage", vectClock, "This is a snapshot release!")
'''