CommunicationModule.java 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package classes.holonControlUnit;
  2. import classes.Holon;
  3. import classes.holonControlUnit.messages.MergeMsg;
  4. import classes.holonControlUnit.messages.Message;
  5. import classes.holonControlUnit.messages.NeighborhoodMsg;
  6. import classes.holonControlUnit.messages.OrderMsg;
  7. import classes.holonControlUnit.messages.SplitMsg;
  8. import classes.holonControlUnit.messages.StateMsg;
  9. import classes.holonControlUnit.messages.StateRequestMsg;
  10. import classes.holonControlUnit.messages.MergeOrderMsg;
  11. import java.util.ArrayList;
  12. import com.google.gson.Gson;
  13. /**
  14. * this class is responsable for communication between holons
  15. * @author Jonas
  16. *
  17. */
  18. public class CommunicationModule {
  19. private HolonControlUnit hcu;
  20. private Gson gson;
  21. public CommunicationModule(HolonControlUnit owner) {
  22. this.hcu = owner;
  23. this.gson = new Gson();
  24. }
  25. public void sendMsg(String receiver, Message.Type type, String body) {
  26. //send msg to holon receiver
  27. Message msg = new Message(this.hcu.getHolon().getUniqueID(), receiver, type, body);
  28. //get receiver through his uniqueID
  29. Holon h = this.hcu.getHolon().model.getHolonsByID().get(receiver);
  30. if(h == null) {
  31. System.err.println("Could not find Holon: "+receiver+"\t in holons: "+this.hcu.getHolon().model.getHolonsByID());
  32. return;
  33. }
  34. h.holonControlUnit.getCommunicator().receiveMsg(gson.toJson(msg));
  35. }
  36. public void receiveMsg(String message) {
  37. Message msg = this.gson.fromJson(message, Message.class);
  38. if(!msg.getReceiver().equals(this.hcu.getHolon().getUniqueID()))
  39. throw new RuntimeException("Missleaded message:\n"+message);
  40. switch (msg.getType()) {
  41. case ORDER:
  42. this.hcu.getStateAssembler().setOrder(this.gson.fromJson(msg.getBody(), OrderMsg.class), msg.getSender());
  43. break;
  44. case NEIGHBORHOOD:
  45. receiveNeighborhoodMsg(msg);
  46. break;
  47. case STATE_REQUEST:
  48. this.hcu.receiveStateRequest(msg.getSender(), this.gson.fromJson(msg.getBody(), StateRequestMsg.class));
  49. break;
  50. case STATE:
  51. this.hcu.getStateEstimator().receiveState(msg.getSender(), this.gson.fromJson(msg.getBody(), StateMsg.class));
  52. break;
  53. case MERGE:
  54. receiveMergeMsg(msg);
  55. break;
  56. case SPLIT:
  57. receiveSplitMsg(msg);
  58. break;
  59. case MERGE_ORDER:
  60. this.hcu.getHierarchyController().receiveMergeOrder(this.gson.fromJson(msg.getBody(), MergeOrderMsg.class), msg.getSender());
  61. break;
  62. default:
  63. throw new RuntimeException("Unknown message type:\n"+message);
  64. }
  65. }
  66. private void receiveNeighborhoodMsg(Message msg) {
  67. NeighborhoodMsg nMsg = this.gson.fromJson(msg.getBody(), NeighborhoodMsg.class);
  68. ArrayList<String> neighbors = nMsg.getNeighbors();
  69. switch(nMsg.getType()) {
  70. case NEW_VIRTUAL_NEIGHBOR:
  71. this.hcu.getHierarchyController().addVirtualNeighbors(neighbors);
  72. break;
  73. case REMOVE_VIRTUAL_NEIGHBOR:
  74. this.hcu.getHierarchyController().removeVirtualNeighbors(neighbors);
  75. break;
  76. // case NEW_PHYSICAL_NEIGHBOR:
  77. // break;
  78. // case REMOVE_PHYSICAL_NEIGHBOR:
  79. // break;
  80. default:
  81. System.err.println("Unknown neighborhood type:\n"+msg);
  82. }
  83. }
  84. private void receiveMergeMsg(Message msg) {
  85. MergeMsg mMsg = this.gson.fromJson(msg.getBody(), MergeMsg.class);
  86. switch(mMsg.getType()) {
  87. case REQ:
  88. this.hcu.getHierarchyController().receiveMergeReq(mMsg, msg.getSender());
  89. break;
  90. case ACK:
  91. this.hcu.getHierarchyController().receiveMergeAck(mMsg, msg.getSender());
  92. break;
  93. case ACK_II:
  94. this.hcu.getHierarchyController().receiveMergeAckII(mMsg, msg.getSender());
  95. break;
  96. default:
  97. System.err.println("Unknown neighborhood type:\n"+msg);
  98. }
  99. }
  100. private void receiveSplitMsg(Message msg) {
  101. SplitMsg split = this.gson.fromJson(msg.getBody(), SplitMsg.class);
  102. this.hcu.getHierarchyController().receiveSplitMsg(split, msg.getSender());
  103. }
  104. public Gson getGson() {
  105. return this.gson;
  106. }
  107. }