1 package cz.cuni.amis.pogamut.ut2004.communication.translator.bot.support;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import cz.cuni.amis.fsm.IFSMState;
7 import cz.cuni.amis.pogamut.base.communication.messages.InfoMessage;
8 import cz.cuni.amis.pogamut.ut2004.communication.translator.TranslatorContext;
9 import cz.cuni.amis.pogamut.ut2004.communication.translator.TranslatorMessages;
10 import cz.cuni.amis.pogamut.ut2004.communication.translator.UnexpectedMessageException;
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 public abstract class BotListState<MESSAGE, CONTEXT extends TranslatorContext> extends AbstractBotFSMState<InfoMessage, CONTEXT> {
30
31 private List<MESSAGE> messages = null;
32 @SuppressWarnings("unchecked")
33 private Class beginMessage;
34 private Class<MESSAGE> message;
35 @SuppressWarnings("unchecked")
36 private Class endMessage;
37
38
39
40
41
42
43 @SuppressWarnings("unchecked")
44 public BotListState(Class beginMessage, Class<MESSAGE> message, Class endMessage) {
45 this.beginMessage = beginMessage;
46 this.message = message;
47 this.endMessage = endMessage;
48 }
49
50 protected List<MESSAGE> getList() {
51 return messages;
52 }
53
54 protected void newList() {
55 messages = new ArrayList<MESSAGE>();
56 }
57
58 @Override
59 public void init(CONTEXT context) {
60 messages = new ArrayList<MESSAGE>();
61 }
62
63 @Override
64 public void restart(CONTEXT context) {
65 messages = new ArrayList<MESSAGE>();
66 }
67
68 @Override
69 public void stateEntering(CONTEXT context, IFSMState<InfoMessage, CONTEXT> fromState, InfoMessage symbol) {
70 if (!symbol.getClass().equals(beginMessage)) {
71 throw new UnexpectedMessageException(TranslatorMessages.unexpectedMessage(this, symbol, beginMessage), context.getLogger(), this);
72 }
73 }
74
75 @Override
76 public void stateLeaving(CONTEXT context,
77 IFSMState<InfoMessage, CONTEXT> toState, InfoMessage symbol) {
78 if (!symbol.getClass().equals(endMessage)) {
79 throw new UnexpectedMessageException(TranslatorMessages.unexpectedMessage(this, symbol, endMessage), context.getLogger(), this);
80 }
81 }
82
83 @Override
84 public void stateSymbol(CONTEXT context, InfoMessage symbol) {
85 if (!symbol.getClass().equals(message)) {
86 if (!message.isAssignableFrom(symbol.getClass())) {
87 throw new UnexpectedMessageException(TranslatorMessages.unexpectedMessage(this, symbol, message), context.getLogger(), this);
88 }
89 }
90 messages.add(message.cast(symbol));
91 }
92
93 }