001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.geronimo.monitoring.console;
018
019 import java.sql.Connection;
020 import java.sql.Statement;
021 import java.text.Format;
022 import java.text.SimpleDateFormat;
023 import java.util.ArrayList;
024 import java.util.Date;
025 import java.util.HashMap;
026 import java.util.Hashtable;
027 import java.util.Iterator;
028 import java.util.Properties;
029 import java.util.Set;
030 import java.util.TreeMap;
031 import java.util.TreeSet;
032
033 import javax.management.MBeanServerConnection;
034 import javax.management.ObjectName;
035 import javax.management.remote.JMXConnector;
036 import javax.management.remote.JMXConnectorFactory;
037 import javax.management.remote.JMXServiceURL;
038
039 import javax.naming.Context;
040 import javax.naming.InitialContext;
041
042 import org.apache.geronimo.monitoring.MasterRemoteControlRemote;
043 import org.apache.geronimo.monitoring.console.util.DBManager;
044
045 import org.apache.geronimo.crypto.EncryptionManager;
046
047 public class MRCConnector {
048
049 private static String PATH = null;
050 private static MBeanServerConnection mbServerConn;
051 private MasterRemoteControlRemote mrc = null;
052 private int Protocol = 0;
053
054 MRCConnector() {
055
056 }
057
058 /**
059 * @param ip -
060 * IP address of mrc-server to connect to
061 * @param userName -
062 * Username for JMX connection to the host
063 * @param password -
064 * Password for JMX connection to the host
065 * @throws Exception -
066 * If the connection to mrc-server fails
067 */
068 public MRCConnector(String ip, String userName, String password, int port,
069 int protocol) throws Exception {
070 // decrypt the password
071 password = (String) EncryptionManager.decrypt(password);
072 Protocol = protocol;
073
074 if (Protocol == 1) {
075
076 try {
077 Properties props = new Properties();
078 props
079 .setProperty(Context.INITIAL_CONTEXT_FACTORY,
080 "org.apache.openejb.client.RemoteInitialContextFactory");
081 props.setProperty(Context.PROVIDER_URL, "ejbd://" + ip + ":"
082 + port);
083 props.setProperty(Context.SECURITY_PRINCIPAL, userName);
084 props.setProperty(Context.SECURITY_CREDENTIALS, password);
085 props.setProperty("openejb.authentication.realmName",
086 "geronimo-admin");
087 Context ic = new InitialContext(props);
088 mrc = (MasterRemoteControlRemote) ic
089 .lookup("ejb/mgmt/MRCRemote");
090 mrc.setUpMEJB(userName, password);
091 } catch (Exception e) {
092 throw e;
093 }
094
095 } else {
096 try {
097 JMXServiceURL serviceURL = new JMXServiceURL(
098 "service:jmx:rmi:///jndi/rmi://" + ip + ":" + port
099 + "/JMXConnector");
100 Hashtable<String, Object> env = new Hashtable<String, Object>();
101 String[] credentials = new String[2];
102 credentials[0] = userName;
103 credentials[1] = password;
104 env.put(JMXConnector.CREDENTIALS, credentials);
105 JMXConnector connector = JMXConnectorFactory.connect(
106 serviceURL, env);
107 mbServerConn = connector.getMBeanServerConnection();
108
109 // retrieve the mbean name to the agent-car-jmx plugin
110 if(PATH == null) {
111 Set<ObjectName> mbeanNames = mbServerConn.queryNames(new ObjectName("*:name=MasterRemoteControlJMX,*"), null);
112 for(Iterator<ObjectName> it = mbeanNames.iterator(); it.hasNext(); ) {
113 String mbeanName = ((ObjectName)it.next()).getCanonicalName();
114 if(mbeanName.contains("agent-car-jmx") &&
115 mbeanName.contains("MasterRemoteControlJMX") &&
116 mbeanName.contains("GBean")) {
117 PATH = mbeanName;
118 break;
119 }
120 }
121
122 if(PATH == null) {
123 throw new Exception("[ERROR] Required mbean not found: agent-car-jmx");
124 }
125 }
126 } catch (Exception e) {
127 e.printStackTrace();
128 throw e;
129 }
130
131 }
132 // when the code has reach this point, a connection was successfully
133 // established
134 // so we need to update the last_seen attribute for the server
135 Format formatter = null;
136 formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
137 Date date = new Date(System.currentTimeMillis());
138 String currentTime = formatter.format(date);
139
140 Connection conn = DBManager.createConnection();
141 try {
142 Statement stmt = conn.createStatement();
143 stmt.executeUpdate("UPDATE SERVERS SET LAST_SEEN = '" + currentTime
144 + "' WHERE IP='" + ip + "'");
145 } catch (Exception e) {
146 throw e;
147 } finally {
148 try {
149 if (conn != null) {
150 conn.close();
151 }
152 } catch (Exception e) {
153
154 }
155 }
156 }
157
158 /**
159 * @return - Returns an Long representing the current snapshot duration set
160 * on the server side
161 * @throws Exception -
162 * If the connection to the MRC-Server fails
163 */
164 public Long getSnapshotDuration() throws Exception {
165 if (Protocol == 1) {
166
167 return mrc.getSnapshotDuration();
168
169 } else {
170
171 return (Long) mbServerConn.invoke(new ObjectName(PATH),
172 "getSnapshotDuration", new Object[] {}, new String[] {});
173 }
174 }
175
176 /**
177 * @return - Returns an ArrayList of String objects containing a listing of
178 * all statistics values being collected
179 * @throws Exception -
180 * If the connection to the MRC-Server fails
181 */
182 @SuppressWarnings("unchecked")
183 public HashMap<String, ArrayList<String>> getDataNameList()
184 throws Exception {
185
186 HashMap<String, ArrayList<String>> DataNameList = new HashMap<String, ArrayList<String>>();
187
188 if (Protocol == 1) {
189
190 try {
191 DataNameList = mrc.getAllSnapshotStatAttributes();
192 } catch (Exception e) {
193 e.printStackTrace();
194 }
195
196 } else {
197 try {
198 DataNameList = (HashMap<String, ArrayList<String>>) mbServerConn
199 .invoke(new ObjectName(PATH),
200 "getAllSnapshotStatAttributes",
201 new Object[] {}, new String[] {});
202 } catch (Exception e) {
203 e.printStackTrace();
204 }
205 }
206 // Strip out snapshot_date and snapshot_time, we know these exist
207 for (Iterator<String> it = DataNameList.keySet().iterator(); it
208 .hasNext();) {
209 String mbeanName = it.next();
210 DataNameList.get(mbeanName).remove("snapshot_date");
211 DataNameList.get(mbeanName).remove("snapshot_time");
212 }
213 return DataNameList;
214 }
215
216 /**
217 * @param snapCount -
218 * Number of snapshots to request from the server
219 * @param skipCount -
220 * Every nth snapshot. A value of 1 will be every 1. A value of 2
221 * will be every other.
222 * @return - Returns an ArrayList of Map objects.
223 * @throws Exception -
224 * If the connection to the MRC-Server fails
225 */
226 @SuppressWarnings("unchecked")
227 public ArrayList<HashMap<String, HashMap<String, Object>>> getSnapshots(
228 int snapCount, int skipCount) throws Exception {
229 ArrayList<HashMap<String, HashMap<String, Object>>> snapshotList = null;
230 if (Protocol == 1) {
231
232 snapshotList = mrc.fetchSnapshotData(snapCount, skipCount);
233
234 } else {
235 snapshotList = (ArrayList<HashMap<String, HashMap<String, Object>>>) mbServerConn
236 .invoke(new ObjectName(PATH), "fetchSnapshotData",
237 new Object[] { snapCount, skipCount },
238 new String[] { "java.lang.Integer",
239 "java.lang.Integer" });
240 }
241 // Check if snapshotList is empty
242 if (snapshotList.size() == 0) {
243 return snapshotList;
244 }
245 /*
246 * If there are not enough snapshots available to fill the requested
247 * number, insert some with values of 0 and the proper times.
248 */
249 while (snapshotList.size() < snapCount) {
250 // Temporary, always is first element (oldest)
251 HashMap<String, HashMap<String, Object>> mapTimeFix = snapshotList
252 .get(0);
253
254 // Temporary map, used to generate blank data to be added to
255 // the
256 // list at position 0
257 HashMap<String, HashMap<String, Object>> tempMap = new HashMap<String, HashMap<String, Object>>();
258
259 // Temporary submap, used to store 0 elements to be added to
260 // the
261 // tempmap
262 HashMap<String, Object> subMap = new HashMap<String, Object>();
263
264 // Calculate appropriate time, add it to the submap, then
265 // add
266 // that to the tempMap
267 subMap.put("snapshot_time", ((Long) mapTimeFix.get("times").get(
268 "snapshot_time") - (getSnapshotDuration() * skipCount)));
269 Format formatter = null;
270 formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
271 Date date = new Date((Long) subMap.get("snapshot_time"));
272 subMap.put("snapshot_date", formatter.format(date));
273
274 // Add the submap back to the tempmap
275 tempMap.put("times", new HashMap<String, Object>(subMap));
276
277 // Clear out the subMap for use again
278 subMap.clear();
279
280 // Run through the mbeans
281
282 // Run through the mbeans
283 for (Iterator<String> it = mapTimeFix.keySet().iterator(); it
284 .hasNext();) {
285 // get the mbean name
286 String mbeanName = it.next();
287 HashMap<String, Object> stats = null;
288 // Verify that it's not times
289
290 if (mbeanName.equals(new String("times"))) {
291
292 } else {
293 stats = mapTimeFix.get(mbeanName);
294 // Run through the stats elements for the particular
295 // mbean
296 for (Iterator<String> itt = stats.keySet().iterator(); itt
297 .hasNext();) {
298 String key = itt.next();
299 // Place faux data into the submap
300 subMap.put(key, new Long(0));
301 }
302 // Add the submap to the tempmap, and clear it
303 tempMap.put(mbeanName, new HashMap<String, Object>(subMap));
304 }
305 }
306 snapshotList.add(0, new HashMap<String, HashMap<String, Object>>(
307 tempMap));
308 }
309
310 /*
311 * This is where we will be inserting data to fill 'gaps' in the
312 * snapshots The initial for-loop will travel from the most recent
313 * snapshot to the oldest, checking that the snapshot_time along the way
314 * all align with what they should be
315 */
316 for (int i = snapshotList.size() - 1; i > 0; i--) {
317 if (i > 0) {
318 HashMap<String, HashMap<String, Object>> mapTimeFix = snapshotList
319 .get(i);
320 HashMap<String, HashMap<String, Object>> mapTimeFix2 = snapshotList
321 .get(i - 1);
322 // here is where we will in missing data
323 while (((((Long) mapTimeFix.get("times").get("snapshot_time") / 1000) / 60)
324 - (((Long) mapTimeFix2.get("times")
325 .get("snapshot_time") / 1000) / 60) > (((getSnapshotDuration() / 1000) / 60) * skipCount))) {
326 HashMap<String, HashMap<String, Object>> tempMap = new HashMap<String, HashMap<String, Object>>();
327 HashMap<String, Object> subMap = new HashMap<String, Object>();
328
329 for (Iterator<String> it = mapTimeFix.keySet().iterator(); it
330 .hasNext();) {
331 // get the mbean name
332 String mbeanName = it.next();
333 HashMap<String, Object> stats = null;
334 // Verify that it's not times
335 if (!mbeanName.equals("times")) {
336 stats = mapTimeFix.get(mbeanName);
337 // Run through the stats elements for the
338 // particular
339 // mbean
340 for (Iterator<String> itt = stats.keySet()
341 .iterator(); itt.hasNext();) {
342 String key = itt.next();
343 // Place faux data into the submap
344 subMap.put(key, new Long(0));
345 }
346 // Add the submap to the tempmap, and clear it
347 tempMap.put(mbeanName, new HashMap<String, Object>(
348 subMap));
349 subMap.clear();
350 }
351 }
352
353 subMap.put("snapshot_time", new Long((Long) mapTimeFix.get(
354 "times").get("snapshot_time")
355 - (getSnapshotDuration() * skipCount)));
356 Format formatter = null;
357 formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
358 Date date = new Date((Long) subMap.get("snapshot_time"));
359 subMap.put("snapshot_date", formatter.format(date));
360 tempMap.put("times", new HashMap<String, Object>(subMap));
361 subMap.clear();
362 snapshotList.add(i,
363 new HashMap<String, HashMap<String, Object>>(
364 tempMap));
365 snapshotList.remove(0);
366 mapTimeFix = tempMap;
367 mapTimeFix2 = snapshotList.get(i - 1);
368 }
369 }
370 }
371 return snapshotList;
372 }
373
374 @SuppressWarnings("unchecked")
375 public TreeMap<Long, Long> getSpecificStatistics(String mbeanName,
376 String statsName, int snapCount, int skipCount, boolean showArchive)
377 throws Exception {
378 TreeMap<Long, Long> snapshotList = null;
379 if (Protocol == 1) {
380
381 snapshotList = mrc.getSpecificStatistics(mbeanName, statsName,
382 snapCount, skipCount, showArchive);
383
384 } else {
385 snapshotList = (TreeMap<Long, Long>) mbServerConn.invoke(
386 new ObjectName(PATH), "getSpecificStatistics",
387 new Object[] { mbeanName, statsName, snapCount, skipCount,
388 showArchive }, new String[] { "java.lang.String",
389 "java.lang.String", "java.lang.Integer",
390 "java.lang.Integer", "java.lang.Boolean" });
391
392 }
393 // Check if snapshotList is empty
394 if (snapshotList.size() == 0) {
395 return snapshotList;
396 }
397 /*
398 * If there are not enough snapshots available to fill the requested
399 * number, insert some with values of 0 and the proper times.
400 */
401 while (snapshotList.size() < snapCount) {
402 // Temporary, always is first element (oldest)
403 Long timeFix = snapshotList.firstKey();
404
405 // Calculate appropriate time, add it to the submap, then
406 // add
407 // that to the tempMap
408 snapshotList.put((timeFix - (getSnapshotDuration() * skipCount)),
409 new Long(0));
410 }
411
412 /*
413 * This is where we will be inserting data to fill 'gaps' in the
414 * snapshots The initial for-loop will travel from the most recent
415 * snapshot to the oldest, checking that the snapshot_time along the way
416 * all align with what they should be
417 */
418 Set tempSet = snapshotList.keySet();
419 ArrayList<Long> tempArray = new ArrayList(tempSet);
420
421 for (int i = tempArray.size() - 1; i > 0; i--) {
422 Long tempLong1 = tempArray.get(i);
423 Long tempLong2 = tempArray.get(i - 1);
424 // here is where we will in missing data
425 while ((((tempLong1 / 1000) / 60) - ((tempLong2 / 1000) / 60) > (((getSnapshotDuration() / 1000) / 60) * skipCount))
426 && i > 0) {
427 tempLong1 = tempLong1 - (getSnapshotDuration() * skipCount);
428 snapshotList.remove(tempArray.get(0));
429 snapshotList.put(tempLong1, new Long(0));
430 tempArray.remove(0);
431 i--;
432 }
433 }
434 return snapshotList;
435 }
436
437 @SuppressWarnings("unchecked")
438 public HashMap<String, HashMap<String, Object>> getLatestSnapshots()
439 throws Exception {
440 int snapCount = 1;
441 int skipCount = 1;
442 ArrayList<HashMap<String, HashMap<String, Object>>> snapshotList = null;
443 if (Protocol == 1) {
444
445 snapshotList = mrc.fetchSnapshotData(snapCount, skipCount);
446
447 } else {
448 snapshotList = (ArrayList<HashMap<String, HashMap<String, Object>>>) mbServerConn
449 .invoke(new ObjectName(PATH), "fetchSnapshotData",
450 new Object[] { snapCount, skipCount },
451 new String[] { "java.lang.Integer",
452 "java.lang.Integer" });
453 }
454 // Check if snapshotList is empty
455 if (snapshotList.size() == 0) {
456 return null;
457 } else
458 return snapshotList.get(0);
459 }
460
461 /**
462 * @return - Returns a boolean indicating successful stop
463 * @throws Exception -
464 * If the connection to the MRC-Server fails
465 */
466 public boolean stopSnapshotThread() throws Exception {
467 if (Protocol == 1) {
468
469 return mrc.stopSnapshot();
470
471 } else {
472 return (Boolean) mbServerConn.invoke(new ObjectName(PATH),
473 "stopSnapshot", new Object[] {}, new String[] {});
474 }
475 }
476
477 /**
478 * @return - Returns a boolean indicating successful stop
479 * @throws Exception -
480 * If the connection to the MRC-Server fails
481 */
482 public boolean startSnapshotThread(long time) throws Exception {
483 if (Protocol == 1) {
484
485 return mrc.startSnapshot(time);
486
487 } else {
488 return (Boolean) mbServerConn.invoke(new ObjectName(PATH),
489 "startSnapshot", new Object[] { time },
490 new String[] { "java.lang.Long" });
491 }
492 }
493
494 public int isSnapshotRunning() {
495 Integer running = 0;
496 if (Protocol == 1) {
497
498 try {
499 if (mrc.isSnapshotRunning())
500 running = 1;
501 } catch (Exception e) {
502 return 0;
503 }
504
505 } else {
506 try {
507 running = (Integer) mbServerConn.invoke(new ObjectName(PATH),
508 "SnapshotStatus", new Object[] {}, new String[] {});
509 } catch (Exception e) {
510 e.printStackTrace();
511 return 0;
512 }
513 }
514 return running;
515 }
516
517 @SuppressWarnings("unchecked")
518 public Set<String> getAllMbeanNames() throws Exception {
519 if (Protocol == 1) {
520
521 return mrc.getAllMBeanNames();
522
523 } else {
524 return (Set<String>) mbServerConn.invoke(new ObjectName(PATH),
525 "getAllMBeanNames", new Object[] {}, new String[] {});
526 }
527 }
528
529 @SuppressWarnings("unchecked")
530 public Set<String> getStatisticsProviderBeanNames() throws Exception {
531 if (Protocol == 1) {
532
533 return mrc.getStatisticsProviderMBeanNames();
534
535 } else {
536 return (Set<String>) mbServerConn.invoke(new ObjectName(PATH),
537 "getStatisticsProviderMBeanNames", new Object[] {},
538 new String[] {});
539 }
540 }
541
542 @SuppressWarnings("unchecked")
543 public HashMap<String, ArrayList<String>> getAllSnapshotStatAttributes()
544 throws Exception {
545 if (Protocol == 1) {
546
547 return mrc.getAllSnapshotStatAttributes();
548
549 } else {
550 return (HashMap<String, ArrayList<String>>) mbServerConn.invoke(
551 new ObjectName(PATH), "getAllSnapshotStatAttributes",
552 new Object[] {}, new String[] {});
553 }
554 }
555
556 @SuppressWarnings("unchecked")
557 public Set<String> getTrackedBeans() throws Exception {
558 if (Protocol == 1) {
559
560 return mrc.getTrackedMBeans();
561
562 } else {
563 return (Set<String>) mbServerConn.invoke(new ObjectName(PATH),
564 "getTrackedMBeans", new Object[] {}, new String[] {});
565 }
566 }
567
568 @SuppressWarnings("unchecked")
569 public Set<String> getStatAttributesOnMBean(String mBean) throws Exception {
570 HashMap<String, ArrayList<String>> allStatAttributes = getAllSnapshotStatAttributes();
571 ArrayList<String> tempArrayList = allStatAttributes.get(mBean);
572 Set<String> tempSet = new TreeSet<String>();
573 Iterator it = tempArrayList.iterator();
574 while (it.hasNext()) {
575 tempSet.add(it.next().toString());
576 }
577 return tempSet;
578 }
579
580 @SuppressWarnings("unchecked")
581 public Set<String> getTrackedBeansPretty() throws Exception {
582 Set trackedBeans = getTrackedBeans();
583 Set prettybeans = new TreeSet();
584 Iterator it = trackedBeans.iterator();
585 while (it.hasNext()) {
586 String[] temparray1 = it.next().toString().split("name=");
587 String[] temparray2 = temparray1[1].split(",");
588 String[] temparray3 = temparray2[0].split("/");
589 String mbeanName = null;
590 if (temparray3.length > 1)
591 mbeanName = temparray3[1];
592 else
593 mbeanName = temparray2[0];
594 prettybeans.add(mbeanName);
595 }
596 return prettybeans;
597 }
598
599 @SuppressWarnings("unchecked")
600 public TreeMap<String, String> getTrackedBeansMap() throws Exception {
601 Set trackedBeans = getTrackedBeans();
602 TreeMap<String, String> beanMap = new TreeMap<String, String>();
603 Iterator it = trackedBeans.iterator();
604 while (it.hasNext()) {
605 String mbeanName = it.next().toString();
606 String[] temparray1 = mbeanName.split("name=");
607 String[] temparray2 = temparray1[1].split(",");
608 String[] temparray3 = temparray2[0].split("/");
609 String mbeanNamePretty = null;
610 if (temparray3.length > 1)
611 mbeanNamePretty = temparray3[1];
612 else
613 mbeanNamePretty = temparray2[0];
614 beanMap.put(mbeanNamePretty, mbeanName);
615 }
616 return beanMap;
617 }
618
619 @SuppressWarnings("unchecked")
620 public Set<String> getStatisticsProviderBeanNamesPretty() throws Exception {
621 Set availableBeans = getStatisticsProviderBeanNames();
622 Set prettybeans = new TreeSet();
623 Iterator it = availableBeans.iterator();
624 while (it.hasNext()) {
625 String[] temparray1 = it.next().toString().split("name=");
626 String[] temparray2 = temparray1[1].split(",");
627 String[] temparray3 = temparray2[0].split("/");
628 String mbeanName = null;
629 if (temparray3.length > 1)
630 mbeanName = temparray3[1];
631 else
632 mbeanName = temparray2[0];
633 prettybeans.add(mbeanName);
634 }
635 return prettybeans;
636 }
637
638 @SuppressWarnings("unchecked")
639 public TreeMap<String, String> getStatisticsProviderBeanNamesMap()
640 throws Exception {
641 Set availableBeans = getStatisticsProviderBeanNames();
642 TreeMap<String, String> beanMap = new TreeMap<String, String>();
643 Iterator it = availableBeans.iterator();
644 while (it.hasNext()) {
645 String mbeanName = it.next().toString();
646 String[] temparray1 = mbeanName.split("name=");
647 String[] temparray2 = temparray1[1].split(",");
648 String[] temparray3 = temparray2[0].split("/");
649 String mbeanNamePretty = null;
650 if (temparray3.length > 1)
651 mbeanNamePretty = temparray3[1];
652 else
653 mbeanNamePretty = temparray2[0];
654 beanMap.put(mbeanNamePretty, mbeanName);
655 }
656 return beanMap;
657 }
658
659 @SuppressWarnings("unchecked")
660 public Set<String> getFreeStatisticsProviderBeanNamesPretty()
661 throws Exception {
662 Set<String> availableBeans = getStatisticsProviderBeanNamesPretty();
663 Set<String> usedBeans = getTrackedBeansPretty();
664 Set freeBeans = new TreeSet();
665 Iterator it = availableBeans.iterator();
666 while (it.hasNext()) {
667 String mbeanName = it.next().toString();
668 if (!usedBeans.contains(mbeanName))
669 freeBeans.add(mbeanName);
670 }
671 return freeBeans;
672 }
673
674 @SuppressWarnings("unchecked")
675 public Set<String> getFreeStatisticsProviderBeanNames() throws Exception {
676 Set<String> availableBeans = getStatisticsProviderBeanNames();
677 Set<String> usedBeans = getTrackedBeansPretty();
678 Set freeBeans = new TreeSet();
679 Iterator it = availableBeans.iterator();
680 while (it.hasNext()) {
681 String mbeanName = it.next().toString();
682 String[] temparray1 = mbeanName.split("name=");
683 String[] temparray2 = temparray1[1].split(",");
684 String[] temparray3 = temparray2[0].split("/");
685 String mbeanNamePretty = null;
686 if (temparray3.length > 1)
687 mbeanNamePretty = temparray3[1];
688 else
689 mbeanNamePretty = temparray2[0];
690 if (!usedBeans.contains(mbeanNamePretty))
691 freeBeans.add(mbeanName);
692 }
693 return freeBeans;
694 }
695
696 @SuppressWarnings("unchecked")
697 public TreeMap<String, String> getFreeStatisticsProviderBeanNamesMap()
698 throws Exception {
699 Set<String> availableBeans = getStatisticsProviderBeanNames();
700 Set<String> usedBeans = getTrackedBeansPretty();
701 TreeMap<String, String> beanMap = new TreeMap<String, String>();
702 Iterator it = availableBeans.iterator();
703 while (it.hasNext()) {
704 String mbeanName = it.next().toString();
705 String[] temparray1 = mbeanName.split("name=");
706 String[] temparray2 = temparray1[1].split(",");
707 String[] temparray3 = temparray2[0].split("/");
708 String mbeanNamePretty = null;
709 if (temparray3.length > 1)
710 mbeanNamePretty = temparray3[1];
711 else
712 mbeanNamePretty = temparray2[0];
713 if (!usedBeans.contains(mbeanNamePretty))
714 beanMap.put(mbeanNamePretty, mbeanName);
715 }
716 return beanMap;
717 }
718
719 @SuppressWarnings("unchecked")
720 public boolean stopTrackingMbean(String MBean) throws Exception {
721 if (Protocol == 1) {
722
723 mrc.removeMBeanForSnapshot(MBean);
724
725 } else {
726 mbServerConn
727 .invoke(new ObjectName(PATH), "removeMBeanForSnapshot",
728 new Object[] { MBean },
729 new String[] { "java.lang.String" });
730
731 }
732 return true;
733 }
734
735 @SuppressWarnings("unchecked")
736 public boolean startTrackingMbean(String MBean) throws Exception {
737 if (Protocol == 1) {
738
739 mrc.addMBeanForSnapshot(MBean);
740
741 } else {
742 mbServerConn
743 .invoke(new ObjectName(PATH), "addMBeanForSnapshot",
744 new Object[] { MBean },
745 new String[] { "java.lang.String" });
746 }
747 return true;
748 }
749
750 @SuppressWarnings("unchecked")
751 public HashMap<String, Long> getStats(String MBean) throws Exception {
752 if (Protocol == 1) {
753
754 return mrc.getStats(MBean);
755
756 } else {
757 return (HashMap<String, Long>) mbServerConn.invoke(new ObjectName(
758 PATH), "getStats", new Object[] { MBean },
759 new String[] { "java.lang.String" });
760 }
761 }
762
763 public void setSnapshotDuration(long duration) {
764 if (Protocol == 1) {
765
766 mrc.setSnapshotDuration(new Long(duration));
767
768 } else {
769 try {
770
771 mbServerConn.invoke(new ObjectName(PATH),
772 "setSnapshotDuration",
773 new Object[] { new Long(duration) },
774 new String[] { "java.lang.Long" });
775 } catch (Exception e) {
776 e.printStackTrace();
777 }
778 }
779 }
780
781 public int getSnapshotRetention() {
782 if (Protocol == 1) {
783
784 return Integer.parseInt(mrc.getSnapshotRetention());
785
786 } else {
787 try {
788 return (Integer) mbServerConn.invoke(new ObjectName(PATH),
789 "getSnapshotRetention", new Object[] {},
790 new String[] {});
791 } catch (Exception e) {
792 e.printStackTrace();
793 }
794 }
795 return 0;
796 }
797
798 public void setSnapshotRetention(int duration) {
799 if (Protocol == 1) {
800
801 mrc.setSnapshotRetention(duration);
802
803 } else {
804 try {
805 mbServerConn.invoke(new ObjectName(PATH),
806 "setSnapshotRetention", new Object[] { duration },
807 new String[] { "java.lang.Integer" });
808 } catch (Exception e) {
809 e.printStackTrace();
810 }
811 }
812 }
813 }