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
11
12
13
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 }