KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > quikj > application > web > talk > plugin > oamp > Monitor


1 /*
2  * Monitor.java
3  *
4  * Created on December 18, 2002, 9:30 PM
5  */

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 /**
18  *
19  * @author bhm
20  */

21 public class Monitor extends AceThread
22 {
23     /** Creates a new instance of Monitor */
24     public Monitor(String JavaDoc feature_name) throws IOException
25     {
26         super(feature_name + " Monitor");
27         
28         // set output column headings for user information
29
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         // interrupt the wait (kill this thread)
45
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                 // print error message
100
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                 // A signal message is received
111

112                 // print informational message
113
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 // unexpected event
141
{
142                 // print error message
143
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             // collect the statistics, also clear peg counts
162
setStatsInfo(user_stats_message, feature_stats_message, endpoints_stats_message, true);
163             
164             // send the stats messages to the clients
165

166             // clients monitoring users
167
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(); // take this client out of the list
174
}
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             // clients monitoring features
190
i = featureMonitors.iterator();
191             while (i.hasNext() == true)
192             {
193                 OAMPClient client = (OAMPClient) i.next();
194                 if (client.isLoggedIn() == false)
195                 {
196                     i.remove(); // take this client out of the list
197
}
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             // clients monitoring all registered endpoints
213
i = endpointMonitors.iterator();
214             while (i.hasNext() == true)
215             {
216                 OAMPClient client = (OAMPClient) i.next();
217                 if (client.isLoggedIn() == false)
218                 {
219                     i.remove(); // take this client out of the list
220
}
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         // Part 1: Collect/sort active endpoints
258

259         TreeMap featureList = new TreeMap(); // <classname,ArrayList of FeatureInterface>
260
StatisticsElement user_stats = new StatisticsElement();
261         user_stats.setName("Active Users");
262         user_stats.setMetaData(userMetaData);
263         
264         // get the list of active endpoints, collect stats
265
EndPointInfo[] endpoints = EndPointList.Instance().listRegisteredUsers();
266         if (endpoints != null)
267         {
268             // sort the endpoints, user vs. feature
269
for (int i = 0; i < endpoints.length; i++)
270             {
271                 // is it a feature?
272
Class JavaDoc[] 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) // it's a normal user
286
{
287                     // add this user's info to the user stats object
288
RowElement row = new RowElement();
289                     row.addListItem(endpoints[i].getName());
290                     row.addListItem(endpoints[i].getUserData().getFullName());
291                     row.addListItem(new Integer JavaDoc(endpoints[i].getCallCount()).toString());
292                     user_stats.addRow(row);
293                 }
294                 else
295                 {
296                     // add this feature object into the feature list
297
String JavaDoc classname = endpoints[i].getEndPoint().getClass().getName();
298                     ArrayList feature_objects = (ArrayList) featureList.get(classname);
299                     if (feature_objects != null)
300                     {
301                         // this classname already encountered
302
feature_objects.add(endpoints[i].getEndPoint());
303                     }
304                     else
305                     {
306                         // first time this classname encountered, add to featureList
307
feature_objects = new ArrayList();
308                         feature_objects.add(endpoints[i].getEndPoint());
309                         featureList.put(new String JavaDoc(classname), feature_objects);
310                     }
311                 }
312             }
313         }
314         
315         // Part 2: clear peg counts if specified, set stats info in given messages
316

317         // process users first, stats info already collected
318

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         // process the features in the feature list
330

331         Iterator e = featureList.keySet().iterator();
332         while (e.hasNext())
333         {
334             String JavaDoc classname = (String JavaDoc) 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             // send a stats message to this client and add it to the list
370

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             // send a stats message to this client and add it to the list
409

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             // send a stats message to this client and add it to the list
448

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 JavaDoc featureName;
486     private ArrayList userMonitors = new ArrayList();
487     private ArrayList featureMonitors = new ArrayList();
488     private ArrayList endpointMonitors = new ArrayList();
489     private Object JavaDoc monitorLock = new Object JavaDoc();
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