1 23 package com.sun.enterprise.admin.server.core.jmx; 24 25 import java.lang.reflect.Method ; 27 import java.util.Set ; 28 import java.util.HashSet ; 29 import java.io.ObjectOutputStream ; 30 import java.io.ObjectInputStream ; 31 import java.util.logging.Level ; 32 import java.util.logging.Logger ; 33 34 import javax.management.MBeanServer ; 36 import javax.management.QueryExp ; 37 import javax.management.ObjectInstance ; 38 import javax.management.ObjectName ; 39 import javax.management.Attribute ; 40 import javax.management.AttributeList ; 41 import javax.management.InstanceAlreadyExistsException ; 42 import javax.management.InvalidAttributeValueException ; 43 import javax.management.InstanceNotFoundException ; 44 import javax.management.AttributeNotFoundException ; 45 import javax.management.ReflectionException ; 46 import javax.management.MBeanException ; 47 import javax.management.IntrospectionException ; 48 import javax.management.ListenerNotFoundException ; 49 import javax.management.MBeanInfo ; 50 import javax.management.MBeanAttributeInfo ; 51 import javax.management.MBeanNotificationInfo ; 52 import javax.management.MBeanOperationInfo ; 53 import javax.management.MBeanConstructorInfo ; 54 import javax.management.MBeanRegistrationException ; 55 import javax.management.NotificationListener ; 56 import javax.management.NotificationFilter ; 57 import javax.management.NotCompliantMBeanException ; 58 import javax.management.OperationsException ; 59 import javax.management.MBeanRegistrationException ; 60 import javax.management.NotCompliantMBeanException ; 61 62 import com.sun.enterprise.admin.meta.MBeanRegistry; 63 import com.sun.enterprise.admin.meta.MBeanRegistryFactory; 64 import com.sun.enterprise.server.ApplicationServer; 66 67 import com.sun.enterprise.admin.AdminContext; 69 import com.sun.enterprise.admin.common.ObjectNames; 70 import com.sun.enterprise.admin.common.ObjectNameHelper; 71 import com.sun.enterprise.admin.common.constant.AdminConstants; 72 import com.sun.enterprise.admin.common.exception.AFRuntimeStoreException; 73 import com.sun.enterprise.admin.common.exception.AFRuntimeException; 74 import com.sun.enterprise.admin.event.AdminEventCache; 75 import com.sun.enterprise.admin.util.proxy.ProxyFactory; 76 77 import com.sun.enterprise.util.i18n.StringManager; 79 80 import javax.management.MBeanServerFactory ; 81 import javax.management.loading.ClassLoaderRepository ; 82 83 import com.sun.enterprise.config.serverbeans.ServerHelper; 84 85 86 import com.sun.enterprise.admin.server.core.jmx.storage.PersistenceChecker; 87 import com.sun.enterprise.admin.server.core.jmx.storage.MBeanManufacturer; 88 import com.sun.enterprise.server.ondemand.entry.*; 89 90 114 115 public class SunoneInterceptor implements MBeanServer , EntryPoint { 116 117 public static final String HOT_CONFIG_METHOD_NAME = "canApplyConfigChanges"; 118 public static final String FORCE_APPLY_METHOD_NAME = "overwriteConfigChanges"; 119 public static final String APPLY_METHOD_NAME = "applyConfigChanges"; 120 public static final String USE_MANUAL_METHOD_NAME = "useManualConfigChanges"; 121 public static final String GET_HOST_AND_PORT_METHOD_NAME = "getHostAndPort"; 122 123 124 private static final Logger sLogger = 125 Logger.getLogger(AdminConstants.kLoggerName); 126 private static StringManager localStrings = 127 StringManager.getManager( SunoneInterceptor.class ); 128 private static AdminContext adminContext; 129 130 private MBeanServer realMBeanServer; 131 132 140 141 SunoneInterceptor(String defaultDomainName) throws InitException { 142 } 143 144 147 void setJmxMBeanServer(MBeanServer jmxMBS) throws InitException { 148 realMBeanServer = (MBeanServer )ProxyFactory.createProxy( 149 MBeanServer .class, jmxMBS, 150 adminContext.getMBeanServerInterceptor()); 151 logMBeanServerInfo(); 152 initialize(); 153 } 154 155 163 164 SunoneInterceptor() throws InitException { 165 this(ServiceName.DOMAIN); 166 } 167 168 176 177 public static MBeanServer getMBeanServerInstance() 178 throws InitException { 179 return AppServerMBeanServerFactory.getMBeanServerInstance(); 180 } 181 182 185 public static void setAdminContext(AdminContext ctx) { 186 adminContext = ctx; 187 } 188 189 195 196 private void initialize() throws InitException { 197 try { 198 ObjectName controllerObjectName 199 = ObjectNames.getControllerObjectName(); 200 ObjectName configObjectName 201 = ObjectNames.getGenericConfiguratorObjectName(); 202 ObjectName [] objectNames = { 203 controllerObjectName, 204 configObjectName 205 }; 206 String controllerClassName = 207 "com.sun.enterprise.admin.server.core.mbean.config.ServerController"; 208 String configClassName = 209 "com.sun.enterprise.admin.server.core.mbean.config.GenericConfigurator"; 210 String [] clNames = {controllerClassName, configClassName}; 211 for (int i = 0 ; i < clNames.length ; i++) { 212 createAndRegister( clNames[i], objectNames[ i ] ); 213 } 214 registerDottedNameSupport(); 215 } 216 catch (Exception e) { 217 throw new InitException(e.getMessage(), e.getCause() ); 218 } 219 } 220 221 225 226 static private final String DottedMBeansIniterClassName = 228 "com.sun.enterprise.admin.mbeans.DottedNameMBeansIniter"; 229 230 private void 231 registerDottedNameSupport() 232 throws Exception 233 { 234 final Class initerClass = Class.forName( DottedMBeansIniterClassName ); 235 236 final Class [] signature = new Class [] { MBeanServer .class }; 238 final java.lang.reflect.Constructor constructor = initerClass.getConstructor( signature ); 239 constructor.newInstance( new Object [] { this } ); 240 } 242 243 private ObjectInstance createAndRegister( String className, ObjectName objectName ) 244 throws Exception 245 { 246 try 247 { 248 final Class mbeanClass = Class.forName( className ); 249 final Object mbeanImpl = mbeanClass.newInstance(); 250 final ObjectInstance mbeanInstance = this.registerMBean( mbeanImpl, objectName ); 251 252 sLogger.log(Level.FINE, "core.system_mbean_init_ok", objectName.toString() ); 253 return( mbeanInstance ); 254 } 255 catch( Exception e ) 256 { 257 e.printStackTrace(); 258 throw e; 259 } 260 } 261 262 263 264 public ObjectInstance registerMBean(Object object, ObjectName objectName) 265 throws InstanceAlreadyExistsException , 266 MBeanRegistrationException , 267 NotCompliantMBeanException { 268 return (realMBeanServer.registerMBean(object, objectName)); 269 } 270 271 public void generateEntryContext(Object obj) { 272 ServerEntryHelper.generateMbeanEntryContext((ObjectName ) obj); 273 } 274 275 276 public Object invoke(ObjectName objectName, String operationName, 277 Object [] params, String [] signature) 278 throws ReflectionException , InstanceNotFoundException , MBeanException { 279 280 generateEntryContext(objectName); 281 282 if(isInstanceMBean(objectName) && isConfigCheckRequired(operationName)) { 283 checkHotConfigChanges(objectName); 284 } 285 286 if(FORCE_APPLY_METHOD_NAME.equals(operationName)) { 287 String instanceName = 290 ObjectNameHelper.getServerInstanceName(objectName); 291 AdminEventCache cache = AdminEventCache.getInstance(instanceName); 292 cache.setRestartNeeded(true); 293 } 295 registerWithPersistenceCheck(objectName); 296 Object actualResult = realMBeanServer.invoke(objectName, operationName, 298 params, signature ); 299 return ( actualResult ); 300 } 301 302 public Object getAttribute(ObjectName objectName, String attributeName) 303 throws InstanceNotFoundException , AttributeNotFoundException , 304 MBeanException , ReflectionException { 305 if(isInstanceMBean(objectName)) { 306 checkHotConfigChanges(objectName); 307 } 308 registerWithPersistenceCheck(objectName); 309 Object value = realMBeanServer.getAttribute(objectName, attributeName); 311 return ( value ); 312 } 313 314 public void setAttribute(ObjectName objectName, Attribute attribute) throws 315 InstanceNotFoundException , AttributeNotFoundException , 316 MBeanException , ReflectionException , InvalidAttributeValueException { 317 if(isInstanceMBean(objectName)) { 318 checkHotConfigChanges(objectName); 319 } 320 registerWithPersistenceCheck(objectName); 321 realMBeanServer.setAttribute(objectName, attribute); 323 } 324 325 public AttributeList getAttributes(ObjectName objectName, String [] attrNames) 326 throws InstanceNotFoundException , ReflectionException { { 329 checkHotConfigChanges(objectName); 330 } 331 332 registerWithPersistenceCheck(objectName); 333 return ( realMBeanServer.getAttributes(objectName, attrNames) ); 334 } 335 336 public AttributeList setAttributes (ObjectName objectName, AttributeList attributeList) 337 throws InstanceNotFoundException , ReflectionException { 338 if(isInstanceMBean(objectName)) { 339 checkHotConfigChanges(objectName); 340 } 341 342 registerWithPersistenceCheck(objectName); 343 return ( realMBeanServer.setAttributes(objectName, attributeList) ); 344 } 345 346 347 public void unregisterMBean(ObjectName objectName) 348 throws InstanceNotFoundException , MBeanRegistrationException { 349 realMBeanServer.unregisterMBean(objectName); 350 } 351 352 public Integer getMBeanCount() { 353 return ( realMBeanServer.getMBeanCount() ); 354 } 355 356 public Set queryMBeans(ObjectName name, QueryExp exp) { 357 registerConfigMBeans(); 358 return ( realMBeanServer.queryMBeans(name, exp) ); 359 } 360 361 public MBeanInfo getMBeanInfo(ObjectName objName) throws 362 InstanceNotFoundException , IntrospectionException , ReflectionException { 363 registerWithPersistenceCheck(objName); 364 return ( realMBeanServer.getMBeanInfo(objName) ); 365 } 366 367 public boolean isRegistered(ObjectName name) { 368 385 return realMBeanServer.isRegistered(name); 386 } 387 388 public void addNotificationListener(ObjectName objectName, 389 NotificationListener notificationListener, 390 NotificationFilter notificationFilter, Object obj) 391 throws InstanceNotFoundException { 392 realMBeanServer.addNotificationListener(objectName, 393 notificationListener, notificationFilter, obj); 394 } 395 396 public void addNotificationListener (ObjectName objectName, 397 ObjectName objectName1, NotificationFilter notificationFilter, 398 Object obj) throws InstanceNotFoundException { 399 realMBeanServer.addNotificationListener(objectName, objectName1, 400 notificationFilter, obj); 401 } 402 403 public ObjectInstance createMBean (String str, ObjectName objectName) 404 throws ReflectionException , InstanceAlreadyExistsException , 405 MBeanRegistrationException , MBeanException , 406 NotCompliantMBeanException { 407 return realMBeanServer.createMBean (str, objectName); 408 } 409 410 public ObjectInstance createMBean (String str, ObjectName objectName, 411 ObjectName objectName2) throws ReflectionException , 412 InstanceAlreadyExistsException , MBeanRegistrationException , 413 MBeanException , NotCompliantMBeanException , InstanceNotFoundException { 414 return ( realMBeanServer.createMBean (str, objectName, objectName2) ); 415 } 416 417 public ObjectInstance createMBean (String str, ObjectName objectName, 418 Object [] obj, String [] str3) 419 throws ReflectionException , InstanceAlreadyExistsException , 420 MBeanRegistrationException , MBeanException , NotCompliantMBeanException { 421 return realMBeanServer.createMBean (str, objectName, obj, str3); 422 } 423 424 public ObjectInstance createMBean (String str, ObjectName objectName, 425 ObjectName objectName2, Object [] obj, String [] str4) 426 throws ReflectionException , InstanceAlreadyExistsException , 427 MBeanRegistrationException , MBeanException , 428 NotCompliantMBeanException , InstanceNotFoundException { 429 return realMBeanServer.createMBean (str, objectName, 430 objectName2, obj, str4); 431 } 432 433 434 public ObjectInputStream deserialize (String str, byte[] values) 435 throws OperationsException , ReflectionException { 436 return realMBeanServer.deserialize (str, values); 437 } 438 439 440 public ObjectInputStream deserialize (ObjectName objectName, byte[] values) 441 throws InstanceNotFoundException , OperationsException { 442 return realMBeanServer.deserialize (objectName, values); 443 } 444 445 public ObjectInputStream deserialize (String str, ObjectName objectName, 446 byte[] values) throws InstanceNotFoundException , OperationsException , 447 ReflectionException { 448 return realMBeanServer.deserialize (str, objectName, values); 449 } 450 451 public String getDefaultDomain() { 452 return realMBeanServer.getDefaultDomain(); 453 } 454 455 public ObjectInstance getObjectInstance(ObjectName objectName) 456 throws InstanceNotFoundException { 457 return realMBeanServer.getObjectInstance(objectName); 458 } 459 460 public Object instantiate(String str) throws ReflectionException , 461 MBeanException { 462 return realMBeanServer.instantiate(str); 463 } 464 465 public Object instantiate(String str, ObjectName objectName) 466 throws ReflectionException , MBeanException , InstanceNotFoundException { 467 return realMBeanServer.instantiate(str, objectName); 468 } 469 470 public Object instantiate(String str, Object [] obj, String [] str2) 471 throws ReflectionException , MBeanException { 472 return realMBeanServer.instantiate(str, obj, str2); 473 } 474 475 public Object instantiate(String str, ObjectName objectName, 476 Object [] obj, String [] str3) 477 throws ReflectionException , MBeanException , InstanceNotFoundException { 478 return realMBeanServer.instantiate(str, objectName, obj, str3); 479 } 480 481 public boolean isInstanceOf (ObjectName objectName, String str) 482 throws InstanceNotFoundException { 483 return realMBeanServer.isInstanceOf(objectName, str); 484 } 485 486 public Set queryNames (ObjectName objectName, QueryExp queryExp) { 487 registerConfigMBeans(); 488 return realMBeanServer.queryNames(objectName, queryExp); 489 } 490 491 public void removeNotificationListener (ObjectName objectName, 492 ObjectName objectName1) 493 throws InstanceNotFoundException , ListenerNotFoundException { 494 realMBeanServer.removeNotificationListener (objectName, 495 objectName1); 496 } 497 498 public void removeNotificationListener (ObjectName objectName, 499 NotificationListener notificationListener) 500 throws InstanceNotFoundException , ListenerNotFoundException { 501 realMBeanServer.removeNotificationListener (objectName, 502 notificationListener); 503 } 504 505 507 private void checkHotConfigChanges(ObjectName mbeanName) { 508 try { 510 String instanceName = ApplicationServer.getServerContext().getInstanceName(); 513 ObjectName instanceObjectName = ObjectNames.getServerInstanceObjectName(instanceName); 514 Object canApply = this.invoke(instanceObjectName, HOT_CONFIG_METHOD_NAME, 515 null, null); 516 if (canApply.equals(Boolean.FALSE)) { 518 String msg = localStrings.getString( 519 "admin.server.core.jmx.configuration_changed_apply_changes", 520 instanceName); 521 throw new AFRuntimeStoreException( msg ); 522 } 523 } catch(AFRuntimeStoreException af) { 524 throw af; 525 } catch (Exception e) { 526 String msg = localStrings.getString( "admin.server.core.jmx.bad_server_configuration" ); 527 sLogger.log(Level.INFO, msg, e); 528 throw new AFRuntimeException( msg, e ); 529 } 530 } 531 532 private boolean isInstanceMBean(ObjectName mbeanName) { 533 if(ObjectNameHelper.getServerInstanceName(mbeanName) != null) { 534 return true; 535 } else { 536 return false; 537 } 538 } 539 540 private boolean isConfigCheckRequired(String operationName) { 541 543 if(GET_HOST_AND_PORT_METHOD_NAME.equals(operationName)) { 544 return false; 546 } 547 548 if(FORCE_APPLY_METHOD_NAME.equals(operationName)) { 549 return false; 551 } 552 553 if(USE_MANUAL_METHOD_NAME.equals(operationName)) { 554 return false; 556 } 557 558 559 if(HOT_CONFIG_METHOD_NAME.equals(operationName)) { 560 return false; 561 } 562 563 if("getMBeanInfo".equals(operationName)) { 565 return false; 566 } 567 569 return true; 571 } 572 573 574 581 private MBeanServer getRealMBeanServerAndInstantiate(ObjectName objectName) throws InstanceNotFoundException 582 { 583 registerWithPersistenceCheck(objectName); 584 return realMBeanServer; 585 } 586 587 public ClassLoader getClassLoader(ObjectName objectName) 588 throws InstanceNotFoundException { 589 return ( getRealMBeanServerAndInstantiate(objectName).getClassLoader(objectName) ); 590 } 591 592 public ClassLoader getClassLoaderFor(ObjectName objectName) 593 throws InstanceNotFoundException { 594 return ( getRealMBeanServerAndInstantiate(objectName).getClassLoaderFor(objectName) ); 595 596 } 597 598 public ClassLoaderRepository getClassLoaderRepository() { 599 return ( realMBeanServer.getClassLoaderRepository() ); 600 } 601 602 public String [] getDomains() { 603 return ( realMBeanServer.getDomains() ); 604 } 605 606 public void removeNotificationListener(ObjectName objectName, 607 NotificationListener notificationListener, NotificationFilter 608 notificationFilter, Object obj) throws InstanceNotFoundException , 609 ListenerNotFoundException { 610 realMBeanServer. 611 removeNotificationListener(objectName, notificationListener, 612 notificationFilter, obj); 613 } 614 615 public void removeNotificationListener(ObjectName objectName, 616 ObjectName objectName1, NotificationFilter notificationFilter, 617 Object obj) 618 throws InstanceNotFoundException , ListenerNotFoundException { 619 realMBeanServer.removeNotificationListener(objectName, objectName1, 620 notificationFilter, obj); 621 } 622 623 628 private void logMBeanServerInfo() { 629 try { 630 final String name = "JMImplementation:type=MBeanServerDelegate"; 631 final ObjectName oName = new ObjectName (name); 632 633 sLogger.log(Level.FINE, "core.mbs_info"); 634 String attrName = "ImplementationName"; 636 String result = (String ) realMBeanServer. 637 getAttribute(oName, attrName); 638 sLogger.log(Level.FINE, "core.mbs_implementation", result); 639 attrName = "ImplementationVendor"; 641 result = (String ) realMBeanServer.getAttribute(oName, attrName); 642 sLogger.log(Level.FINE, "core.mbs_vendor", result); 643 attrName = "ImplementationVersion"; 645 result = (String ) realMBeanServer.getAttribute(oName, attrName); 646 sLogger.log(Level.FINE, "core.jmx_impl_version", result); 647 attrName = "MBeanServerId"; 649 result = (String ) realMBeanServer.getAttribute(oName, attrName); 650 sLogger.log(Level.FINE, "core.mbs_id", result); 651 result = realMBeanServer.getClass().getName(); 652 sLogger.log(Level.FINE, "core_mbs_classname", result); 653 } 654 catch(Exception e) { 655 throw new RuntimeException (e); 656 } 657 } 658 661 synchronized private void manufactureAndRegisterMBean(ObjectName oName) throws Exception 662 { 663 if (realMBeanServer.isRegistered(oName) ) { 665 return; } 668 final Object product = manufactureMBean(oName); 670 if(product==null) 671 { 672 String msg = localStrings.getString( 673 "admin.server.core.jmx.lazybean_not_found", 674 oName.toString()); 675 throw new InstanceNotFoundException (msg); 676 } 677 this.registerMBean(product, oName); 679 sLogger.log(Level.FINE, "core.create_and_register", oName); 680 } 681 682 691 private void registerWithPersistenceCheck(ObjectName oName) throws InstanceNotFoundException 692 { 693 694 if (! realMBeanServer.isRegistered(oName) ) { 695 try { 696 manufactureAndRegisterMBean(oName); 698 } 699 catch (InstanceNotFoundException infe) 700 { 701 throw infe; 702 } 703 catch (RuntimeException re) 704 { 705 throw re; 706 } 707 catch (Exception e) { 708 throw new RuntimeException (e); 709 } 710 } 711 } 715 716 private Object manufactureMBean(ObjectName oName) throws InstanceNotFoundException 717 { 718 final PersistenceChecker checker = new PersistenceChecker(); 719 checker.setAdminContext(adminContext); 720 final Object storedObject = checker.findElement(oName); 721 Object match = null; 722 if (storedObject != null) { 723 MBeanManufacturer producer = new MBeanManufacturer(oName, storedObject); 724 producer.setAdminContext(adminContext); 725 match = producer.createMBeanInstance(); 726 } 727 else { 728 sLogger.log(Level.FINEST, "core.not_in_config", oName); 730 } 731 return ( match ); 733 } 734 735 public void shutdown() { 736 MBeanServerFactory.releaseMBeanServer(realMBeanServer); 737 sLogger.log(Level.FINE, "core.release_mbs"); 738 } 739 740 741 private void logMBeanInfo(ObjectName oName) { 742 743 if (!sLogger.isLoggable(Level.FINEST)) { 745 return; 746 } 747 748 MBeanInfo info = null; 750 try { 751 info = realMBeanServer.getMBeanInfo(oName); 752 } catch (Exception e) { 753 e.printStackTrace(); 754 return; 755 } 756 sLogger.log(Level.FINEST,"\nCLASSNAME: \t"+ info.getClassName()); 757 sLogger.log(Level.FINEST,"\nDESCRIPTION: \t"+ info.getDescription()); 758 sLogger.log(Level.FINEST,"\nATTRIBUTES"); 759 MBeanAttributeInfo [] attrInfo = info.getAttributes(); 760 if (attrInfo.length>0) { 761 for(int i=0; i<attrInfo.length; i++) { 762 sLogger.log(Level.FINEST," ** NAME: \t"+ attrInfo[i].getName()); 763 sLogger.log(Level.FINEST," DESCR: \t"+ attrInfo[i].getDescription()); 764 sLogger.log(Level.FINEST," TYPE: \t"+ attrInfo[i].getType() + 765 "\tREAD: "+ attrInfo[i].isReadable() + 766 "\tWRITE: "+ attrInfo[i].isWritable()); 767 } 768 } else 769 sLogger.log(Level.FINEST," ** No attributes **"); 770 sLogger.log(Level.FINEST,"\nCONSTRUCTORS"); 771 MBeanConstructorInfo [] constrInfo = info.getConstructors(); 772 for(int i=0; i<constrInfo.length; i++) { 773 sLogger.log(Level.FINEST," ** NAME: \t"+ constrInfo[i].getName()); 774 sLogger.log(Level.FINEST," DESCR: \t"+ constrInfo[i].getDescription()); 775 sLogger.log(Level.FINEST," PARAM: \t"+ constrInfo[i].getSignature().length +" parameter(s)"); 776 } 777 sLogger.log(Level.FINEST,"\nOPERATIONS"); 778 MBeanOperationInfo [] opInfo = info.getOperations(); 779 if (opInfo.length>0) { 780 for(int i=0; i<opInfo.length; i++) { 781 sLogger.log(Level.FINEST," ** NAME: \t"+ opInfo[i].getName()); 782 sLogger.log(Level.FINEST," DESCR: \t"+ opInfo[i].getDescription()); 783 sLogger.log(Level.FINEST," PARAM: \t"+ opInfo[i].getSignature().length +" parameter(s)"); 784 } 785 } else 786 sLogger.log(Level.FINEST," ** No operations ** "); 787 sLogger.log(Level.FINEST,"\nNOTIFICATIONS"); 788 MBeanNotificationInfo [] notifInfo = info.getNotifications(); 789 if (notifInfo.length>0) { 790 for(int i=0; i<notifInfo.length; i++) { 791 sLogger.log(Level.FINEST," ** NAME: \t"+ notifInfo[i].getName()); 792 sLogger.log(Level.FINEST," DESCR: \t"+ notifInfo[i].getDescription()); 793 } 794 } else 795 sLogger.log(Level.FINEST," ** No notifications **"); 796 } 797 798 private static boolean _alreadyCalled = false; 799 815 private void registerConfigMBeans() { 816 if(!_alreadyCalled) registerConfigMBeansSynchro(); 818 } 819 private synchronized void registerConfigMBeansSynchro() { 820 821 828 829 if(_alreadyCalled) 830 return; 831 832 833 try { 834 MBeanRegistry mr = MBeanRegistryFactory.getAdminMBeanRegistry(); 835 mr.instantiateAndRegisterAllConfigMBeans( 836 adminContext.getAdminConfigContext(), 837 ApplicationServer.getServerContext().getDefaultDomainName()); 838 } catch (Throwable t) { 839 sLogger.log(Level.FINE, "Error in registering configMBeans", t); 840 } 841 _alreadyCalled = true; 842 } 843 } 844 | Popular Tags |