|
|
|
@ -16,6 +16,7 @@ |
|
|
|
|
|
|
|
|
|
|
|
package org.springframework.jmx.export; |
|
|
|
package org.springframework.jmx.export; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.lang.reflect.Field; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.Arrays; |
|
|
|
import java.util.Arrays; |
|
|
|
import java.util.Collection; |
|
|
|
import java.util.Collection; |
|
|
|
@ -23,6 +24,7 @@ import java.util.Collections; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.List; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.Map; |
|
|
|
|
|
|
|
import java.util.stream.Stream; |
|
|
|
|
|
|
|
|
|
|
|
import javax.management.Attribute; |
|
|
|
import javax.management.Attribute; |
|
|
|
import javax.management.InstanceNotFoundException; |
|
|
|
import javax.management.InstanceNotFoundException; |
|
|
|
@ -55,14 +57,16 @@ import org.springframework.jmx.export.assembler.SimpleReflectiveMBeanInfoAssembl |
|
|
|
import org.springframework.jmx.export.naming.SelfNaming; |
|
|
|
import org.springframework.jmx.export.naming.SelfNaming; |
|
|
|
import org.springframework.jmx.support.ObjectNameManager; |
|
|
|
import org.springframework.jmx.support.ObjectNameManager; |
|
|
|
import org.springframework.jmx.support.RegistrationPolicy; |
|
|
|
import org.springframework.jmx.support.RegistrationPolicy; |
|
|
|
|
|
|
|
import org.springframework.util.ReflectionUtils; |
|
|
|
|
|
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat; |
|
|
|
import static org.assertj.core.api.Assertions.assertThat; |
|
|
|
import static org.assertj.core.api.Assertions.assertThatExceptionOfType; |
|
|
|
import static org.assertj.core.api.Assertions.assertThatExceptionOfType; |
|
|
|
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; |
|
|
|
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; |
|
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThatNoException; |
|
|
|
import static org.assertj.core.api.Assertions.assertThatRuntimeException; |
|
|
|
import static org.assertj.core.api.Assertions.assertThatRuntimeException; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Integration tests for the {@link MBeanExporter} class. |
|
|
|
* Integration tests for {@link MBeanExporter}. |
|
|
|
* |
|
|
|
* |
|
|
|
* @author Rob Harrop |
|
|
|
* @author Rob Harrop |
|
|
|
* @author Juergen Hoeller |
|
|
|
* @author Juergen Hoeller |
|
|
|
@ -76,9 +80,11 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
|
|
|
|
|
|
|
|
private static final String OBJECT_NAME = "spring:test=jmxMBeanAdaptor"; |
|
|
|
private static final String OBJECT_NAME = "spring:test=jmxMBeanAdaptor"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testRegisterNullNotificationListenerType() throws Exception { |
|
|
|
void registerNullNotificationListenerType() throws Exception { |
|
|
|
Map<String, NotificationListener> listeners = new HashMap<>(); |
|
|
|
Map<String, NotificationListener> listeners = new HashMap<>(); |
|
|
|
// put null in as a value...
|
|
|
|
// put null in as a value...
|
|
|
|
listeners.put("*", null); |
|
|
|
listeners.put("*", null); |
|
|
|
@ -89,14 +95,12 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testRegisterNotificationListenerForNonExistentMBean() throws Exception { |
|
|
|
void registerNotificationListenerForNonExistentMBean() throws Exception { |
|
|
|
Map<String, NotificationListener> listeners = new HashMap<>(); |
|
|
|
|
|
|
|
NotificationListener dummyListener = (notification, handback) -> { |
|
|
|
NotificationListener dummyListener = (notification, handback) -> { |
|
|
|
throw new UnsupportedOperationException(); |
|
|
|
throw new UnsupportedOperationException(); |
|
|
|
}; |
|
|
|
}; |
|
|
|
// the MBean with the supplied object name does not exist...
|
|
|
|
// the MBean with the supplied object name does not exist...
|
|
|
|
listeners.put("spring:type=Test", dummyListener); |
|
|
|
Map<String, NotificationListener> listeners = Map.of("spring:type=Test", dummyListener); |
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setBeans(getBeanMap()); |
|
|
|
exporter.setBeans(getBeanMap()); |
|
|
|
exporter.setServer(server); |
|
|
|
exporter.setServer(server); |
|
|
|
exporter.setNotificationListenerMappings(listeners); |
|
|
|
exporter.setNotificationListenerMappings(listeners); |
|
|
|
@ -107,8 +111,7 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testWithSuppliedMBeanServer() throws Exception { |
|
|
|
void withSuppliedMBeanServer() throws Exception { |
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setBeans(getBeanMap()); |
|
|
|
exporter.setBeans(getBeanMap()); |
|
|
|
exporter.setServer(server); |
|
|
|
exporter.setServer(server); |
|
|
|
try { |
|
|
|
try { |
|
|
|
@ -122,13 +125,11 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testUserCreatedMBeanRegWithDynamicMBean() throws Exception { |
|
|
|
void userCreatedMBeanRegWithDynamicMBean() throws Exception { |
|
|
|
Map<String, Object> map = new HashMap<>(); |
|
|
|
Map<String, Object> map = Map.of("spring:name=dynBean", new TestDynamicMBean()); |
|
|
|
map.put("spring:name=dynBean", new TestDynamicMBean()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
InvokeDetectAssembler asm = new InvokeDetectAssembler(); |
|
|
|
InvokeDetectAssembler asm = new InvokeDetectAssembler(); |
|
|
|
|
|
|
|
|
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setServer(server); |
|
|
|
exporter.setServer(server); |
|
|
|
exporter.setBeans(map); |
|
|
|
exporter.setBeans(map); |
|
|
|
exporter.setAssembler(asm); |
|
|
|
exporter.setAssembler(asm); |
|
|
|
@ -145,7 +146,7 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testAutodetectMBeans() throws Exception { |
|
|
|
void autodetectMBeans() throws Exception { |
|
|
|
try (ConfigurableApplicationContext ctx = load("autodetectMBeans.xml")) { |
|
|
|
try (ConfigurableApplicationContext ctx = load("autodetectMBeans.xml")) { |
|
|
|
ctx.getBean("exporter"); |
|
|
|
ctx.getBean("exporter"); |
|
|
|
MBeanServer server = ctx.getBean("server", MBeanServer.class); |
|
|
|
MBeanServer server = ctx.getBean("server", MBeanServer.class); |
|
|
|
@ -159,7 +160,7 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testAutodetectWithExclude() throws Exception { |
|
|
|
void autodetectWithExclude() throws Exception { |
|
|
|
try (ConfigurableApplicationContext ctx = load("autodetectMBeans.xml")) { |
|
|
|
try (ConfigurableApplicationContext ctx = load("autodetectMBeans.xml")) { |
|
|
|
ctx.getBean("exporter"); |
|
|
|
ctx.getBean("exporter"); |
|
|
|
MBeanServer server = ctx.getBean("server", MBeanServer.class); |
|
|
|
MBeanServer server = ctx.getBean("server", MBeanServer.class); |
|
|
|
@ -172,7 +173,7 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testAutodetectLazyMBeans() throws Exception { |
|
|
|
void autodetectLazyMBeans() throws Exception { |
|
|
|
try (ConfigurableApplicationContext ctx = load("autodetectLazyMBeans.xml")) { |
|
|
|
try (ConfigurableApplicationContext ctx = load("autodetectLazyMBeans.xml")) { |
|
|
|
ctx.getBean("exporter"); |
|
|
|
ctx.getBean("exporter"); |
|
|
|
MBeanServer server = ctx.getBean("server", MBeanServer.class); |
|
|
|
MBeanServer server = ctx.getBean("server", MBeanServer.class); |
|
|
|
@ -190,18 +191,17 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testAutodetectNoMBeans() throws Exception { |
|
|
|
void autodetectNoMBeans() throws Exception { |
|
|
|
try (ConfigurableApplicationContext ctx = load("autodetectNoMBeans.xml")) { |
|
|
|
try (ConfigurableApplicationContext ctx = load("autodetectNoMBeans.xml")) { |
|
|
|
ctx.getBean("exporter"); |
|
|
|
ctx.getBean("exporter"); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testWithMBeanExporterListeners() throws Exception { |
|
|
|
void withMBeanExporterListeners() throws Exception { |
|
|
|
MockMBeanExporterListener listener1 = new MockMBeanExporterListener(); |
|
|
|
MockMBeanExporterListener listener1 = new MockMBeanExporterListener(); |
|
|
|
MockMBeanExporterListener listener2 = new MockMBeanExporterListener(); |
|
|
|
MockMBeanExporterListener listener2 = new MockMBeanExporterListener(); |
|
|
|
|
|
|
|
|
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setBeans(getBeanMap()); |
|
|
|
exporter.setBeans(getBeanMap()); |
|
|
|
exporter.setServer(server); |
|
|
|
exporter.setServer(server); |
|
|
|
exporter.setListeners(listener1, listener2); |
|
|
|
exporter.setListeners(listener1, listener2); |
|
|
|
@ -213,7 +213,7 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testExportJdkProxy() throws Exception { |
|
|
|
void exportJdkProxy() throws Exception { |
|
|
|
JmxTestBean bean = new JmxTestBean(); |
|
|
|
JmxTestBean bean = new JmxTestBean(); |
|
|
|
bean.setName("Rob Harrop"); |
|
|
|
bean.setName("Rob Harrop"); |
|
|
|
|
|
|
|
|
|
|
|
@ -225,10 +225,8 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
IJmxTestBean proxy = (IJmxTestBean) factory.getProxy(); |
|
|
|
IJmxTestBean proxy = (IJmxTestBean) factory.getProxy(); |
|
|
|
String name = "bean:mmm=whatever"; |
|
|
|
String name = "bean:mmm=whatever"; |
|
|
|
|
|
|
|
|
|
|
|
Map<String, Object> beans = new HashMap<>(); |
|
|
|
Map<String, Object> beans = Map.of(name, proxy); |
|
|
|
beans.put(name, proxy); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setServer(server); |
|
|
|
exporter.setServer(server); |
|
|
|
exporter.setBeans(beans); |
|
|
|
exporter.setBeans(beans); |
|
|
|
exporter.registerBeans(); |
|
|
|
exporter.registerBeans(); |
|
|
|
@ -239,15 +237,13 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testSelfNaming() throws Exception { |
|
|
|
void selfNaming() throws Exception { |
|
|
|
ObjectName objectName = ObjectNameManager.getInstance(OBJECT_NAME); |
|
|
|
ObjectName objectName = ObjectNameManager.getInstance(OBJECT_NAME); |
|
|
|
SelfNamingTestBean testBean = new SelfNamingTestBean(); |
|
|
|
SelfNamingTestBean testBean = new SelfNamingTestBean(); |
|
|
|
testBean.setObjectName(objectName); |
|
|
|
testBean.setObjectName(objectName); |
|
|
|
|
|
|
|
|
|
|
|
Map<String, Object> beans = new HashMap<>(); |
|
|
|
Map<String, Object> beans = Map.of("foo", testBean); |
|
|
|
beans.put("foo", testBean); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setServer(server); |
|
|
|
exporter.setServer(server); |
|
|
|
exporter.setBeans(beans); |
|
|
|
exporter.setBeans(beans); |
|
|
|
|
|
|
|
|
|
|
|
@ -258,7 +254,7 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testRegisterIgnoreExisting() throws Exception { |
|
|
|
void registerIgnoreExisting() throws Exception { |
|
|
|
ObjectName objectName = ObjectNameManager.getInstance(OBJECT_NAME); |
|
|
|
ObjectName objectName = ObjectNameManager.getInstance(OBJECT_NAME); |
|
|
|
|
|
|
|
|
|
|
|
Person preRegistered = new Person(); |
|
|
|
Person preRegistered = new Person(); |
|
|
|
@ -271,11 +267,11 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
|
|
|
|
|
|
|
|
String objectName2 = "spring:test=equalBean"; |
|
|
|
String objectName2 = "spring:test=equalBean"; |
|
|
|
|
|
|
|
|
|
|
|
Map<String, Object> beans = new HashMap<>(); |
|
|
|
Map<String, Object> beans = Map.of( |
|
|
|
beans.put(objectName.toString(), springRegistered); |
|
|
|
objectName.toString(), springRegistered, |
|
|
|
beans.put(objectName2, springRegistered); |
|
|
|
objectName2, springRegistered |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setServer(server); |
|
|
|
exporter.setServer(server); |
|
|
|
exporter.setBeans(beans); |
|
|
|
exporter.setBeans(beans); |
|
|
|
exporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING); |
|
|
|
exporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING); |
|
|
|
@ -292,7 +288,7 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testRegisterReplaceExisting() throws Exception { |
|
|
|
void registerReplaceExisting() throws Exception { |
|
|
|
ObjectName objectName = ObjectNameManager.getInstance(OBJECT_NAME); |
|
|
|
ObjectName objectName = ObjectNameManager.getInstance(OBJECT_NAME); |
|
|
|
|
|
|
|
|
|
|
|
Person preRegistered = new Person(); |
|
|
|
Person preRegistered = new Person(); |
|
|
|
@ -303,10 +299,8 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
Person springRegistered = new Person(); |
|
|
|
Person springRegistered = new Person(); |
|
|
|
springRegistered.setName("Sally Greenwood"); |
|
|
|
springRegistered.setName("Sally Greenwood"); |
|
|
|
|
|
|
|
|
|
|
|
Map<String, Object> beans = new HashMap<>(); |
|
|
|
Map<String, Object> beans = Map.of(objectName.toString(), springRegistered); |
|
|
|
beans.put(objectName.toString(), springRegistered); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setServer(server); |
|
|
|
exporter.setServer(server); |
|
|
|
exporter.setBeans(beans); |
|
|
|
exporter.setBeans(beans); |
|
|
|
exporter.setRegistrationPolicy(RegistrationPolicy.REPLACE_EXISTING); |
|
|
|
exporter.setRegistrationPolicy(RegistrationPolicy.REPLACE_EXISTING); |
|
|
|
@ -321,7 +315,7 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testWithExposeClassLoader() throws Exception { |
|
|
|
void withExposeClassLoader() throws Exception { |
|
|
|
String name = "Rob Harrop"; |
|
|
|
String name = "Rob Harrop"; |
|
|
|
String otherName = "Juergen Hoeller"; |
|
|
|
String otherName = "Juergen Hoeller"; |
|
|
|
|
|
|
|
|
|
|
|
@ -329,10 +323,8 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
bean.setName(name); |
|
|
|
bean.setName(name); |
|
|
|
ObjectName objectName = ObjectNameManager.getInstance("spring:type=Test"); |
|
|
|
ObjectName objectName = ObjectNameManager.getInstance("spring:type=Test"); |
|
|
|
|
|
|
|
|
|
|
|
Map<String, Object> beans = new HashMap<>(); |
|
|
|
Map<String, Object> beans = Map.of(objectName.toString(), bean); |
|
|
|
beans.put(objectName.toString(), bean); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setBeans(beans); |
|
|
|
exporter.setBeans(beans); |
|
|
|
exporter.setExposeManagedResourceClassLoader(true); |
|
|
|
exporter.setExposeManagedResourceClassLoader(true); |
|
|
|
@ -351,34 +343,30 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testBonaFideMBeanIsNotExportedWhenAutodetectIsTotallyTurnedOff() { |
|
|
|
void bonaFideMBeanIsNotExportedWhenAutodetectIsTotallyTurnedOff() { |
|
|
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(Person.class); |
|
|
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(Person.class); |
|
|
|
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); |
|
|
|
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); |
|
|
|
factory.registerBeanDefinition("^&_invalidObjectName_(*", builder.getBeanDefinition()); |
|
|
|
factory.registerBeanDefinition("^&_invalidObjectName_(*", builder.getBeanDefinition()); |
|
|
|
String exportedBeanName = "export.me.please"; |
|
|
|
String exportedBeanName = "export.me.please"; |
|
|
|
factory.registerSingleton(exportedBeanName, new TestBean()); |
|
|
|
factory.registerSingleton(exportedBeanName, new TestBean()); |
|
|
|
|
|
|
|
|
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
Map<String, Object> beansToExport = Map.of(OBJECT_NAME, exportedBeanName); |
|
|
|
Map<String, Object> beansToExport = new HashMap<>(); |
|
|
|
|
|
|
|
beansToExport.put(OBJECT_NAME, exportedBeanName); |
|
|
|
|
|
|
|
exporter.setBeans(beansToExport); |
|
|
|
exporter.setBeans(beansToExport); |
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
exporter.setAutodetectMode(MBeanExporter.AUTODETECT_NONE); |
|
|
|
exporter.setAutodetectMode(MBeanExporter.AUTODETECT_NONE); |
|
|
|
// MBean has a bad ObjectName, so if said MBean is autodetected, an exception will be thrown...
|
|
|
|
// MBean has a bad ObjectName, so if said MBean is autodetected, an exception will be thrown...
|
|
|
|
start(exporter); |
|
|
|
start(exporter); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testOnlyBonaFideMBeanIsExportedWhenAutodetectIsMBeanOnly() throws Exception { |
|
|
|
void onlyBonaFideMBeanIsExportedWhenAutodetectIsMBeanOnly() throws Exception { |
|
|
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(Person.class); |
|
|
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(Person.class); |
|
|
|
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); |
|
|
|
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); |
|
|
|
factory.registerBeanDefinition(OBJECT_NAME, builder.getBeanDefinition()); |
|
|
|
factory.registerBeanDefinition(OBJECT_NAME, builder.getBeanDefinition()); |
|
|
|
String exportedBeanName = "spring:type=TestBean"; |
|
|
|
String exportedBeanName = "spring:type=TestBean"; |
|
|
|
factory.registerSingleton(exportedBeanName, new TestBean()); |
|
|
|
factory.registerSingleton(exportedBeanName, new TestBean()); |
|
|
|
|
|
|
|
|
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setAssembler(new NamedBeanAutodetectCapableMBeanInfoAssemblerStub(exportedBeanName)); |
|
|
|
exporter.setAssembler(new NamedBeanAutodetectCapableMBeanInfoAssemblerStub(exportedBeanName)); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
@ -392,7 +380,7 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testBonaFideMBeanAndRegularBeanExporterWithAutodetectAll() throws Exception { |
|
|
|
void bonaFideMBeanAndRegularBeanExporterWithAutodetectAll() throws Exception { |
|
|
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(Person.class); |
|
|
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(Person.class); |
|
|
|
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); |
|
|
|
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); |
|
|
|
factory.registerBeanDefinition(OBJECT_NAME, builder.getBeanDefinition()); |
|
|
|
factory.registerBeanDefinition(OBJECT_NAME, builder.getBeanDefinition()); |
|
|
|
@ -401,7 +389,6 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
String notToBeExportedBeanName = "spring:type=NotToBeExported"; |
|
|
|
String notToBeExportedBeanName = "spring:type=NotToBeExported"; |
|
|
|
factory.registerSingleton(notToBeExportedBeanName, new TestBean()); |
|
|
|
factory.registerSingleton(notToBeExportedBeanName, new TestBean()); |
|
|
|
|
|
|
|
|
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setAssembler(new NamedBeanAutodetectCapableMBeanInfoAssemblerStub(exportedBeanName)); |
|
|
|
exporter.setAssembler(new NamedBeanAutodetectCapableMBeanInfoAssemblerStub(exportedBeanName)); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
@ -416,14 +403,13 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testBonaFideMBeanIsNotExportedWithAutodetectAssembler() throws Exception { |
|
|
|
void bonaFideMBeanIsNotExportedWithAutodetectAssembler() throws Exception { |
|
|
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(Person.class); |
|
|
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(Person.class); |
|
|
|
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); |
|
|
|
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); |
|
|
|
factory.registerBeanDefinition(OBJECT_NAME, builder.getBeanDefinition()); |
|
|
|
factory.registerBeanDefinition(OBJECT_NAME, builder.getBeanDefinition()); |
|
|
|
String exportedBeanName = "spring:type=TestBean"; |
|
|
|
String exportedBeanName = "spring:type=TestBean"; |
|
|
|
factory.registerSingleton(exportedBeanName, new TestBean()); |
|
|
|
factory.registerSingleton(exportedBeanName, new TestBean()); |
|
|
|
|
|
|
|
|
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setAssembler(new NamedBeanAutodetectCapableMBeanInfoAssemblerStub(exportedBeanName)); |
|
|
|
exporter.setAssembler(new NamedBeanAutodetectCapableMBeanInfoAssemblerStub(exportedBeanName)); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
@ -439,15 +425,13 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
* Want to ensure that said MBean is not exported twice. |
|
|
|
* Want to ensure that said MBean is not exported twice. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testBonaFideMBeanExplicitlyExportedAndAutodetectionIsOn() throws Exception { |
|
|
|
void bonaFideMBeanExplicitlyExportedAndAutodetectionIsOn() throws Exception { |
|
|
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(Person.class); |
|
|
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(Person.class); |
|
|
|
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); |
|
|
|
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); |
|
|
|
factory.registerBeanDefinition(OBJECT_NAME, builder.getBeanDefinition()); |
|
|
|
factory.registerBeanDefinition(OBJECT_NAME, builder.getBeanDefinition()); |
|
|
|
|
|
|
|
|
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setServer(getServer()); |
|
|
|
Map<String, Object> beansToExport = new HashMap<>(); |
|
|
|
Map<String, Object> beansToExport = Map.of(OBJECT_NAME, OBJECT_NAME); |
|
|
|
beansToExport.put(OBJECT_NAME, OBJECT_NAME); |
|
|
|
|
|
|
|
exporter.setBeans(beansToExport); |
|
|
|
exporter.setBeans(beansToExport); |
|
|
|
exporter.setAssembler(new NamedBeanAutodetectCapableMBeanInfoAssemblerStub(OBJECT_NAME)); |
|
|
|
exporter.setAssembler(new NamedBeanAutodetectCapableMBeanInfoAssemblerStub(OBJECT_NAME)); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
@ -458,61 +442,104 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testSetAutodetectModeToOutOfRangeNegativeValue() { |
|
|
|
void setAutodetectModeToOutOfRangeNegativeValue() { |
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
assertThatIllegalArgumentException() |
|
|
|
assertThatIllegalArgumentException().isThrownBy(() -> |
|
|
|
.isThrownBy(() -> exporter.setAutodetectMode(-1)) |
|
|
|
exporter.setAutodetectMode(-1)); |
|
|
|
.withMessage("Only values of autodetect constants allowed"); |
|
|
|
|
|
|
|
assertThat(exporter.getAutodetectMode()).isNull(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testSetAutodetectModeToOutOfRangePositiveValue() { |
|
|
|
void setAutodetectModeToOutOfRangePositiveValue() { |
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
assertThatIllegalArgumentException() |
|
|
|
assertThatIllegalArgumentException().isThrownBy(() -> |
|
|
|
.isThrownBy(() -> exporter.setAutodetectMode(5)) |
|
|
|
exporter.setAutodetectMode(5)); |
|
|
|
.withMessage("Only values of autodetect constants allowed"); |
|
|
|
|
|
|
|
assertThat(exporter.getAutodetectMode()).isNull(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* This test effectively verifies that the internal 'constants' map is properly |
|
|
|
|
|
|
|
* configured for all autodetect constants defined in {@link MBeanExporter}. |
|
|
|
|
|
|
|
*/ |
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testSetAutodetectModeNameToAnEmptyString() { |
|
|
|
void setAutodetectModeToAllSupportedValues() { |
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
streamConstants(MBeanExporter.class) |
|
|
|
assertThatIllegalArgumentException().isThrownBy(() -> |
|
|
|
.map(MBeanExporterTests::getFieldValue) |
|
|
|
exporter.setAutodetectModeName("")); |
|
|
|
.forEach(mode -> assertThatNoException().isThrownBy(() -> exporter.setAutodetectMode(mode))); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testSetAutodetectModeNameToAWhitespacedString() { |
|
|
|
void setAutodetectModeToSupportedValue() { |
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
exporter.setAutodetectMode(MBeanExporter.AUTODETECT_ASSEMBLER); |
|
|
|
assertThatIllegalArgumentException().isThrownBy(() -> |
|
|
|
assertThat(exporter.getAutodetectMode()).isEqualTo(MBeanExporter.AUTODETECT_ASSEMBLER); |
|
|
|
exporter.setAutodetectModeName(" \t")); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testSetAutodetectModeNameToARubbishValue() { |
|
|
|
void setAutodetectModeNameToNull() { |
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
assertThatIllegalArgumentException() |
|
|
|
assertThatIllegalArgumentException().isThrownBy(() -> |
|
|
|
.isThrownBy(() -> exporter.setAutodetectModeName(null)) |
|
|
|
exporter.setAutodetectModeName("That Hansel is... *sssooo* hot right now!")); |
|
|
|
.withMessage("'constantName' must not be null or blank"); |
|
|
|
|
|
|
|
assertThat(exporter.getAutodetectMode()).isNull(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testNotRunningInBeanFactoryAndPassedBeanNameToExport() throws Exception { |
|
|
|
void setAutodetectModeNameToAnEmptyString() { |
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
assertThatIllegalArgumentException() |
|
|
|
Map<String, Object> beans = new HashMap<>(); |
|
|
|
.isThrownBy(() -> exporter.setAutodetectModeName("")) |
|
|
|
beans.put(OBJECT_NAME, "beanName"); |
|
|
|
.withMessage("'constantName' must not be null or blank"); |
|
|
|
|
|
|
|
assertThat(exporter.getAutodetectMode()).isNull(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void setAutodetectModeNameToWhitespace() { |
|
|
|
|
|
|
|
assertThatIllegalArgumentException() |
|
|
|
|
|
|
|
.isThrownBy(() -> exporter.setAutodetectModeName(" \t")) |
|
|
|
|
|
|
|
.withMessage("'constantName' must not be null or blank"); |
|
|
|
|
|
|
|
assertThat(exporter.getAutodetectMode()).isNull(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void setAutodetectModeNameToBogusValue() { |
|
|
|
|
|
|
|
assertThatIllegalArgumentException() |
|
|
|
|
|
|
|
.isThrownBy(() -> exporter.setAutodetectModeName("Bogus")) |
|
|
|
|
|
|
|
.withMessage("Only autodetect constants allowed"); |
|
|
|
|
|
|
|
assertThat(exporter.getAutodetectMode()).isNull(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* This test effectively verifies that the internal 'constants' map is properly |
|
|
|
|
|
|
|
* configured for all autodetect constants defined in {@link MBeanExporter}. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void setAutodetectModeNameToAllSupportedValues() { |
|
|
|
|
|
|
|
streamConstants(MBeanExporter.class) |
|
|
|
|
|
|
|
.map(Field::getName) |
|
|
|
|
|
|
|
.forEach(name -> assertThatNoException().isThrownBy(() -> exporter.setAutodetectModeName(name))); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void setAutodetectModeNameToSupportedValue() { |
|
|
|
|
|
|
|
exporter.setAutodetectModeName("AUTODETECT_ASSEMBLER"); |
|
|
|
|
|
|
|
assertThat(exporter.getAutodetectMode()).isEqualTo(MBeanExporter.AUTODETECT_ASSEMBLER); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void notRunningInBeanFactoryAndPassedBeanNameToExport() throws Exception { |
|
|
|
|
|
|
|
Map<String, Object> beans = Map.of(OBJECT_NAME, "beanName"); |
|
|
|
exporter.setBeans(beans); |
|
|
|
exporter.setBeans(beans); |
|
|
|
assertThatExceptionOfType(MBeanExportException.class).isThrownBy(() -> |
|
|
|
assertThatExceptionOfType(MBeanExportException.class) |
|
|
|
start(exporter)); |
|
|
|
.isThrownBy(() -> start(exporter)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testNotRunningInBeanFactoryAndAutodetectionIsOn() throws Exception { |
|
|
|
void notRunningInBeanFactoryAndAutodetectionIsOn() throws Exception { |
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setAutodetectMode(MBeanExporter.AUTODETECT_ALL); |
|
|
|
exporter.setAutodetectMode(MBeanExporter.AUTODETECT_ALL); |
|
|
|
assertThatExceptionOfType(MBeanExportException.class).isThrownBy(() -> |
|
|
|
assertThatExceptionOfType(MBeanExportException.class) |
|
|
|
start(exporter)); |
|
|
|
.isThrownBy(() -> start(exporter)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test // SPR-2158
|
|
|
|
@Test // SPR-2158
|
|
|
|
void testMBeanIsNotUnregisteredSpuriouslyIfSomeExternalProcessHasUnregisteredMBean() throws Exception { |
|
|
|
void mbeanIsNotUnregisteredSpuriouslyIfSomeExternalProcessHasUnregisteredMBean() throws Exception { |
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setBeans(getBeanMap()); |
|
|
|
exporter.setBeans(getBeanMap()); |
|
|
|
exporter.setServer(this.server); |
|
|
|
exporter.setServer(this.server); |
|
|
|
MockMBeanExporterListener listener = new MockMBeanExporterListener(); |
|
|
|
MockMBeanExporterListener listener = new MockMBeanExporterListener(); |
|
|
|
@ -523,12 +550,13 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
|
|
|
|
|
|
|
|
this.server.unregisterMBean(new ObjectName(OBJECT_NAME)); |
|
|
|
this.server.unregisterMBean(new ObjectName(OBJECT_NAME)); |
|
|
|
exporter.destroy(); |
|
|
|
exporter.destroy(); |
|
|
|
assertThat(listener.getUnregistered()).as("Listener should not have been invoked (MBean previously unregistered by external agent)") |
|
|
|
assertThat(listener.getUnregistered()) |
|
|
|
|
|
|
|
.as("Listener should not have been invoked (MBean previously unregistered by external agent)") |
|
|
|
.isEmpty(); |
|
|
|
.isEmpty(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test // SPR-3302
|
|
|
|
@Test // SPR-3302
|
|
|
|
void testBeanNameCanBeUsedInNotificationListenersMap() throws Exception { |
|
|
|
void beanNameCanBeUsedInNotificationListenersMap() throws Exception { |
|
|
|
String beanName = "charlesDexterWard"; |
|
|
|
String beanName = "charlesDexterWard"; |
|
|
|
BeanDefinitionBuilder testBean = BeanDefinitionBuilder.rootBeanDefinition(JmxTestBean.class); |
|
|
|
BeanDefinitionBuilder testBean = BeanDefinitionBuilder.rootBeanDefinition(JmxTestBean.class); |
|
|
|
|
|
|
|
|
|
|
|
@ -537,10 +565,8 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
factory.preInstantiateSingletons(); |
|
|
|
factory.preInstantiateSingletons(); |
|
|
|
Object testBeanInstance = factory.getBean(beanName); |
|
|
|
Object testBeanInstance = factory.getBean(beanName); |
|
|
|
|
|
|
|
|
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setServer(getServer()); |
|
|
|
Map<String, Object> beansToExport = new HashMap<>(); |
|
|
|
Map<String, Object> beansToExport = Map.of("test:what=ever", testBeanInstance); |
|
|
|
beansToExport.put("test:what=ever", testBeanInstance); |
|
|
|
|
|
|
|
exporter.setBeans(beansToExport); |
|
|
|
exporter.setBeans(beansToExport); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
StubNotificationListener listener = new StubNotificationListener(); |
|
|
|
StubNotificationListener listener = new StubNotificationListener(); |
|
|
|
@ -550,7 +576,7 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testWildcardCanBeUsedInNotificationListenersMap() throws Exception { |
|
|
|
void wildcardCanBeUsedInNotificationListenersMap() throws Exception { |
|
|
|
String beanName = "charlesDexterWard"; |
|
|
|
String beanName = "charlesDexterWard"; |
|
|
|
BeanDefinitionBuilder testBean = BeanDefinitionBuilder.rootBeanDefinition(JmxTestBean.class); |
|
|
|
BeanDefinitionBuilder testBean = BeanDefinitionBuilder.rootBeanDefinition(JmxTestBean.class); |
|
|
|
|
|
|
|
|
|
|
|
@ -559,10 +585,8 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
factory.preInstantiateSingletons(); |
|
|
|
factory.preInstantiateSingletons(); |
|
|
|
Object testBeanInstance = factory.getBean(beanName); |
|
|
|
Object testBeanInstance = factory.getBean(beanName); |
|
|
|
|
|
|
|
|
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setServer(getServer()); |
|
|
|
Map<String, Object> beansToExport = new HashMap<>(); |
|
|
|
Map<String, Object> beansToExport = Map.of("test:what=ever", testBeanInstance); |
|
|
|
beansToExport.put("test:what=ever", testBeanInstance); |
|
|
|
|
|
|
|
exporter.setBeans(beansToExport); |
|
|
|
exporter.setBeans(beansToExport); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
StubNotificationListener listener = new StubNotificationListener(); |
|
|
|
StubNotificationListener listener = new StubNotificationListener(); |
|
|
|
@ -572,7 +596,7 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test // SPR-3625
|
|
|
|
@Test // SPR-3625
|
|
|
|
void testMBeanIsUnregisteredForRuntimeExceptionDuringInitialization() throws Exception { |
|
|
|
void mbeanIsUnregisteredForRuntimeExceptionDuringInitialization() throws Exception { |
|
|
|
BeanDefinitionBuilder builder1 = BeanDefinitionBuilder.rootBeanDefinition(Person.class); |
|
|
|
BeanDefinitionBuilder builder1 = BeanDefinitionBuilder.rootBeanDefinition(Person.class); |
|
|
|
BeanDefinitionBuilder builder2 = BeanDefinitionBuilder |
|
|
|
BeanDefinitionBuilder builder2 = BeanDefinitionBuilder |
|
|
|
.rootBeanDefinition(RuntimeExceptionThrowingConstructorBean.class); |
|
|
|
.rootBeanDefinition(RuntimeExceptionThrowingConstructorBean.class); |
|
|
|
@ -584,16 +608,16 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
factory.registerBeanDefinition(objectName1, builder1.getBeanDefinition()); |
|
|
|
factory.registerBeanDefinition(objectName1, builder1.getBeanDefinition()); |
|
|
|
factory.registerBeanDefinition(objectName2, builder2.getBeanDefinition()); |
|
|
|
factory.registerBeanDefinition(objectName2, builder2.getBeanDefinition()); |
|
|
|
|
|
|
|
|
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setServer(getServer()); |
|
|
|
Map<String, Object> beansToExport = new HashMap<>(); |
|
|
|
Map<String, Object> beansToExport = Map.of( |
|
|
|
beansToExport.put(objectName1, objectName1); |
|
|
|
objectName1, objectName1, |
|
|
|
beansToExport.put(objectName2, objectName2); |
|
|
|
objectName2, objectName2 |
|
|
|
|
|
|
|
); |
|
|
|
exporter.setBeans(beansToExport); |
|
|
|
exporter.setBeans(beansToExport); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
|
|
|
|
|
|
|
|
assertThatRuntimeException().as("failed during creation of RuntimeExceptionThrowingConstructorBean") |
|
|
|
assertThatRuntimeException().as("failed during creation of RuntimeExceptionThrowingConstructorBean") |
|
|
|
.isThrownBy(() -> start(exporter)); |
|
|
|
.isThrownBy(() -> start(exporter)); |
|
|
|
|
|
|
|
|
|
|
|
assertIsNotRegistered("Must have unregistered all previously registered MBeans due to RuntimeException", |
|
|
|
assertIsNotRegistered("Must have unregistered all previously registered MBeans due to RuntimeException", |
|
|
|
ObjectNameManager.getInstance(objectName1)); |
|
|
|
ObjectNameManager.getInstance(objectName1)); |
|
|
|
@ -602,14 +626,13 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testIgnoreBeanName() throws MalformedObjectNameException { |
|
|
|
void ignoreBeanName() throws MalformedObjectNameException { |
|
|
|
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); |
|
|
|
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); |
|
|
|
String firstBeanName = "spring:type=TestBean"; |
|
|
|
String firstBeanName = "spring:type=TestBean"; |
|
|
|
factory.registerSingleton(firstBeanName, new TestBean("test")); |
|
|
|
factory.registerSingleton(firstBeanName, new TestBean("test")); |
|
|
|
String secondBeanName = "spring:type=TestBean2"; |
|
|
|
String secondBeanName = "spring:type=TestBean2"; |
|
|
|
factory.registerSingleton(secondBeanName, new TestBean("test2")); |
|
|
|
factory.registerSingleton(secondBeanName, new TestBean("test2")); |
|
|
|
|
|
|
|
|
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setAssembler(new NamedBeanAutodetectCapableMBeanInfoAssemblerStub(firstBeanName, secondBeanName)); |
|
|
|
exporter.setAssembler(new NamedBeanAutodetectCapableMBeanInfoAssemblerStub(firstBeanName, secondBeanName)); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
@ -624,11 +647,10 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testRegisterFactoryBean() throws MalformedObjectNameException { |
|
|
|
void registerFactoryBean() throws MalformedObjectNameException { |
|
|
|
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); |
|
|
|
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); |
|
|
|
factory.registerBeanDefinition("spring:type=FactoryBean", new RootBeanDefinition(ProperSomethingFactoryBean.class)); |
|
|
|
factory.registerBeanDefinition("spring:type=FactoryBean", new RootBeanDefinition(ProperSomethingFactoryBean.class)); |
|
|
|
|
|
|
|
|
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
exporter.setAutodetectMode(MBeanExporter.AUTODETECT_ALL); |
|
|
|
exporter.setAutodetectMode(MBeanExporter.AUTODETECT_ALL); |
|
|
|
@ -639,11 +661,10 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void testIgnoreNullObjectFromFactoryBean() throws MalformedObjectNameException { |
|
|
|
void ignoreNullObjectFromFactoryBean() throws MalformedObjectNameException { |
|
|
|
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); |
|
|
|
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); |
|
|
|
factory.registerBeanDefinition("spring:type=FactoryBean", new RootBeanDefinition(NullSomethingFactoryBean.class)); |
|
|
|
factory.registerBeanDefinition("spring:type=FactoryBean", new RootBeanDefinition(NullSomethingFactoryBean.class)); |
|
|
|
|
|
|
|
|
|
|
|
MBeanExporter exporter = new MBeanExporter(); |
|
|
|
|
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setServer(getServer()); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
exporter.setBeanFactory(factory); |
|
|
|
exporter.setAutodetectMode(MBeanExporter.AUTODETECT_ALL); |
|
|
|
exporter.setAutodetectMode(MBeanExporter.AUTODETECT_ALL); |
|
|
|
@ -658,13 +679,11 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
return new ClassPathXmlApplicationContext(context, getClass()); |
|
|
|
return new ClassPathXmlApplicationContext(context, getClass()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private Map<String, Object> getBeanMap() { |
|
|
|
private static Map<String, Object> getBeanMap() { |
|
|
|
Map<String, Object> map = new HashMap<>(); |
|
|
|
return Map.of(OBJECT_NAME, new JmxTestBean()); |
|
|
|
map.put(OBJECT_NAME, new JmxTestBean()); |
|
|
|
|
|
|
|
return map; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void assertListener(MockMBeanExporterListener listener) throws MalformedObjectNameException { |
|
|
|
private static void assertListener(MockMBeanExporterListener listener) throws MalformedObjectNameException { |
|
|
|
ObjectName desired = ObjectNameManager.getInstance(OBJECT_NAME); |
|
|
|
ObjectName desired = ObjectNameManager.getInstance(OBJECT_NAME); |
|
|
|
assertThat(listener.getRegistered()).as("Incorrect number of registrations").hasSize(1); |
|
|
|
assertThat(listener.getRegistered()).as("Incorrect number of registrations").hasSize(1); |
|
|
|
assertThat(listener.getUnregistered()).as("Incorrect number of unregistrations").hasSize(1); |
|
|
|
assertThat(listener.getUnregistered()).as("Incorrect number of unregistrations").hasSize(1); |
|
|
|
@ -684,6 +703,19 @@ public class MBeanExporterTests extends AbstractMBeanServerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static Stream<Field> streamConstants(Class<?> clazz) { |
|
|
|
|
|
|
|
return Arrays.stream(clazz.getFields()).filter(ReflectionUtils::isPublicStaticFinal); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static Integer getFieldValue(Field field) { |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
return (Integer) field.get(null); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
catch (Exception ex) { |
|
|
|
|
|
|
|
throw new RuntimeException(ex); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static class MockMBeanExporterListener implements MBeanExporterListener { |
|
|
|
private static class MockMBeanExporterListener implements MBeanExporterListener { |
|
|
|
|
|
|
|
|
|
|
|
|