private PersisterMBean findPersister() throws MBeanException, InstanceNotFoundException { Logger logger = getLogger(); ModelMBeanInfo info = getModelMBeanInfo(); if (info == null) { // Not yet initialized if (logger.isEnabledFor(Logger.TRACE)) logger.trace("Can't find persister, ModelMBeanInfo is null"); return null; } Descriptor mbeanDescriptor = info.getMBeanDescriptor(); if (mbeanDescriptor == null) { // This is normally should not happen if ModelMBeanInfoSupport is used if (logger.isEnabledFor(Logger.TRACE)) logger.trace("Can't find persister, MBean descriptor is null"); return null; } String location = (String) mbeanDescriptor.getFieldValue("persistLocation"); String name = (String) mbeanDescriptor.getFieldValue("persistName"); String mbeanName = (String) mbeanDescriptor.getFieldValue("name"); if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("Persistence fields: location=" + location + ", name=" + name); if (mbeanName == null && name == null) { if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("Persistence is not supported by this ModelMBean"); return null; } // Try to see if this mbean should delegate to another mbean if (name != null) { try { ObjectName objectName = new ObjectName(name.trim()); // OK, a valid object name MBeanServer server = getMBeanServer(); if (server == null) throw new MBeanException( new IllegalStateException( LocalizedStrings.MX4JModelMBean_MX4JMODELMBEAN_IS_NOT_REGISTERED .toLocalizedString())); if (server.isRegistered(objectName) && server.isInstanceOf(objectName, PersisterMBean.class.getName())) { // OK, the given mbean is registered with this mbean server PersisterMBean persister = new MBeanPersister(server, objectName); if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("Persistence is delegated to this MBean: " + objectName); return persister; } else { throw new InstanceNotFoundException(objectName.toString()); } } catch (MalformedObjectNameException ignored) { // It does not delegates to another mbean, use default if (logger.isEnabledFor(Logger.TRACE)) logger.trace("Persistence is not delegated to another MBean"); } // Default is serialization to file FilePersister persister = new FilePersister(location, name); if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("Persistence is realized through file system in " + persister.getFileName()); return persister; } else { // Only location given, use MBean name FilePersister persister = new FilePersister(location, mbeanName); if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("Persistence is realized through file system in " + persister.getFileName()); return persister; } }
private Logger findLogger(Descriptor descriptor) { Logger logger = getLogger(); if (descriptor == null) { if (logger.isEnabledFor(Logger.TRACE)) logger.trace("Can't find MBean logger, descriptor is null"); return null; } String log = (String) descriptor.getFieldValue("log"); String location = (String) descriptor.getFieldValue("logFile"); if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("Log fields: log=" + log + ", file=" + location); if (log == null || !Boolean.valueOf(log).booleanValue()) { if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("Logging is not supported by this ModelMBean"); return null; } // Logger is supported, where log to ? if (location == null) { // As an extension, see if the field logMBean has been defined location = (String) descriptor.getFieldValue("logMBean"); if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("Log fields: mbean=" + location); if (location == null) { if (logger.isEnabledFor(Logger.TRACE)) logger.trace("Logging is not supported by this ModelMBean"); return null; } // It seems that the user wants to delegate a registered mbean to log try { ObjectName objectName = new ObjectName(location); MBeanServer server = getMBeanServer(); if (server == null) throw new MBeanException( new IllegalStateException( LocalizedStrings.MX4JModelMBean_MX4JMODELMBEAN_IS_NOT_REGISTERED .toLocalizedString())); if (server.isRegistered(objectName)) { MBeanLogger l = new MBeanLogger(server, objectName); if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("ModelMBean log supported by delegating to this MBean: " + objectName); return l; } return null; } catch (MalformedObjectNameException x) { // Ah, was not a correct object name if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("Specified logMBean field does not contain a valid ObjectName: " + location); return null; } catch (MBeanException x) { if (logger.isEnabledFor(Logger.DEBUG)) logger.debug( "logMBean field does not specify an MBean that supports logging delegation", x); return null; } } else { // User decided to log to a file if (logger.isEnabledFor(Logger.DEBUG)) logger.debug("ModelMBean log supported on file system"); return new FileLogger(location); } }