/src/traveldashboard/server/handler/DataEventListener.java

https://bitbucket.org/ambientic/traveldashboard-server · Java · 311 lines · 194 code · 59 blank · 58 comment · 54 complexity · e1897cac01f6a8b1ffac2779b7a7678b MD5 · raw file

  1. package traveldashboard.server.handler;
  2. import java.util.TimeZone;
  3. import org.ibicoop.broker.common.EventNotificationListener;
  4. import org.ibicoop.broker.common.IbiResource;
  5. import org.ibicoop.broker.common.IbiResourceEvent;
  6. import org.ibicoop.broker.common.IbiTopic;
  7. import org.ibicoop.broker.common.IbiTopicEvent;
  8. import org.ibicoop.init.IbicoopLoader;
  9. import org.ibicoop.sdp.config.NetworkMessage;
  10. import org.ibicoop.sdp.config.NetworkMessageXml;
  11. import traveldashboard.data.TransportArea;
  12. import traveldashboard.data.Tube;
  13. import traveldashboard.data.TubeStation;
  14. import traveldashboard.server.data.DataConstants;
  15. import traveldashboard.server.data.MongoDbManager;
  16. import traveldashboard.server.data.StationNotifSender;
  17. import traveldashboard.server.data.TdServerLogger;
  18. public class DataEventListener implements EventNotificationListener {
  19. private static final String TAG = "DataEventListener";
  20. private int brokerStatus = -1;
  21. public DataEventListener() {
  22. //Start event notification
  23. IbicoopLoader.load().getBrokerManager(DataConstants.BROKER_NAME)
  24. .startNotification(this);
  25. waitForBrokerStatus(3);
  26. }
  27. private void waitForBrokerStatus(int code) {
  28. int retry = 20; //20s
  29. while (retry > 0 && brokerStatus != code) {
  30. try {
  31. Thread.sleep(1000);
  32. TdServerLogger.print(TAG, "waitForBrokerStatus", "retry = " + retry);
  33. } catch (InterruptedException e) {
  34. TdServerLogger.printError(TAG, "waitForBrokerStatus", "retry = " + retry + ", error = " + e.getMessage());
  35. }
  36. retry--;
  37. }
  38. }
  39. /*
  40. * (non-Javadoc)
  41. * @see org.ibicoop.broker.common.EventNotificationListener#acceptNotificationFrom(java.lang.String)
  42. */
  43. @Override
  44. public boolean acceptNotificationFrom(String eventPublisher) {
  45. String methodTag = "acceptNotificationFrom";
  46. TdServerLogger.print(TAG, methodTag, "Accept notification from : " + eventPublisher);
  47. return true;
  48. }
  49. /*
  50. * (non-Javadoc)
  51. * @see org.ibicoop.broker.common.EventNotificationListener#brokerStatus(java.lang.String, int)
  52. */
  53. @Override
  54. public void brokerStatus(String brokerName, int statusCode) {
  55. String methodTag = "brokerStatus";
  56. TdServerLogger.print(TAG, methodTag, brokerName + " status : " + statusCode);
  57. brokerStatus = statusCode;
  58. }
  59. /*
  60. * (non-Javadoc)
  61. * @see org.ibicoop.broker.common.EventNotificationListener#receiveEvent(org.ibicoop.broker.common.IbiTopic, org.ibicoop.broker.common.IbiTopicEvent)
  62. */
  63. @Override
  64. public void receiveEvent(IbiTopic forTopic, IbiTopicEvent event) {
  65. String methodTag = "receiveEvent";
  66. //Get event timestamp
  67. long timestamp = event.getPublicationDate().getTime();
  68. //Get event name
  69. String eventName = event.getName();
  70. //Get event type
  71. String eventType = event.getType();
  72. if (DataConstants.DEBUG) TdServerLogger.print(TAG, methodTag, ("Receive event : "
  73. + "timestamp = " + timestamp + ", "
  74. + "eventName = " + eventName + ", "
  75. + "eventType = " + eventType));
  76. if (eventName.equals(DataConstants.EVENT_NAME_NOISE)) {
  77. if (DataConstants.DEBUG) TdServerLogger.print(TAG, methodTag, "This is really a noise event!");
  78. //Get noise event network message
  79. NetworkMessage message = NetworkMessageXml.readMessage(event.getData());
  80. //Process message if not null
  81. if (message != null) {
  82. //Get noise network message parameters
  83. //Get noise data latitude
  84. double latitude = Double.parseDouble(message.getPayload(DataConstants.PARAM_KEY_STOP_LAT));
  85. //Get noise data longitude
  86. double longitude = Double.parseDouble(message.getPayload(DataConstants.PARAM_KEY_STOP_LON));
  87. //Get noise level
  88. int noiseLevel = Integer.parseInt(message.getPayload(DataConstants.PARAM_NOISE_LEVEL));
  89. String city = TransportArea.getArea(latitude, longitude);
  90. String timeZone = "";
  91. if (city.equals(DataConstants.PARIS)) {
  92. timeZone = "Europe/Paris";
  93. } else if (city.equals(DataConstants.LONDON)) {
  94. timeZone = "Europe/London";
  95. }
  96. //Set to local timestamp
  97. timestamp = timestamp - TimeZone.getDefault().getRawOffset() +
  98. TimeZone.getTimeZone(timeZone).getRawOffset();
  99. if (DataConstants.DEBUG) TdServerLogger.print(TAG, methodTag, "Latitude = " + latitude + ", longitude = " + longitude + ", noise level = " + noiseLevel + ", timestamp = " + timestamp);
  100. //Insert data into database
  101. MongoDbManager.insertNoiseData(timestamp, latitude, longitude, noiseLevel);
  102. //? Notify users listening to the station channel in a new Thread
  103. } else {
  104. TdServerLogger.printError(TAG, methodTag, "Network message is null!");
  105. }
  106. } else if (eventName.equals(DataConstants.EVENT_NAME_CROWD)) {
  107. if (DataConstants.DEBUG) TdServerLogger.print(TAG, methodTag, "This is really a crowd event!");
  108. //Get crowd event network message
  109. NetworkMessage message = NetworkMessageXml.readMessage(event.getData());
  110. //Process message if not null
  111. if (message != null) {
  112. //Get crowd network message parameters
  113. //Get city
  114. String city = message.getPayload(DataConstants.PARAM_KEY_CITY_TYPE);
  115. //Get stopId
  116. String stopId = message.getPayload(DataConstants.PARAM_KEY_STOP_ID);
  117. //Get routeId
  118. String routeId = message.getPayload(DataConstants.PARAM_KEY_ROUTE_ID);
  119. //Get crowd level
  120. int level = Integer.parseInt(message.getPayload(DataConstants.PARAM_KEY_LEVEL));
  121. String timeZone = "";
  122. if (city.equals(DataConstants.PARIS)) {
  123. timeZone = "Europe/Paris";
  124. } else if (city.equals(DataConstants.LONDON)) {
  125. timeZone = "Europe/London";
  126. }
  127. //Set to local timestamp
  128. timestamp = timestamp - TimeZone.getDefault().getRawOffset() +
  129. TimeZone.getTimeZone(timeZone).getRawOffset();
  130. if (DataConstants.DEBUG) TdServerLogger.print(TAG, methodTag,
  131. "city = " + city
  132. + ", stopId = " + stopId
  133. + ", routeId = " + routeId
  134. + ", timestamp = " + timestamp
  135. + ", level = " + level
  136. );
  137. if (DataConstants.DEBUG) TdServerLogger.print(TAG, methodTag,
  138. "timequery = " + MongoDbManager.convertTimestampToTimeQueryString(timestamp)
  139. );
  140. //In Paris we can post different crowd for diffrent lines
  141. //FIXME: We can only post the same crowd for all lines in a tube station in London
  142. if (city.equals(DataConstants.LONDON)) {
  143. TubeStation metroStation = MongoDbManager.getLondonMetroStation(stopId);
  144. Tube[] tubes = metroStation.getTubes();
  145. for (Tube tube: tubes) {
  146. String routeIdLondon = tube.getId();
  147. MongoDbManager.insertCrowdData(city, stopId, routeIdLondon, timestamp, level);
  148. }
  149. } else if (city.equals(DataConstants.PARIS)) {
  150. //Insert crowd data into database
  151. MongoDbManager.insertCrowdData(city, stopId, routeId, timestamp, level);
  152. }
  153. // notify users listening to the station channel in a new Thread
  154. StationNotifSender.send(stopId, ""+ level);
  155. }
  156. else {
  157. if (DataConstants.DEBUG) TdServerLogger.printError(TAG, methodTag, "Network message is null!");
  158. }
  159. } else if (eventName.equals(DataConstants.EVENT_NAME_RATING)) {
  160. if (DataConstants.DEBUG) TdServerLogger.print(TAG, methodTag, "This is really a rating event!");
  161. //Get noise event network message
  162. NetworkMessage message = NetworkMessageXml.readMessage(event.getData());
  163. //Process message if not null
  164. if (message != null) {
  165. //Get rating network message parameters
  166. //Get city
  167. String city = message.getPayload(DataConstants.PARAM_KEY_CITY_TYPE);
  168. //Get routeName
  169. String routeId = message.getPayload(DataConstants.PARAM_KEY_ROUTE_ID);
  170. //Get userName
  171. String userName = message.getPayload(DataConstants.PARAM_KEY_USER_NAME);
  172. //Get rating
  173. int rating = Integer.parseInt(message.getPayload(DataConstants.PARAM_KEY_RATING));
  174. if (DataConstants.DEBUG) TdServerLogger.print(TAG, methodTag,
  175. "city = " + city
  176. + ", routeId = " + routeId
  177. + ", user name = " + userName
  178. + ", rating = " + rating
  179. );
  180. //Insert data into database
  181. MongoDbManager.updateUserRatings(city, userName, routeId, rating);
  182. } else {
  183. TdServerLogger.printError(TAG, methodTag, "Network message is null!");
  184. }
  185. } else if (eventName.equals(DataConstants.EVENT_NAME_COMMENT)) {
  186. if (DataConstants.DEBUG) TdServerLogger.print(TAG, methodTag, "This is really a comment event!");
  187. //Get noise event network message
  188. NetworkMessage message = NetworkMessageXml.readMessage(event.getData());
  189. //Process message if not null
  190. if (message != null) {
  191. //Get comment network message parameters
  192. //Get city
  193. String city = message.getPayload(DataConstants.PARAM_KEY_CITY_TYPE);
  194. //Get stopId
  195. String stopId = message.getPayload(DataConstants.PARAM_KEY_STOP_ID);
  196. //Get routeId
  197. String routeId = message.getPayload(DataConstants.PARAM_KEY_ROUTE_ID);
  198. //Get userName
  199. String userName = message.getPayload(DataConstants.PARAM_KEY_USER_NAME);
  200. //Get comment
  201. String comment = message.getPayload(DataConstants.PARAM_KEY_COMMENT);
  202. String timeZone = "";
  203. if (city.equals(DataConstants.PARIS)) {
  204. timeZone = "Europe/Paris";
  205. } else if (city.equals(DataConstants.LONDON)) {
  206. timeZone = "Europe/London";
  207. }
  208. //Set to local timestamp
  209. timestamp = timestamp - TimeZone.getDefault().getRawOffset() +
  210. TimeZone.getTimeZone(timeZone).getRawOffset();
  211. if (DataConstants.DEBUG) TdServerLogger.print(TAG, methodTag,
  212. "city = " + city
  213. + ", stopId = " + stopId
  214. + ", userName = " + userName
  215. + ", comment = " + comment
  216. + ", timestamp = " + timestamp
  217. );
  218. //In Paris we can post different comment for diffrent lines
  219. //FIXME: We can only post the same comment for all lines in a tube station in London
  220. if (city.equals(DataConstants.LONDON)) {
  221. TubeStation metroStation = MongoDbManager.getLondonMetroStation(stopId);
  222. Tube[] tubes = metroStation.getTubes();
  223. for (Tube tube: tubes) {
  224. String routeIdLondon = tube.getId();
  225. //Insert comment into database
  226. if (DataConstants.DEBUG) TdServerLogger.print(TAG, methodTag,
  227. "city = " + city
  228. + ", routeId = " + routeIdLondon
  229. );
  230. MongoDbManager.insertComment(city, timestamp, userName, stopId, routeIdLondon, comment);
  231. }
  232. } else if (city.equals(DataConstants.PARIS)) {
  233. //Insert comment into database
  234. MongoDbManager.insertComment(city, timestamp, userName, stopId, routeId, comment);
  235. }
  236. } else {
  237. TdServerLogger.printError(TAG, methodTag, "Network message is null!");
  238. }
  239. }
  240. if (DataConstants.DEBUG) TdServerLogger.print(TAG, methodTag, "Process event finished");
  241. }
  242. @Override
  243. public void receiveEvent(IbiTopic forTopic,
  244. IbiResourceEvent resourceEvent) {
  245. if (DataConstants.DEBUG) TdServerLogger.print(TAG, "receiveEvent", "forTopic = " + forTopic.getName() + ", publisher = " + resourceEvent.getPublisher());
  246. }
  247. @Override
  248. public void receiveEvent(IbiResource forResource,
  249. IbiResourceEvent resourceEvent) {
  250. if (DataConstants.DEBUG) TdServerLogger.print(TAG, "receiveEvent", "forResource = " + forResource.getResName() + ", publisher = " + resourceEvent.getPublisher());
  251. }
  252. }