1 | from abc import abstractmethod
|
---|
2 |
|
---|
3 | from geniusweb.actions.Action import Action
|
---|
4 | from geniusweb.actions.PartyId import PartyId
|
---|
5 | from geniusweb.protocol.ProtocolException import ProtocolException
|
---|
6 | from geniusweb.protocol.session.mopac.PartyStates import PartyStates
|
---|
7 | from geniusweb.protocol.session.mopac.phase.Phase import Phase, PHASE_MINTIME, \
|
---|
8 | PHASE_MAXTIME
|
---|
9 | from geniusweb.voting.VotingEvaluator import VotingEvaluator
|
---|
10 |
|
---|
11 |
|
---|
12 | class DefaultPhase(Phase):
|
---|
13 | # deadline for this phase, ms since 1970
|
---|
14 |
|
---|
15 | def __init__(self, partyStates:PartyStates, deadline:int,
|
---|
16 | evaluator:VotingEvaluator ):
|
---|
17 | '''
|
---|
18 | @param partyStates the {@link PartyStates}
|
---|
19 | @param deadline deadline for this phase, ms since 1970
|
---|
20 | @param evaluator the {@link VotingEvaluator} to be used
|
---|
21 | '''
|
---|
22 | self._partyStates = partyStates
|
---|
23 | self._deadline = deadline
|
---|
24 | self._evaluator = evaluator
|
---|
25 |
|
---|
26 | def isFinal(self, now:int)->bool:
|
---|
27 | return now >= self._deadline or len(self._partyStates.getNotYetActed())==0
|
---|
28 |
|
---|
29 | def getDeadline(self)->int:
|
---|
30 | return self._deadline
|
---|
31 |
|
---|
32 | def _checkAction(self, actor:PartyId ,action: Action , now:int):
|
---|
33 | '''
|
---|
34 | Check if actor can do given action. Basic checks:
|
---|
35 | <ul>
|
---|
36 | <li>real actor does not match action's actor
|
---|
37 | <li>deadline for this phase has passed
|
---|
38 | <li>action is not allowed in this phase
|
---|
39 | <li>actor already acted in this phase
|
---|
40 | </ul>
|
---|
41 | @param actor the actor that really acted
|
---|
42 | @param action the action that was done
|
---|
43 | @param now current time
|
---|
44 | @throws ProtocolException if the action violates the protocol
|
---|
45 | '''
|
---|
46 | if action == None:
|
---|
47 | raise ProtocolException("Action=null", actor)
|
---|
48 | if actor != action.getActor():
|
---|
49 | raise ProtocolException(
|
---|
50 | "Incorrect actor info in action:" + str(action.getActor()),
|
---|
51 | actor)
|
---|
52 | if self.isFinal(now):
|
---|
53 | raise ProtocolException("passed deadline", actor)
|
---|
54 | if not type(action) in self.getAllowedActions():
|
---|
55 | raise ProtocolException("Action not allowed in "
|
---|
56 | + type(self).__name__ + ": " + str(action), actor)
|
---|
57 | if not actor in self._partyStates.getNotYetActed():
|
---|
58 | raise ProtocolException("Actor can not act anymore", actor)
|
---|
59 | return
|
---|
60 |
|
---|
61 | def getPartyStates(self)->PartyStates :
|
---|
62 | '''
|
---|
63 | @return current PartyStates
|
---|
64 | '''
|
---|
65 | return self._partyStates
|
---|
66 |
|
---|
67 | def getEvaluator(self)->VotingEvaluator :
|
---|
68 | return self._evaluator
|
---|
69 |
|
---|
70 | def next(self, now:int, duration:int)->Phase :
|
---|
71 | if duration < PHASE_MINTIME or duration > PHASE_MAXTIME:
|
---|
72 | raise ValueError("Bug, illegal duration")
|
---|
73 | if not self.isFinal(now):
|
---|
74 | raise ValueError("phase is not final")
|
---|
75 | return self._checkedNext(now + duration)
|
---|
76 |
|
---|
77 | @abstractmethod
|
---|
78 | def _checkedNext(self, dl:int)-> Phase:
|
---|
79 | '''
|
---|
80 | As {@link #next(long, long)} but DefaultPhase already checked that 1.
|
---|
81 | there is enough time for a next phase 2. current state is final 3.
|
---|
82 |
|
---|
83 | @param dl the deadline for the next phase (ms since 1970).
|
---|
84 | @return the next phase
|
---|
85 | '''
|
---|
86 |
|
---|
87 | def __repr__(self):
|
---|
88 | return type(self).__name__ + "[" + str(self._partyStates) + "," + \
|
---|
89 | str(self._deadline) + "," + str(self._evaluator) + "]"
|
---|
90 |
|
---|
91 | def __hash__(self):
|
---|
92 | return hash((self._deadline, self._evaluator, self._partyStates))
|
---|
93 |
|
---|
94 |
|
---|
95 | def __eq__(self, other):
|
---|
96 | return isinstance(other, self.__class__) \
|
---|
97 | and self._partyStates==other._partyStates \
|
---|
98 | and self._deadline==other._deadline\
|
---|
99 | and self._evaluator==other._evaluator
|
---|
100 |
|
---|