CommunicationModule.java 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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.SplitOrderMsg;
  9. import classes.holonControlUnit.messages.StateMsg;
  10. import classes.holonControlUnit.messages.StateRequestMsg;
  11. import classes.holonControlUnit.messages.MergeOrderMsg;
  12. import java.util.ArrayList;
  13. import com.google.gson.Gson;
  14. /**
  15. * this class is responsable for communication between holons
  16. * @author Jonas
  17. *
  18. */
  19. public class CommunicationModule {
  20. private HolonControlUnit hcu;
  21. private Gson gson;
  22. public CommunicationModule(HolonControlUnit owner) {
  23. this.hcu = owner;
  24. this.gson = new Gson();
  25. }
  26. public void sendMsg(String receiver, Message.Type type, String body) {
  27. //send msg to holon receiver
  28. Message msg = new Message(this.hcu.getHolon().getUniqueID(), receiver, type, body);
  29. //get receiver through his uniqueID
  30. Holon h = this.hcu.getHolon().model.getHolonsByID().get(receiver);
  31. if(h == null) {
  32. System.err.println("Could not find Holon: "+receiver+"\t in holons: "+this.hcu.getHolon().model.getHolonsByID());
  33. return;
  34. }
  35. h.holonControlUnit.getCommunicator().receiveMsg(gson.toJson(msg));
  36. }
  37. public void receiveMsg(String message) {
  38. Message msg = this.gson.fromJson(message, Message.class);
  39. if(!msg.getReceiver().equals(this.hcu.getHolon().getUniqueID()))
  40. throw new RuntimeException("Missleaded message:\n"+message);
  41. switch (msg.getType()) {
  42. case ORDER:
  43. this.hcu.getStateAssembler().setOrder(this.gson.fromJson(msg.getBody(), OrderMsg.class), msg.getSender());
  44. break;
  45. case NEIGHBORHOOD:
  46. receiveNeighborhoodMsg(msg);
  47. break;
  48. case STATE_REQUEST:
  49. this.hcu.receiveStateRequest(msg.getSender(), this.gson.fromJson(msg.getBody(), StateRequestMsg.class));
  50. break;
  51. case STATE:
  52. this.hcu.getStateEstimator().receiveState(msg.getSender(), this.gson.fromJson(msg.getBody(), StateMsg.class));
  53. break;
  54. case MERGE:
  55. receiveMergeMsg(msg);
  56. break;
  57. case SPLIT:
  58. receiveSplitMsg(msg);
  59. break;
  60. case MERGE_ORDER:
  61. this.hcu.getHierarchyController().receiveMergeOrder(this.gson.fromJson(msg.getBody(), MergeOrderMsg.class), msg.getSender());
  62. break;
  63. case SPLIT_ORDER:
  64. this.hcu.getHierarchyController().receiveSplitOrder(this.gson.fromJson(msg.getBody(), SplitOrderMsg.class), msg.getSender());
  65. break;
  66. default:
  67. throw new RuntimeException("Unknown message type:\n"+message);
  68. }
  69. }
  70. private void receiveNeighborhoodMsg(Message msg) {
  71. NeighborhoodMsg nMsg = this.gson.fromJson(msg.getBody(), NeighborhoodMsg.class);
  72. ArrayList<String> neighbors = nMsg.getNeighbors();
  73. switch(nMsg.getType()) {
  74. case NEW_VIRTUAL_NEIGHBOR:
  75. this.hcu.getHierarchyController().addVirtualNeighbors(neighbors);
  76. break;
  77. case REMOVE_VIRTUAL_NEIGHBOR:
  78. this.hcu.getHierarchyController().removeVirtualNeighbors(neighbors);
  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. case ACK_III:
  97. this.hcu.getHierarchyController().receiveMergeAckIII(mMsg, msg.getSender());
  98. break;
  99. case OCC_REQ:
  100. this.hcu.getHierarchyController().receiveMergeOccReq(mMsg);
  101. break;
  102. case OCC_ACK:
  103. this.hcu.getHierarchyController().receiveMergeOccAck(mMsg, msg.getSender());
  104. break;
  105. default:
  106. System.err.println("Unknown merge message type:\n"+msg);
  107. }
  108. }
  109. private void receiveSplitMsg(Message msg) {
  110. SplitMsg split = this.gson.fromJson(msg.getBody(), SplitMsg.class);
  111. this.hcu.getHierarchyController().receiveSplitMsg(split, msg.getSender());
  112. }
  113. public Gson getGson() {
  114. return this.gson;
  115. }
  116. }