View Javadoc

1   package cz.cuni.amis.pogamut.ut2004.communication.messages.custom;
2   
3   import java.util.HashMap;
4   import java.util.Map;
5   
6   import cz.cuni.amis.pogamut.ut2004.communication.messages.gbcommands.SendControlMessage;
7   import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ControlMessage;
8   
9   /**
10   * This class should be "subclassed" as e.g. "TagMessages" or "HideAndSeekMessages" and {@link ControlMessages#register(Class...)} all implementations of {@link ICustomControlMessage} 
11   * within the contructor to encapsulate a functionality "that understands the whole set of some messages".
12   * 
13   * @author Jimmy
14   */
15  public class ControlMessages {
16  
17  	protected Map<String, ControlMessageMapper> deserializers = new HashMap<String, ControlMessageMapper>();
18  	protected Map<String, SendControlMessageMapper> serializers = new HashMap<String, SendControlMessageMapper>();
19  	
20  	protected void register(Class<? extends ICustomControlMessage>... customControlMessageClasses) {
21  		for (Class<? extends ICustomControlMessage> customControlMessageClass : customControlMessageClasses) {
22  			ControlMessageMapper deserializer = new ControlMessageMapper(customControlMessageClass);
23  			if (deserializers.containsKey(deserializer.getType())) {
24  				throw new RuntimeException("Cannot register same message type '" + deserializer.getType() + " twice. Following two classes have the same @ControlMessageType value: " + customControlMessageClass + ", " + deserializers.get(deserializer.getType()).getDescriptor());
25  			}
26  	 		deserializers.put(deserializer.getType(), deserializer);
27  	 		
28  	 		SendControlMessageMapper serializer = new SendControlMessageMapper(customControlMessageClass);
29  	 		if (serializers.containsKey(serializer.getType())) {
30  				throw new RuntimeException("Cannot register same message type '" + deserializer.getType() + " twice. Following two classes have the same @ControlMessageType value: " + customControlMessageClass + ", " + serializers.get(serializer.getType()).getDescriptor());
31  			}
32  	 		serializers.put(serializer.getType(), serializer);
33  		}
34  	}
35  
36  	
37  	public ICustomControlMessage read(ControlMessage message) {
38  		ControlMessageMapper deserializer = deserializers.get(message.getType());
39  		if (deserializer == null) {
40  			throw new RuntimeException("Cannot deserialize " + message + ", no deserializer registered for the message type '" + message.getType() + "'.");
41  		}
42  		return deserializer.deserialize(message);
43  	}
44  	
45  	public SendControlMessage write(ICustomControlMessage message) {
46  		if (!message.getClass().isAnnotationPresent(ControlMessageType.class)) throw new RuntimeException("Cannot map object of class " + message.getClass() + " onto SendControlMessage as there is no @ControlMessageType annotation present.");
47  		String type = ((ControlMessageType)message.getClass().getAnnotation(ControlMessageType.class)).type();
48  		SendControlMessageMapper serializer = serializers.get(type);
49  		if (serializer == null) {
50  			throw new RuntimeException("Cannot serialize " + message + ", no serializer registered for the message type '" + type + "'.");
51  		}
52  		SendControlMessage command = serializer.serialize(message);
53  		return command;
54  	}
55  	
56  }