1 6 7 package com.quikj.application.web.talk.plugin.oamp; 8 9 import java.util.*; 10 import java.io.*; 11 12 import com.quikj.server.framework.*; 13 import com.quikj.application.web.talk.plugin.*; 14 import com.quikj.application.web.talk.messaging.oamp.*; 15 import com.quikj.application.web.oamp.plugin.*; 16 17 21 public class Monitor extends AceThread 22 { 23 24 public Monitor(String feature_name) throws IOException 25 { 26 super(feature_name + " Monitor"); 27 28 userMetaData.addListItem("Name "); 30 userMetaData.addListItem("Full Name "); 31 userMetaData.addListItem("Call Count"); 32 33 featureName = feature_name; 34 instance = this; 35 } 36 37 public static Monitor getInstance() 38 { 39 return instance; 40 } 41 42 public void dispose() 43 { 44 interruptWait(AceSignalMessage.SIGNAL_TERM, "disposed"); 46 47 instance = null; 48 } 49 50 private void cleanup() 51 { 52 if (timerId != -1) 53 { 54 try 55 { 56 AceTimer.Instance().cancelTimer(timerId); 57 timerId = -1; 58 } 59 catch (IOException ex) 60 { 61 ; 62 } 63 } 64 65 synchronized (monitorLock) 66 { 67 userMonitors.clear(); 68 featureMonitors.clear(); 69 endpointMonitors.clear(); 70 } 71 72 instance = null; 73 super.dispose(); 74 75 } 76 77 public void run() 78 { 79 try 80 { 81 timerId = AceTimer.Instance().startTimer(REFRESH_INTERVAL, 0); 82 } 83 catch (IOException ex) 84 { 85 AceLogger.Instance().log(AceLogger.ERROR, AceLogger.SYSTEM_LOG, 86 getName() 87 + "- run() -- Error starting monitor timer - " 88 + ex.getMessage()); 89 90 cleanup(); 91 return; 92 } 93 94 while (true) 95 { 96 AceMessageInterface message = waitMessage(); 97 if (message == null) 98 { 99 AceLogger.Instance().log(AceLogger.ERROR, AceLogger.SYSTEM_LOG, 101 getName() 102 + "- run() -- A null message was received while waiting for a message - " 103 + getErrorMessage()); 104 105 break; 106 } 107 108 if ((message instanceof AceSignalMessage) == true) 109 { 110 112 AceLogger.Instance().log(AceLogger.INFORMATIONAL, AceLogger.SYSTEM_LOG, 114 getName() 115 + " - Monitor.run() -- A signal " 116 + ((AceSignalMessage)message).getSignalId() 117 + " is received : " 118 + ((AceSignalMessage)message).getMessage()); 119 120 break; 121 } 122 else if ((message instanceof AceTimerMessage) == true) 123 { 124 updateClients(); 125 126 try 127 { 128 timerId = AceTimer.Instance().startTimer(REFRESH_INTERVAL, 0); 129 } 130 catch (IOException ex) 131 { 132 AceLogger.Instance().log(AceLogger.ERROR, AceLogger.SYSTEM_LOG, 133 getName() 134 + "- run() -- Error starting monitor timer - " 135 + ex.getMessage()); 136 137 break; 138 } 139 } 140 else { 142 AceLogger.Instance().log(AceLogger.ERROR, AceLogger.SYSTEM_LOG, 144 getName() 145 + "- run() -- An unexpected message is received : " 146 + message.messageType()); 147 } 148 } 149 150 cleanup(); 151 } 152 153 private void updateClients() 154 { 155 synchronized (monitorLock) 156 { 157 MonitorUsersStatisticsMessage user_stats_message = new MonitorUsersStatisticsMessage(); 158 MonitorFeaturesStatisticsMessage feature_stats_message = new MonitorFeaturesStatisticsMessage(); 159 MonitorEndPointsStatisticsMessage endpoints_stats_message = new MonitorEndPointsStatisticsMessage(); 160 161 setStatsInfo(user_stats_message, feature_stats_message, endpoints_stats_message, true); 163 164 166 Iterator i = userMonitors.iterator(); 168 while (i.hasNext() == true) 169 { 170 OAMPClient client = (OAMPClient) i.next(); 171 if (client.isLoggedIn() == false) 172 { 173 i.remove(); } 175 else 176 { 177 if (client.getParent().sendEvent 178 (new OAMPMessageEvent(null, user_stats_message, 0, null, 179 featureName)) == false) 180 { 181 AceLogger.Instance().log(AceLogger.ERROR, AceLogger.SYSTEM_LOG, 182 getName() 183 + "- updateClients() -- Error sending user statistics message to endpoint " 184 + client.getParent()); 185 } 186 } 187 } 188 189 i = featureMonitors.iterator(); 191 while (i.hasNext() == true) 192 { 193 OAMPClient client = (OAMPClient) i.next(); 194 if (client.isLoggedIn() == false) 195 { 196 i.remove(); } 198 else 199 { 200 if (client.getParent().sendEvent 201 (new OAMPMessageEvent(null, feature_stats_message, 0, null, 202 featureName)) == false) 203 { 204 AceLogger.Instance().log(AceLogger.ERROR, AceLogger.SYSTEM_LOG, 205 getName() 206 + "- updateClients() -- Error sending feature statistics message to endpoint " 207 + client.getParent()); 208 } 209 } 210 } 211 212 i = endpointMonitors.iterator(); 214 while (i.hasNext() == true) 215 { 216 OAMPClient client = (OAMPClient) i.next(); 217 if (client.isLoggedIn() == false) 218 { 219 i.remove(); } 221 else 222 { 223 if (client.getParent().sendEvent 224 (new OAMPMessageEvent(null, endpoints_stats_message, 0, null, 225 featureName)) == false) 226 { 227 AceLogger.Instance().log(AceLogger.ERROR, AceLogger.SYSTEM_LOG, 228 getName() 229 + "- updateClients() -- Error sending endpoints statistics message to endpoint " 230 + client.getParent()); 231 } 232 } 233 } 234 } 235 } 236 237 private void setStatsInfo(MonitorUsersStatisticsMessage user_stats_message) 238 { 239 setStatsInfo(user_stats_message, null, null, false); 240 } 241 242 private void setStatsInfo(MonitorFeaturesStatisticsMessage feature_stats_message) 243 { 244 setStatsInfo(null, feature_stats_message, null, false); 245 } 246 247 private void setStatsInfo(MonitorEndPointsStatisticsMessage endpoints_stats_message) 248 { 249 setStatsInfo(null, null, endpoints_stats_message, false); 250 } 251 252 private void setStatsInfo(MonitorUsersStatisticsMessage user_stats_message, 253 MonitorFeaturesStatisticsMessage feature_stats_message, 254 MonitorEndPointsStatisticsMessage endpoints_stats_message, 255 boolean clear_counts) 256 { 257 259 TreeMap featureList = new TreeMap(); StatisticsElement user_stats = new StatisticsElement(); 261 user_stats.setName("Active Users"); 262 user_stats.setMetaData(userMetaData); 263 264 EndPointInfo[] endpoints = EndPointList.Instance().listRegisteredUsers(); 266 if (endpoints != null) 267 { 268 for (int i = 0; i < endpoints.length; i++) 270 { 271 Class [] interfaces = endpoints[i].getEndPoint().getClass().getInterfaces(); 273 274 boolean found_feature = false; 275 for (int j = 0; j < interfaces.length; j++) 276 { 277 if (interfaces[j].getName().equals("com.quikj.application.web.talk.plugin.FeatureInterface") 278 == true) 279 { 280 found_feature = true; 281 break; 282 } 283 } 284 285 if (found_feature == false) { 287 RowElement row = new RowElement(); 289 row.addListItem(endpoints[i].getName()); 290 row.addListItem(endpoints[i].getUserData().getFullName()); 291 row.addListItem(new Integer (endpoints[i].getCallCount()).toString()); 292 user_stats.addRow(row); 293 } 294 else 295 { 296 String classname = endpoints[i].getEndPoint().getClass().getName(); 298 ArrayList feature_objects = (ArrayList) featureList.get(classname); 299 if (feature_objects != null) 300 { 301 feature_objects.add(endpoints[i].getEndPoint()); 303 } 304 else 305 { 306 feature_objects = new ArrayList(); 308 feature_objects.add(endpoints[i].getEndPoint()); 309 featureList.put(new String (classname), feature_objects); 310 } 311 } 312 } 313 } 314 315 317 319 if (user_stats_message != null) 320 { 321 user_stats_message.addElement(user_stats); 322 } 323 324 if (endpoints_stats_message != null) 325 { 326 endpoints_stats_message.addElement(user_stats); 327 } 328 329 331 Iterator e = featureList.keySet().iterator(); 332 while (e.hasNext()) 333 { 334 String classname = (String ) e.next(); 335 ArrayList feature_objects = (ArrayList) featureList.get(classname); 336 StatisticsElement feature_stats = new StatisticsElement(); 337 feature_stats.setName(classname.substring(classname.lastIndexOf('.') + 1, 338 classname.length()) + " Feature"); 339 FeatureInterface feature = (FeatureInterface)feature_objects.get(0); 340 feature_stats.setMetaData(feature.getStatsMetaData()); 341 342 int size = feature_objects.size(); 343 for (int i = 0; i < size; i++) 344 { 345 feature = (FeatureInterface) feature_objects.get(i); 346 feature_stats.addRow(feature.getStatsData()); 347 if (clear_counts == true) 348 { 349 feature.clearStatsCounts(); 350 } 351 } 352 353 if (feature_stats_message != null) 354 { 355 feature_stats_message.addElement(feature_stats); 356 } 357 358 if (endpoints_stats_message != null) 359 { 360 endpoints_stats_message.addElement(feature_stats); 361 } 362 } 363 } 364 365 public void addFeatureMonitor(OAMPClient client) 366 { 367 if (client.isAdminLevel() == true) 368 { 369 371 MonitorFeaturesStatisticsMessage feature_stats_message = new MonitorFeaturesStatisticsMessage(); 372 setStatsInfo(feature_stats_message); 373 374 if (client.getParent().sendEvent 375 (new OAMPMessageEvent(null, feature_stats_message, 0, null, 376 featureName)) == false) 377 { 378 AceLogger.Instance().log(AceLogger.ERROR, AceLogger.SYSTEM_LOG, 379 getName() 380 + "- addFeatureMonitor() -- Error sending feature statistics message to endpoint " 381 + client.getParent()); 382 383 return; 384 } 385 386 synchronized (monitorLock) 387 { 388 if (featureMonitors.contains(client) == false) 389 { 390 featureMonitors.add(client); 391 } 392 } 393 } 394 } 395 396 public void removeFeatureMonitor(OAMPClient client) 397 { 398 synchronized (monitorLock) 399 { 400 featureMonitors.remove(client); 401 } 402 } 403 404 public void addUserMonitor(OAMPClient client) 405 { 406 if (client.isAdminLevel() == true) 407 { 408 410 MonitorUsersStatisticsMessage user_stats_message = new MonitorUsersStatisticsMessage(); 411 setStatsInfo(user_stats_message); 412 413 if (client.getParent().sendEvent 414 (new OAMPMessageEvent(null, user_stats_message, 0, null, 415 featureName)) == false) 416 { 417 AceLogger.Instance().log(AceLogger.ERROR, AceLogger.SYSTEM_LOG, 418 getName() 419 + "- addUserMonitor() -- Error sending user statistics message to endpoint " 420 + client.getParent()); 421 422 return; 423 } 424 425 synchronized (monitorLock) 426 { 427 if (userMonitors.contains(client) == false) 428 { 429 userMonitors.add(client); 430 } 431 } 432 } 433 } 434 435 public void removeUserMonitor(OAMPClient client) 436 { 437 synchronized (monitorLock) 438 { 439 userMonitors.remove(client); 440 } 441 } 442 443 public void addEndPointMonitor(OAMPClient client) 444 { 445 if (client.isAdminLevel() == true) 446 { 447 449 MonitorEndPointsStatisticsMessage endpoints_stats_message = new MonitorEndPointsStatisticsMessage(); 450 setStatsInfo(endpoints_stats_message); 451 452 if (client.getParent().sendEvent 453 (new OAMPMessageEvent(null, endpoints_stats_message, 0, null, 454 featureName)) == false) 455 { 456 AceLogger.Instance().log(AceLogger.ERROR, AceLogger.SYSTEM_LOG, 457 getName() 458 + "- addEndPointMonitor() -- Error sending endpoint statistics message to endpoint " 459 + client.getParent()); 460 461 return; 462 } 463 464 synchronized (monitorLock) 465 { 466 if (endpointMonitors.contains(client) == false) 467 { 468 endpointMonitors.add(client); 469 } 470 } 471 } 472 } 473 474 public void removeEndPointMonitor(OAMPClient client) 475 { 476 synchronized (monitorLock) 477 { 478 endpointMonitors.remove(client); 479 } 480 } 481 482 483 private static Monitor instance = null; 484 485 private String featureName; 486 private ArrayList userMonitors = new ArrayList(); 487 private ArrayList featureMonitors = new ArrayList(); 488 private ArrayList endpointMonitors = new ArrayList(); 489 private Object monitorLock = new Object (); 490 private MetaDataElement userMetaData = new MetaDataElement(); 491 492 private int timerId = -1; 493 494 private static final int REFRESH_INTERVAL = 1 * 60 * 1000; 495 496 } 497 | Popular Tags |