PageRenderTime 45ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/org.wisenet.simulator/src/org/wisenet/simulator/components/evaluation/MessageDatabase.java

https://bitbucket.org/gmsconstantino/urop_project
Java | 451 lines | 241 code | 75 blank | 135 comment | 29 complexity | 55c83b4e324cfae3984d867d092f89ae MD5 | raw file
  1. package org.wisenet.simulator.components.evaluation;
  2. import java.util.Hashtable;
  3. import java.util.LinkedList;
  4. import java.util.List;
  5. import org.apache.commons.math.stat.descriptive.DescriptiveStatistics;
  6. import org.wisenet.simulator.core.Message;
  7. import org.wisenet.simulator.core.Simulator;
  8. import org.wisenet.simulator.core.node.layers.routing.RoutingLayer;
  9. /**
  10. *
  11. * @author posilva
  12. */
  13. public class MessageDatabase {
  14. Hashtable<Long, MessageTableEntry> messagesTable = new Hashtable<Long, MessageTableEntry>();
  15. Hashtable<Short, List<SendersTableEntry>> senderNodesTable = new Hashtable<Short, List<SendersTableEntry>>();
  16. Hashtable<Short, ReceiversTableEntry> receiverNodesTable = new Hashtable<Short, ReceiversTableEntry>();
  17. List<Integer> messageCountByHops = new LinkedList<Integer>();
  18. //key is messageId, value it is a list MessagePassageEntry of the nodes who routed the message
  19. Hashtable<Long,List<MessagePassageEntry>> seenMessageNodes = new Hashtable<Long,List<MessagePassageEntry>>();
  20. long totalNumberOfMessagesSent = 0;
  21. /**
  22. *
  23. */
  24. protected boolean debugEnabled = false;
  25. /**
  26. * Registers a message sent event
  27. * @param message
  28. * the message sent
  29. * @param routing
  30. */
  31. public synchronized void registerMessageSent(Message message, RoutingLayer routing) {
  32. totalNumberOfMessagesSent++;
  33. MessageTableEntry me;
  34. /* if message source id is the same as the sender then process */
  35. if (message.getSourceId() == routing.getUniqueId()) {
  36. /* if message not already processed */
  37. if (!messagesTable.keySet().contains(message.getUniqueId())) {
  38. log("Message " + message.getUniqueId() + " Sent by " + message.getSourceId() + " to " + message.getDestinationId());
  39. /* process message */
  40. me = new MessageTableEntry(message, routing);
  41. me.setSimulationTimeReceived(Simulator.getSimulationTime());
  42. messagesTable.put(message.getUniqueId(), me);
  43. /* if senders aren't processed then */
  44. if (!senderNodesTable.keySet().contains(routing.getUniqueId())) {
  45. List<SendersTableEntry> l = new LinkedList<SendersTableEntry>();
  46. l.add(new SendersTableEntry(message.getUniqueId()));
  47. senderNodesTable.put(routing.getUniqueId(), l);
  48. /*process sender*/
  49. // senderNodesTable.put(routing.getUniqueId(), new SendersTableEntry());
  50. log("Sender" + routing.getUniqueId() + " registered");
  51. }else{
  52. List<SendersTableEntry> l = senderNodesTable.get(routing.getUniqueId());
  53. l.add(new SendersTableEntry(message.getUniqueId()));
  54. }
  55. //if not the message wasn't sent and the forwarding table won't exist
  56. // if(routing.isStable()){
  57. // //so that the sender counts to the statistics
  58. // LinkedList<Object> list = new LinkedList<Object>();
  59. // list.add(new MessagePassageEntry((Short)routing.getUniqueId(),(Short)routing.getNode().getId(),routing.getForwardingTable().getHopDistanceToBS()));
  60. //
  61. //// list.add(routing.getUniqueId());
  62. //
  63. // seenMessageNodes.put(message.getUniqueId(), list);
  64. // int senderHopDistance = routing.getForwardingTable().getHopDistanceToBS();
  65. // while (messageCountByHops.size() < senderHopDistance)
  66. // messageCountByHops.addLast(0);
  67. //
  68. //
  69. // int currentCount = messageCountByHops.get(senderHopDistance-1);
  70. // messageCountByHops.set(senderHopDistance-1, currentCount+1);
  71. // }
  72. }
  73. }
  74. // senĂ£o descarta mensagem
  75. }
  76. public synchronized void registerMessagePassage(Message message, RoutingLayer routing){
  77. totalNumberOfMessagesSent++;
  78. List<MessagePassageEntry> nodesWhoSaw = seenMessageNodes.get(message.getUniqueId());
  79. if(nodesWhoSaw == null){
  80. nodesWhoSaw = new LinkedList<MessagePassageEntry>();
  81. seenMessageNodes.put(message.getUniqueId(), nodesWhoSaw);
  82. }
  83. MessagePassageEntry m = new MessagePassageEntry((Short)routing.getUniqueId(),routing.getLastMessageSenderId(),routing.getForwardingTable().getHopDistanceToBS());
  84. if (!nodesWhoSaw.contains(m)){
  85. nodesWhoSaw.add(m);
  86. //retirar daqui do if, para baixo para apanhar retransmissoes
  87. int senderHopDistance = routing.getForwardingTable().getHopDistanceOnLastRoute();
  88. //baseStation also registers passage...but should not count on messageCountByHops
  89. if( senderHopDistance > 0){
  90. while (messageCountByHops.size() < senderHopDistance)
  91. ((LinkedList<Integer>) messageCountByHops).push(0);
  92. int currentCount = messageCountByHops.get(senderHopDistance-1);
  93. messageCountByHops.set(senderHopDistance-1, currentCount+1);
  94. }
  95. }
  96. }
  97. /**
  98. * Registers a succeeded received message
  99. * @param message
  100. * the message received
  101. * @param routing
  102. */
  103. public synchronized void registerMessageReceived(Message message, RoutingLayer routing) {
  104. // if (message.getDestinationId() == routing.getUniqueId()) {
  105. if (!receiverNodesTable.contains(routing.getUniqueId())) {
  106. receiverNodesTable.put(routing.getUniqueId(), new ReceiversTableEntry()); // TODO: NOT NULL
  107. }
  108. MessageTableEntry messageEntry = messagesTable.get(message.getUniqueId());
  109. if (messageEntry != null) {
  110. messageEntry.arrived();
  111. log("MESSAGE " + message.getUniqueId() + " takes " + message.getTotalHops() + " HOPS");
  112. messageEntry.setMessage(message);
  113. messageEntry.setSimulationTimeReceived(Simulator.getSimulationTime());
  114. messageEntry.incrementCounter();
  115. RoutingLayer senderId = messageEntry.getSenderRouting();
  116. List<SendersTableEntry> senderEntrys = senderNodesTable.get(senderId.getUniqueId());
  117. for(SendersTableEntry s : senderEntrys){
  118. if (s.getId() == message.getUniqueId()){
  119. s.arrived();
  120. }
  121. }
  122. // if (senderEntry != null) {
  123. // senderEntry.arrived();
  124. // }
  125. }
  126. // }
  127. }
  128. public Message getOriginalMessage(long messageId){
  129. // return messagesTable.get(messageId);
  130. MessageTableEntry mEntry = messagesTable.get(messageId);
  131. if (mEntry == null)
  132. return null;
  133. else
  134. return mEntry.getMessage();
  135. }
  136. /**
  137. *
  138. * @return
  139. */
  140. public synchronized int getTotalSenderNodes() {
  141. int count = 0;
  142. for( Object o : senderNodesTable.values()){
  143. LinkedList<SendersTableEntry> list = (LinkedList<SendersTableEntry>)o;
  144. count+= list.size();
  145. }
  146. return count;
  147. // return senderNodesTable.size();
  148. }
  149. /**
  150. *
  151. * @return
  152. */
  153. public synchronized int getTotalCoveredNodes() {
  154. int t = 0;
  155. for (Object object : senderNodesTable.values()) {
  156. LinkedList<SendersTableEntry> list = (LinkedList<SendersTableEntry>)object;
  157. for(SendersTableEntry s : list){
  158. if(s.isArrived())
  159. t++;
  160. }
  161. // SendersTableEntry e = (SendersTableEntry) object;
  162. // if (e.isArrived()) {
  163. // t++;
  164. // }
  165. }
  166. return t;
  167. }
  168. /**
  169. *
  170. * @return
  171. */
  172. public synchronized long getTotalMessagesReceived() {
  173. long t = 0;
  174. for (MessageTableEntry e : messagesTable.values()) {
  175. if (e.isArrived()) {
  176. t++;
  177. }
  178. }
  179. return t;
  180. }
  181. /**
  182. *
  183. * @return
  184. */
  185. public synchronized long getTotalNumberOfUniqueMessagesSent() {
  186. return messagesTable.size();
  187. }
  188. public synchronized List<Integer> getMessageCountByHops(){
  189. return messageCountByHops;
  190. }
  191. public synchronized Hashtable<Long, List<MessagePassageEntry>> getSeenMessageNodes() {
  192. return seenMessageNodes;
  193. }
  194. /**
  195. *
  196. * @param msg
  197. */
  198. protected void log(String msg) {
  199. if (debugEnabled) {
  200. System.out.println(getClass().getSimpleName() + " - " + msg);
  201. }
  202. }
  203. public double getCoveragePercent() {
  204. if(getTotalSenderNodes() > 0)
  205. return 100 * (getTotalCoveredNodes()) / getTotalSenderNodes();
  206. else
  207. return 0;
  208. }
  209. public double getReliabilityPercent() {
  210. if(getTotalNumberOfUniqueMessagesSent() > 0)
  211. return 100 * (getTotalMessagesReceived()) / getTotalNumberOfUniqueMessagesSent();
  212. else
  213. return 0;
  214. }
  215. public double getLatencyMax() {
  216. DescriptiveStatistics stats = new DescriptiveStatistics();
  217. for (MessageTableEntry e : messagesTable.values()) {
  218. stats.addValue(e.getMessage().getTotalHops());
  219. }
  220. return stats.getMax();
  221. }
  222. public double getLatencyAvg() {
  223. DescriptiveStatistics stats = new DescriptiveStatistics();
  224. for (MessageTableEntry e : messagesTable.values()) {
  225. stats.addValue(e.getMessage().getTotalHops());
  226. }
  227. return stats.getMean();
  228. }
  229. public double getLatencyMin() {
  230. DescriptiveStatistics stats = new DescriptiveStatistics();
  231. for (MessageTableEntry e : messagesTable.values()) {
  232. stats.addValue(e.getMessage().getTotalHops());
  233. }
  234. return stats.getMin();
  235. }
  236. void reset() {
  237. messagesTable.clear();
  238. senderNodesTable.clear();
  239. receiverNodesTable.clear();
  240. totalNumberOfMessagesSent = 0;
  241. }
  242. // reliability control
  243. /**
  244. *
  245. */
  246. public class MessageTableEntry {
  247. boolean arrived = false;
  248. int count = 0;
  249. long simulationTimeSent = 0L;
  250. long simulationTimeReceived = 0L;
  251. private Message message;
  252. private RoutingLayer senderRouting;
  253. public long getSimulationTimeReceived() {
  254. return simulationTimeReceived;
  255. }
  256. public void setSimulationTimeReceived(long simulationTimeReceived) {
  257. this.simulationTimeReceived = simulationTimeReceived;
  258. }
  259. public long getSimulationTimeSent() {
  260. return simulationTimeSent;
  261. }
  262. public void setSimulationTimeSent(long simulationTimeSent) {
  263. this.simulationTimeSent = simulationTimeSent;
  264. }
  265. private MessageTableEntry(Message message, RoutingLayer routing) {
  266. this.message = message;
  267. this.senderRouting = routing;
  268. }
  269. /**
  270. *
  271. * @return
  272. */
  273. public RoutingLayer getSenderRouting() {
  274. return senderRouting;
  275. }
  276. /**
  277. *
  278. * @return
  279. */
  280. public boolean isArrived() {
  281. return arrived;
  282. }
  283. /**
  284. *
  285. */
  286. public void arrived() {
  287. this.arrived = true;
  288. }
  289. /**
  290. *
  291. * @return
  292. */
  293. public Message getMessage() {
  294. return message;
  295. }
  296. /**
  297. *
  298. * @return
  299. */
  300. public int getCount() {
  301. return count;
  302. }
  303. /**
  304. *
  305. */
  306. public void incrementCounter() {
  307. count++;
  308. }
  309. public void setMessage(Message message) {
  310. this.message = message;
  311. }
  312. }
  313. // coverage control
  314. /**
  315. *
  316. */
  317. public class SendersTableEntry {
  318. boolean arrived = false;
  319. long id;
  320. /**
  321. *
  322. */
  323. public SendersTableEntry() {
  324. }
  325. public SendersTableEntry(long id){
  326. this.id = id;
  327. }
  328. public long getId(){
  329. return this.id;
  330. }
  331. /**
  332. *
  333. * @return
  334. */
  335. public boolean isArrived() {
  336. return arrived;
  337. }
  338. /**
  339. *
  340. */
  341. public void arrived() {
  342. this.arrived = true;
  343. }
  344. }
  345. /**
  346. *
  347. */
  348. public class ReceiversTableEntry {
  349. /**
  350. *
  351. */
  352. public ReceiversTableEntry() {
  353. }
  354. }
  355. /**
  356. *
  357. * @return
  358. */
  359. public boolean isDebugEnabled() {
  360. return debugEnabled;
  361. }
  362. /**
  363. *
  364. * @param debugEnabled
  365. */
  366. public void setDebugEnabled(boolean debugEnabled) {
  367. this.debugEnabled = debugEnabled;
  368. }
  369. /**
  370. *
  371. * @return
  372. */
  373. public long getTotalNumberOfMessagesSent() {
  374. return totalNumberOfMessagesSent;
  375. }
  376. }