View Javadoc

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   * Basic implementation of a mailbox.
13   * 
14   * @author Radek 'Black_Hand' Pibil
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  }