1 package cz.cuni.amis.pogamut.defcon.communication.mailbox;
2
3 import java.util.Hashtable;
4 import java.util.LinkedList;
5 import java.util.List;
6 import java.util.Map;
7
8 import cz.cuni.amis.pogamut.base.communication.worldview.object.WorldObjectId;
9 import cz.cuni.amis.pogamut.defcon.ai.IUnitAI;
10
11
12
13
14
15
16
17 public class MailBox implements IMailBox {
18
19 private Map<Class<? extends IUnitAI>, List<IUnitAI>> listenerAIListByClass = new Hashtable<Class<? extends IUnitAI>, List<IUnitAI>>();
20 private Map<WorldObjectId, IUnitAI> listenerAIListById = new Hashtable<WorldObjectId, IUnitAI>();
21
22 @Override
23 public void mail(Class<? extends IUnitAI> targetAIClass, IMessage message) {
24
25 if (targetAIClass == null)
26 return;
27
28 List<IUnitAI> ais = listenerAIListByClass.get(targetAIClass);
29 if (ais == null) {
30 return;
31 }
32
33 for (IUnitAI ai : ais) {
34 ai.receiveMessage(message);
35 }
36 }
37
38 @Override
39 public void mail(WorldObjectId targetId, IMessage message) {
40
41 if (targetId == null)
42 return;
43
44 IUnitAI ai = listenerAIListById.get(targetId);
45
46 if (ai == null)
47 return;
48
49 ai.receiveMessage(message);
50 }
51
52 @Override
53 public void mail(IUnitAI ai, IMessage message) {
54 if (ai != null)
55 ai.receiveMessage(message);
56 }
57
58 @Override
59 public void registerAI(IUnitAI ai) {
60 if (ai == null)
61 return;
62
63 List<IUnitAI> ais = listenerAIListByClass.get(ai.getClass());
64 if (ais == null) {
65 ais = new LinkedList<IUnitAI>();
66 listenerAIListByClass.put(ai.getClass(), ais);
67 } else if (ais.contains(ai)) {
68 return;
69 }
70
71 ais.add(ai);
72
73 listenerAIListById.put(ai.getId(), ai);
74 }
75
76 @Override
77 public void unregisterAI(IUnitAI ai) {
78 if (ai == null)
79 return;
80
81 List<IUnitAI> ais = listenerAIListByClass.get(ai.getClass());
82 if (ais == null) {
83 return;
84 } else if (ais.contains(ai)) {
85 ais.remove(ai);
86 }
87
88 listenerAIListById.remove(ai.getId());
89 }
90
91 }