1 22 package org.jboss.test.management.test; 23 24 import java.lang.reflect.UndeclaredThrowableException ; 25 import java.rmi.RemoteException ; 26 import java.util.HashSet ; 27 import java.util.Iterator ; 28 import java.util.Set ; 29 import javax.management.JMException ; 30 import javax.management.MBeanAttributeInfo ; 31 import javax.management.MBeanInfo ; 32 import javax.management.Notification ; 33 import javax.management.NotificationListener ; 34 import javax.management.ObjectName ; 35 import javax.management.j2ee.ListenerRegistration ; 36 import javax.management.j2ee.Management ; 37 import javax.management.j2ee.ManagementHome ; 38 import javax.management.j2ee.statistics.StatelessSessionBeanStats ; 39 import javax.management.j2ee.statistics.Statistic ; 40 import javax.rmi.PortableRemoteObject ; 41 42 import junit.framework.Test; 43 import org.jboss.management.j2ee.J2EEManagedObject; 44 import org.jboss.management.j2ee.J2EETypeConstants; 45 import org.jboss.test.JBossTestCase; 46 47 55 public class JSR77SpecUnitTestCase 56 extends JBossTestCase 57 { 58 public static final String TEST_DATASOURCE = "DefaultDS"; 60 public static final String TEST_MAIL = "DefaultMail"; 61 private String jsr77Domain; 62 63 65 public JSR77SpecUnitTestCase(String name) 66 { 67 super(name); 68 } 69 70 72 75 public void testConnect() throws Exception 76 { 77 log.debug("+++ testConnect"); 78 Management jsr77MEJB = getManagementEJB(); 79 String lDomain = jsr77MEJB.getDefaultDomain(); 80 log.debug("+++ testConnect, domain: " + lDomain); 81 jsr77MEJB.remove(); 82 } 83 84 87 public void testJ2EEDomain() 88 throws 89 Exception 90 { 91 getLog().debug("+++ testJ2EEDomain"); 92 Management jsr77MEJB = getManagementEJB(); 93 String domain = jsr77MEJB.getDefaultDomain(); 94 log.debug("domain=("+domain+")"); 95 String nameStr = domain 96 + ":" + J2EEManagedObject.TYPE + "=" + J2EETypeConstants.J2EEDomain 97 + ",name="+domain; 98 log.debug("nameStr=("+nameStr+")"); 99 ObjectName domainQuery = new ObjectName (nameStr); 100 log.debug("domainQuery=("+domainQuery+")"); 101 Set names = jsr77MEJB.queryNames(domainQuery, null); 102 if (names.isEmpty()) 103 { 104 fail("Could not find JSR-77 J2EEDomain '" + J2EETypeConstants.J2EEDomain + "'"); 105 } 106 if (names.size() > 1) 107 { 108 fail("Found more than one JSR-77 J2EEDomain '" + J2EETypeConstants.J2EEDomain + "'"); 109 } 110 ObjectName jsr77MEJBDomain = (ObjectName ) names.iterator().next(); 111 getLog().debug("+++ testJ2EEDomain, root: " + jsr77MEJBDomain); 112 jsr77MEJB.remove(); 113 } 114 115 118 public void testJ2EEServer() throws Exception 119 { 120 getLog().debug("+++ testJ2EEServer"); 121 Management jsr77MEJB = getManagementEJB(); 122 String domainName = jsr77MEJB.getDefaultDomain(); 123 ObjectName queryName = new ObjectName (domainName + ":" + 124 J2EEManagedObject.TYPE + "=" + J2EETypeConstants.J2EEServer + "," + "*"); 125 126 Set names = jsr77MEJB.queryNames(queryName, null); 127 if (names.isEmpty()) 128 { 129 fail("Could not find JSR-77 J2EEServer '" + J2EETypeConstants.J2EEServer + "'"); 130 } 131 Iterator iter = names.iterator(); 132 ObjectName serverName = null; 133 while (iter.hasNext()) 134 { 135 serverName = (ObjectName ) iter.next(); 136 getLog().debug("J2EEServer: " + serverName); 137 } 138 139 String vendor = (String ) jsr77MEJB.getAttribute(serverName, "serverVendor"); 141 getLog().debug("ServerVendor: " + vendor); 142 String version = (String ) jsr77MEJB.getAttribute(serverName, "serverVersion"); 143 getLog().debug("ServerVersion: " + version); 144 145 String [] jvms = (String []) jsr77MEJB.getAttribute(serverName, "javaVMs"); 147 if (jvms == null || jvms.length == 0) 148 fail("Failed to find any JavaVMs"); 149 ObjectName jvm = new ObjectName (jvms[0]); 150 getLog().debug("JavaVMs[0]: " + jvms[0]); 151 String javaVendor = (String ) jsr77MEJB.getAttribute(jvm, "javaVendor"); 152 getLog().debug("JavaVendor: " + javaVendor); 153 String javaVersion = (String ) jsr77MEJB.getAttribute(jvm, "javaVersion"); 154 getLog().debug("JavaVersion: " + javaVersion); 155 String node = (String ) jsr77MEJB.getAttribute(jvm, "node"); 156 getLog().debug("Node: " + node); 157 158 jsr77MEJB.remove(); 159 } 160 161 164 public void testJNDIResource() throws Exception 165 { 166 getLog().debug("+++ testJNDIResource"); 167 Management jsr77MEJB = getManagementEJB(); 168 String domainName = jsr77MEJB.getDefaultDomain(); 169 ObjectName queryName = new ObjectName (domainName + ":" + 170 J2EEManagedObject.TYPE + "=" + J2EETypeConstants.JNDIResource + "," + "*"); 171 Set names = jsr77MEJB.queryNames(queryName, null); 172 if (names.isEmpty()) 173 { 174 fail("Could not find JSR-77 JNDIResource '" + J2EETypeConstants.JNDIResource + "'"); 175 } 176 Iterator iter = names.iterator(); 177 while (iter.hasNext()) 178 getLog().debug("JNDIResource: " + iter.next()); 179 jsr77MEJB.remove(); 180 } 181 182 185 public void testJavaMailResource() throws Exception 186 { 187 getLog().debug("+++ testJavaMailResource"); 188 Management jsr77MEJB = getManagementEJB(); 189 String domainName = jsr77MEJB.getDefaultDomain(); 190 ObjectName queryName = new ObjectName (domainName + ":" + 191 J2EEManagedObject.TYPE + "=" + J2EETypeConstants.JavaMailResource + "," + "*"); 192 Set names = jsr77MEJB.queryNames(queryName, null); 193 if (names.isEmpty()) 194 { 195 fail("Could not find JSR-77 JavaMailResource '" + J2EETypeConstants.JavaMailResource + "'"); 196 } 197 Iterator iter = names.iterator(); 198 while (iter.hasNext()) 199 getLog().debug("JavaMailResource: " + iter.next()); 200 jsr77MEJB.remove(); 201 } 202 203 206 public void testJCAResource() throws Exception 207 { 208 getLog().debug("+++ testJCAResource"); 209 Management jsr77MEJB = getManagementEJB(); 210 String domainName = jsr77MEJB.getDefaultDomain(); 211 ObjectName queryName = new ObjectName (domainName + ":" + 212 J2EEManagedObject.TYPE + "=" + J2EETypeConstants.JCAResource + "," + "*"); 213 Set names = jsr77MEJB.queryNames(queryName, null); 214 if (names.isEmpty()) 215 { 216 fail("Could not find JSR-77 JCAResource '" + J2EETypeConstants.JCAResource + "'"); 217 } 218 Iterator iter = names.iterator(); 219 while (iter.hasNext()) 220 getLog().debug("JCAResource: " + iter.next()); 221 jsr77MEJB.remove(); 222 } 223 224 227 public void testJTAResource() throws Exception 228 { 229 getLog().debug("+++ testJTAResource"); 230 Management jsr77MEJB = getManagementEJB(); 231 String domainName = jsr77MEJB.getDefaultDomain(); 232 ObjectName queryName = new ObjectName (domainName + ":" + 233 J2EEManagedObject.TYPE + "=" + J2EETypeConstants.JTAResource + "," + "*"); 234 Set names = jsr77MEJB.queryNames(queryName, null); 235 if (names.isEmpty()) 236 { 237 fail("Could not find JSR-77 JTAResource '" + J2EETypeConstants.JTAResource + "'"); 238 } 239 Iterator iter = names.iterator(); 240 while (iter.hasNext()) 241 getLog().debug("JTAResource: " + iter.next()); 242 jsr77MEJB.remove(); 243 } 244 245 248 public void testJMSResource() throws Exception 249 { 250 getLog().debug("+++ testJMSResource"); 251 Management jsr77MEJB = getManagementEJB(); 252 String domainName = jsr77MEJB.getDefaultDomain(); 253 ObjectName queryName = new ObjectName (domainName + ":" + 254 J2EEManagedObject.TYPE + "=" + J2EETypeConstants.JMSResource + "," + "*"); 255 Set names = jsr77MEJB.queryNames(queryName, null); 256 if (names.isEmpty()) 257 { 258 fail("Could not find JSR-77 JMSResource '" + J2EETypeConstants.JMSResource + "'"); 259 } 260 Iterator iter = names.iterator(); 261 while (iter.hasNext()) 262 getLog().debug("JMSResource: " + iter.next()); 263 jsr77MEJB.remove(); 264 } 265 266 269 public void testJCAConnectionFactory() 270 throws 271 Exception 272 { 273 getLog().debug("+++ testJCAConnectionFactory"); 274 Management jsr77MEJB = getManagementEJB(); 275 Set names = jsr77MEJB.queryNames( 276 getConnectionFactoryName(jsr77MEJB), 277 null 278 ); 279 if (names.isEmpty()) 280 { 281 fail("Could not found JSR-77 JCAConnectionFactory named '" 282 + TEST_DATASOURCE + "'"); 283 } 284 if (names.size() > 1) 285 { 286 fail("Found more than one JSR-77 JCAConnectionFactory named '" 287 + TEST_DATASOURCE + "'"); 288 } 289 ObjectName factory = (ObjectName ) names.iterator().next(); 290 getLog().debug("+++ testJCAConnectionFactory, " + TEST_DATASOURCE 291 + ": " + factory); 292 jsr77MEJB.remove(); 293 } 294 295 298 public void testEJBModule() throws Exception 299 { 300 getLog().debug("+++ testEJBModule"); 301 Management jsr77MEJB = getManagementEJB(); 302 String domainName = jsr77MEJB.getDefaultDomain(); 303 ObjectName mejbModuleName = new ObjectName (domainName + ":" + 304 "J2EEServer=Local,J2EEApplication=null," 305 + J2EEManagedObject.TYPE + "=" + J2EETypeConstants.EJBModule 306 + ",name=ejb-management.jar"); 307 boolean isRegistered = jsr77MEJB.isRegistered(mejbModuleName); 308 assertTrue(mejbModuleName + " is registered", isRegistered); 309 String [] ejbs = (String []) jsr77MEJB.getAttribute(mejbModuleName, "ejbs"); 310 assertTrue("ejb-management.jar.Ejbs.length > 0", ejbs.length > 0); 311 for (int n = 0; n < ejbs.length; n++) 312 { 313 ObjectName ejb = new ObjectName (ejbs[n]); 314 getLog().debug("Ejbs[" + n + "]=" + ejb); 315 StatelessSessionBeanStats stats = (StatelessSessionBeanStats ) 316 jsr77MEJB.getAttribute(ejb, "stats"); 317 String [] statNames = stats.getStatisticNames(); 318 for (int s = 0; s < statNames.length; s++) 319 { 320 Statistic theStat = stats.getStatistic(statNames[s]); 321 getLog().debug(theStat); 322 } 323 } 324 jsr77MEJB.remove(); 325 } 326 327 330 public void testEJBStats() throws Exception 331 { 332 getLog().debug("+++ testEJBStats"); 333 Management jsr77MEJB = getManagementEJB(); 334 String beanName = null; 335 String query = "*:j2eeType=StatelessSessionBean,*"; 336 log.info(query); 337 ObjectName ejbName = new ObjectName (query); 338 Set managedObjects = jsr77MEJB.queryNames(ejbName, null); 339 log.info("Found " + managedObjects.size() + " objects"); 340 Iterator i = managedObjects.iterator(); 341 while (i.hasNext()) 342 { 343 ObjectName oName = (ObjectName ) i.next(); 344 beanName = oName.getKeyProperty("name"); 345 StatelessSessionBeanStats stats = 346 (StatelessSessionBeanStats ) jsr77MEJB.getAttribute(oName, 347 "stats"); 348 Statistic [] allStats = stats.getStatistics(); 349 for (int s = 0; s < allStats.length; s++) 350 { 351 Statistic theStat = allStats[s]; 352 getLog().debug(theStat); 353 } 354 } 355 jsr77MEJB.remove(); 356 } 357 358 361 public void testWebModule() throws Exception 362 { 363 getLog().debug("+++ testWebModule"); 364 Management jsr77MEJB = getManagementEJB(); 365 String domainName = jsr77MEJB.getDefaultDomain(); 366 ObjectName webModuleName = new ObjectName (domainName + ":" + 367 "J2EEServer=Local,J2EEApplication=null," 368 + J2EEManagedObject.TYPE + "=" + J2EETypeConstants.WebModule 369 + ",name=jmx-console.war"); 370 boolean isRegistered = jsr77MEJB.isRegistered(webModuleName); 371 assertTrue(webModuleName + " is registered", isRegistered); 372 String [] servlets = (String []) jsr77MEJB.getAttribute(webModuleName, "servlets"); 373 assertTrue("jmx-console.war.Servlets.length > 0", servlets.length > 0); 374 for (int n = 0; n < servlets.length; n++) 375 getLog().debug("Servlets[" + n + "]=" + servlets[n]); 376 jsr77MEJB.remove(); 377 } 378 379 382 public void testResourceAdapterModule() throws Exception 383 { 384 getLog().debug("+++ testResourceAdapterModule"); 385 Management jsr77MEJB = getManagementEJB(); 386 String domainName = jsr77MEJB.getDefaultDomain(); 387 ObjectName rarModuleName = new ObjectName (domainName + ":" + 388 "J2EEServer=Local,J2EEApplication=null," 389 + J2EEManagedObject.TYPE + "=" + J2EETypeConstants.ResourceAdapterModule 390 + ",name=jboss-local-jdbc.rar"); 391 boolean isRegistered = jsr77MEJB.isRegistered(rarModuleName); 392 assertTrue(rarModuleName + " is registered", isRegistered); 393 String [] ras = (String []) jsr77MEJB.getAttribute(rarModuleName, "resourceAdapters"); 394 assertTrue("jboss-local-jdbc.rar.ResourceAdapters.length > 0", ras.length > 0); 395 for (int n = 0; n < ras.length; n++) 396 getLog().debug("ResourceAdapters[" + n + "]=" + ras[n]); 397 jsr77MEJB.remove(); 398 } 399 400 403 public void testNotificationDeliver() 404 throws Exception 405 { 406 try 407 { 408 getLog().debug("+++ testNotificationDeliver"); 409 Management jsr77MEJB = getManagementEJB(); 410 Set names = jsr77MEJB.queryNames(getMailName(jsr77MEJB), null); 411 if (names.isEmpty()) 412 { 413 fail("Could not found JSR-77 JavaMailResource'" + TEST_MAIL + "'"); 414 } 415 ObjectName lMail = (ObjectName ) names.iterator().next(); 416 Listener lLocalListener = new Listener (); 417 ListenerRegistration lListenerFactory = jsr77MEJB.getListenerRegistry(); 418 getLog().debug("+++ testNotificationDeliver, add Notification Listener to " + TEST_MAIL + 419 " with Listener Registry: " + lListenerFactory); 420 lListenerFactory.addNotificationListener( 421 lMail, 422 lLocalListener, 423 null, 424 null 425 ); 426 getLog().debug("+++ testNotificationDeliver, stop " + TEST_MAIL + ""); 427 jsr77MEJB.invoke(lMail, "stop", new Object []{}, new String []{}); 428 getLog().debug("+++ testNotificationDeliver, start " + TEST_MAIL + ""); 429 jsr77MEJB.invoke(lMail, "start", new Object []{}, new String []{}); 430 Thread.sleep(5000); 432 if (lLocalListener.getNumberOfNotifications() < 2) 433 { 434 fail("Not enough notifications received: " + lLocalListener.getNumberOfNotifications()); 435 } 436 getLog().debug("+++ testNotificationDeliver, remove Notification Listener from " + TEST_MAIL + ""); 437 lListenerFactory.removeNotificationListener( 438 lMail, 439 lLocalListener 440 ); 441 jsr77MEJB.remove(); 442 } 443 catch (Exception e) 444 { 445 log.debug("failed", e); 446 throw e; 447 } 448 } 449 450 453 public void testNavigation() 454 throws Exception 455 { 456 log.info("+++ testNavigation"); 457 Management jsr77MEJB = null; 458 try 459 { 460 jsr77MEJB = getManagementEJB(); 462 String domain = jsr77MEJB.getDefaultDomain(); 463 ObjectName domainQuery = new ObjectName (domain 464 + ":" + J2EEManagedObject.TYPE + "=" + J2EETypeConstants.J2EEDomain 465 + ",name="+domain); 466 Set names = jsr77MEJB.queryNames(domainQuery, null); 467 468 if (names.isEmpty()) 469 { 470 fail("Could not find any J2EEDomain"); 471 } 472 if (names.size() > 1) 473 { 474 fail("Found more than one J2EEDomain, "+names); 475 } 476 477 ObjectName jsr77MEJBDomain = (ObjectName ) names.iterator().next(); 478 log.info("J2EEDomain: "+jsr77MEJBDomain); 479 jsr77Domain = jsr77MEJBDomain.getDomain(); 480 report(jsr77MEJB, jsr77MEJBDomain, new HashSet ()); 482 } 483 catch (Exception e) 484 { 485 log.debug("failed", e); 486 throw e; 487 } 488 catch (Error err) 489 { 490 log.debug("failed", err); 491 throw err; 492 } 493 finally 494 { 495 if (jsr77MEJB != null) 496 { 497 jsr77MEJB.remove(); 498 } 499 } 500 } 501 502 private void report(Management jsr77EJB, ObjectName mbean, HashSet reportedNames) 503 throws JMException , 504 RemoteException 505 { 506 if (mbean == null) 507 return; 508 509 if (reportedNames.contains(mbean)) 510 { 511 log.debug("Skipping already reported MBean: " + mbean); 512 return; 513 } 514 515 log.debug("Begin Report Object: " + mbean); 516 reportedNames.add(mbean); 517 MBeanInfo mbeanInfo = jsr77EJB.getMBeanInfo(mbean); 518 MBeanAttributeInfo [] attrInfo = mbeanInfo.getAttributes(); 519 String [] attrNames = new String [attrInfo.length]; 520 for (int i = 0; i < attrInfo.length; i++) 522 { 523 String name = attrInfo[i].getName(); 524 String type = attrInfo[i].getType(); 525 boolean readable = attrInfo[i].isReadable(); 526 log.debug("Attribute: " + name + ", " + type + ", readable: " + readable); 527 attrNames[i] = attrInfo[i].getName(); 528 } 529 530 for (int i = 0; i < attrNames.length; i++) 532 { 533 String name = attrNames[i]; 534 Object value = null; 535 try 536 { 537 if (attrInfo[i].isReadable() == true) 538 value = jsr77EJB.getAttribute(mbean, name); 539 } 540 catch (UndeclaredThrowableException e) 541 { 542 Throwable ex = e.getUndeclaredThrowable(); 543 log.debug("Failed to access attribute: " + name + ", " + ex.getMessage()); 544 } 545 catch (Exception e) 546 { 547 if (name.equals("MessageCache")) 549 continue; 550 551 555 log.debug("Failed to access attribute: " + name, e); 556 String type = attrInfo[i].getType(); 557 boolean isJSR77Type = type.startsWith("javax.management") || 558 type.startsWith("org.jboss.management.j2ee"); 559 assertTrue("Bad attribute(" + name + ") is not a JSR77 type", isJSR77Type == false); 560 } 561 562 if (value == null) 563 { 564 log.debug("Attribute: " + name + " is empty"); 565 } 566 else if (ObjectName .class.getName().equals(attrInfo[i].getType())) 567 { 568 ObjectName toName = (ObjectName ) value; 570 if (checkBlock(toName, name)) 571 { 572 log.debug("Blocked Attribute: " + name + " contains: " + toName); 573 continue; 574 } 575 log.debug("Attribute: " + name + ", value: " + value + ", is reported"); 577 report(jsr77EJB, (ObjectName ) value, reportedNames); 578 } 579 else if (ObjectName [].class.getName().equals(attrInfo[i].getType())) 580 { 581 ObjectName [] names = (ObjectName []) value; 582 for (int j = 0; j < names.length; j++) 583 { 584 ObjectName toName = names[j]; 585 if (checkBlock(toName, name)) 587 { 588 log.debug("Blocked ObjectName: " + toName); 589 continue; 590 } 591 log.debug("Attribute: " + name + ", value: " + toName + ", is reported"); 592 report(jsr77EJB, toName, reportedNames); 593 } 594 } 595 else 596 { 597 log.debug("Attribute: " + name + " contains: " + value); 598 } 599 } 600 log.debug("End Report Object: " + mbean); 601 } 602 603 609 private boolean checkBlock(ObjectName name, String attrName) 610 { 611 String domain = name == null ? "" : name.getDomain(); 613 if( domain.equals(this.jsr77Domain) == false ) 614 return true; 615 616 String type = (String ) name.getKeyPropertyList().get(J2EEManagedObject.TYPE); 617 if (J2EETypeConstants.EJBModule.equals(type) || 618 J2EETypeConstants.WebModule.equals(type) || 619 J2EETypeConstants.ResourceAdapterModule.equals(type) || 620 J2EETypeConstants.ServiceModule.equals(type)) 621 { 622 if ("Server".equals(attrName)) 623 { 624 return true; 626 } 627 } 628 return "Parent".equals(attrName) || 629 "ObjectName".equals(attrName); 630 } 631 632 private Management getManagementEJB() 633 throws 634 Exception 635 { 636 getLog().debug("+++ getManagementEJB()"); 637 Object lObject = getInitialContext().lookup("ejb/mgmt/MEJB"); 638 ManagementHome home = (ManagementHome ) PortableRemoteObject.narrow( 639 lObject, 640 ManagementHome .class 641 ); 642 getLog().debug("Found JSR-77 Management EJB (MEJB)"); 643 return home.create(); 644 } 645 646 private ObjectName getConnectionFactoryName(Management jsr77MEJB) throws Exception 647 { 648 String domainName = jsr77MEJB.getDefaultDomain(); 649 return new ObjectName (domainName + ":" + 650 J2EEManagedObject.TYPE + "=" + J2EETypeConstants.JCAConnectionFactory + "," + 651 "name=" + TEST_DATASOURCE + "," + 652 "*" 653 ); 654 } 655 656 private ObjectName getMailName(Management jsr77MEJB) throws Exception 657 { 658 String domainName = jsr77MEJB.getDefaultDomain(); 659 return new ObjectName (domainName + ":" + 660 J2EEManagedObject.TYPE + "=" + J2EETypeConstants.JavaMailResource + "," + 661 "*" 662 ); 663 } 664 666 private class Listener implements NotificationListener 667 { 668 669 private int mNrOfNotifications = 0; 670 671 public int getNumberOfNotifications() 672 { 673 return mNrOfNotifications; 674 } 675 676 public void handleNotification(Notification pNotification, Object pHandbank) 677 { 678 mNrOfNotifications++; 679 } 680 } 681 682 public static Test suite() throws Exception 683 { 684 return getDeploySetup(JSR77SpecUnitTestCase.class, "ejb-management.jar"); 685 } 686 687 } 688 | Popular Tags |