|
|
|
|
@@ -19,7 +19,10 @@ package org.springframework.jmx.export.annotation;
|
|
|
|
|
import javax.management.MBeanServer;
|
|
|
|
|
import javax.management.ObjectName;
|
|
|
|
|
|
|
|
|
|
import org.junit.After;
|
|
|
|
|
import org.junit.Rule;
|
|
|
|
|
import org.junit.Test;
|
|
|
|
|
import org.junit.rules.ExpectedException;
|
|
|
|
|
|
|
|
|
|
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
|
|
|
|
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
|
|
|
|
@@ -33,6 +36,7 @@ import org.springframework.context.annotation.Scope;
|
|
|
|
|
import org.springframework.context.annotation.ScopedProxyMode;
|
|
|
|
|
import org.springframework.jmx.export.MBeanExporterTests;
|
|
|
|
|
import org.springframework.jmx.export.TestDynamicMBean;
|
|
|
|
|
import org.springframework.jmx.export.metadata.InvalidMetadataException;
|
|
|
|
|
import org.springframework.jmx.support.MBeanServerFactoryBean;
|
|
|
|
|
import org.springframework.jmx.support.ObjectNameManager;
|
|
|
|
|
import org.springframework.jmx.support.RegistrationPolicy;
|
|
|
|
|
@@ -44,109 +48,107 @@ import static org.junit.Assert.*;
|
|
|
|
|
* Tests for {@link EnableMBeanExport} and {@link MBeanExportConfiguration}.
|
|
|
|
|
*
|
|
|
|
|
* @author Phillip Webb
|
|
|
|
|
* @author Stephane Nicoll
|
|
|
|
|
* @see AnnotationLazyInitMBeanTests
|
|
|
|
|
*/
|
|
|
|
|
public class EnableMBeanExportConfigurationTests {
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testLazyNaming() throws Exception {
|
|
|
|
|
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
|
|
|
|
|
LazyNamingConfiguration.class);
|
|
|
|
|
try {
|
|
|
|
|
MBeanServer server = (MBeanServer) ctx.getBean("server");
|
|
|
|
|
ObjectName oname = ObjectNameManager.getInstance("bean:name=testBean4");
|
|
|
|
|
assertNotNull(server.getObjectInstance(oname));
|
|
|
|
|
String name = (String) server.getAttribute(oname, "Name");
|
|
|
|
|
assertEquals("Invalid name returned", "TEST", name);
|
|
|
|
|
}
|
|
|
|
|
finally {
|
|
|
|
|
ctx.close();
|
|
|
|
|
@Rule
|
|
|
|
|
public final ExpectedException thrown = ExpectedException.none();
|
|
|
|
|
|
|
|
|
|
private AnnotationConfigApplicationContext ctx;
|
|
|
|
|
|
|
|
|
|
@After
|
|
|
|
|
public void closeContext() {
|
|
|
|
|
if (this.ctx != null) {
|
|
|
|
|
this.ctx.close();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testLazyNaming() throws Exception {
|
|
|
|
|
load(LazyNamingConfiguration.class);
|
|
|
|
|
validateAnnotationTestBean();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void load(Class<?>... config) {
|
|
|
|
|
this.ctx = new AnnotationConfigApplicationContext(config);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testOnlyTargetClassIsExposed() throws Exception {
|
|
|
|
|
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
|
|
|
|
|
ProxyConfiguration.class);
|
|
|
|
|
try {
|
|
|
|
|
MBeanServer server = (MBeanServer) ctx.getBean("server");
|
|
|
|
|
ObjectName oname = ObjectNameManager.getInstance("bean:name=testBean4");
|
|
|
|
|
assertNotNull(server.getObjectInstance(oname));
|
|
|
|
|
assertEquals("TEST", server.getAttribute(oname, "Name"));
|
|
|
|
|
}
|
|
|
|
|
finally {
|
|
|
|
|
ctx.close();
|
|
|
|
|
}
|
|
|
|
|
load(ProxyConfiguration.class);
|
|
|
|
|
validateAnnotationTestBean();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testPackagePrivateExtensionCantBeExposed() {
|
|
|
|
|
this.thrown.expect(InvalidMetadataException.class);
|
|
|
|
|
this.thrown.expectMessage(PackagePrivateTestBean.class.getName());
|
|
|
|
|
this.thrown.expectMessage("must be public");
|
|
|
|
|
new AnnotationConfigApplicationContext(PackagePrivateConfiguration.class);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testPackagePrivateImplementationCantBeExposed() {
|
|
|
|
|
this.thrown.expect(InvalidMetadataException.class);
|
|
|
|
|
this.thrown.expectMessage(PackagePrivateAnnotationTestBean.class.getName());
|
|
|
|
|
this.thrown.expectMessage("must be public");
|
|
|
|
|
new AnnotationConfigApplicationContext(PackagePrivateInterfaceImplementationConfiguration.class);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testPackagePrivateClassExtensionCanBeExposed() throws Exception {
|
|
|
|
|
load(PackagePrivateExtensionConfiguration.class);
|
|
|
|
|
validateAnnotationTestBean();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testPlaceholderBased() throws Exception {
|
|
|
|
|
MockEnvironment env = new MockEnvironment();
|
|
|
|
|
env.setProperty("serverName", "server");
|
|
|
|
|
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
|
|
|
|
|
ctx.setEnvironment(env);
|
|
|
|
|
ctx.register(PlaceholderBasedConfiguration.class);
|
|
|
|
|
ctx.refresh();
|
|
|
|
|
try {
|
|
|
|
|
MBeanServer server = (MBeanServer) ctx.getBean("server");
|
|
|
|
|
ObjectName oname = ObjectNameManager.getInstance("bean:name=testBean4");
|
|
|
|
|
assertNotNull(server.getObjectInstance(oname));
|
|
|
|
|
String name = (String) server.getAttribute(oname, "Name");
|
|
|
|
|
assertEquals("Invalid name returned", "TEST", name);
|
|
|
|
|
}
|
|
|
|
|
finally {
|
|
|
|
|
ctx.close();
|
|
|
|
|
}
|
|
|
|
|
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
|
|
|
|
|
context.setEnvironment(env);
|
|
|
|
|
context.register(PlaceholderBasedConfiguration.class);
|
|
|
|
|
context.refresh();
|
|
|
|
|
this.ctx = context;
|
|
|
|
|
validateAnnotationTestBean();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testLazyAssembling() throws Exception {
|
|
|
|
|
System.setProperty("domain", "bean");
|
|
|
|
|
AnnotationConfigApplicationContext ctx =
|
|
|
|
|
new AnnotationConfigApplicationContext(LazyAssemblingConfiguration.class);
|
|
|
|
|
load(LazyAssemblingConfiguration.class);
|
|
|
|
|
try {
|
|
|
|
|
MBeanServer server = (MBeanServer) ctx.getBean("server");
|
|
|
|
|
MBeanServer server = (MBeanServer) this.ctx.getBean("server");
|
|
|
|
|
|
|
|
|
|
ObjectName oname = ObjectNameManager.getInstance("bean:name=testBean4");
|
|
|
|
|
assertNotNull(server.getObjectInstance(oname));
|
|
|
|
|
String name = (String) server.getAttribute(oname, "Name");
|
|
|
|
|
assertEquals("Invalid name returned", "TEST", name);
|
|
|
|
|
|
|
|
|
|
oname = ObjectNameManager.getInstance("bean:name=testBean5");
|
|
|
|
|
assertNotNull(server.getObjectInstance(oname));
|
|
|
|
|
name = (String) server.getAttribute(oname, "Name");
|
|
|
|
|
assertEquals("Invalid name returned", "FACTORY", name);
|
|
|
|
|
|
|
|
|
|
oname = ObjectNameManager.getInstance("spring:mbean=true");
|
|
|
|
|
assertNotNull(server.getObjectInstance(oname));
|
|
|
|
|
name = (String) server.getAttribute(oname, "Name");
|
|
|
|
|
assertEquals("Invalid name returned", "Rob Harrop", name);
|
|
|
|
|
|
|
|
|
|
oname = ObjectNameManager.getInstance("spring:mbean=another");
|
|
|
|
|
assertNotNull(server.getObjectInstance(oname));
|
|
|
|
|
name = (String) server.getAttribute(oname, "Name");
|
|
|
|
|
assertEquals("Invalid name returned", "Juergen Hoeller", name);
|
|
|
|
|
validateMBeanAttribute(server, "bean:name=testBean4", "TEST");
|
|
|
|
|
validateMBeanAttribute(server, "bean:name=testBean5", "FACTORY");
|
|
|
|
|
validateMBeanAttribute(server, "spring:mbean=true", "Rob Harrop");
|
|
|
|
|
validateMBeanAttribute(server, "spring:mbean=another", "Juergen Hoeller");
|
|
|
|
|
}
|
|
|
|
|
finally {
|
|
|
|
|
System.clearProperty("domain");
|
|
|
|
|
ctx.close();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void testComponentScan() throws Exception {
|
|
|
|
|
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
|
|
|
|
|
ComponentScanConfiguration.class);
|
|
|
|
|
try {
|
|
|
|
|
MBeanServer server = (MBeanServer) ctx.getBean("server");
|
|
|
|
|
ObjectName oname = ObjectNameManager.getInstance("bean:name=testBean4");
|
|
|
|
|
assertNotNull(server.getObjectInstance(oname));
|
|
|
|
|
String name = (String) server.getAttribute(oname, "Name");
|
|
|
|
|
assertNull(name);
|
|
|
|
|
}
|
|
|
|
|
finally {
|
|
|
|
|
ctx.close();
|
|
|
|
|
}
|
|
|
|
|
load(ComponentScanConfiguration.class);
|
|
|
|
|
MBeanServer server = (MBeanServer) this.ctx.getBean("server");
|
|
|
|
|
validateMBeanAttribute(server, "bean:name=testBean4", null);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void validateAnnotationTestBean() throws Exception {
|
|
|
|
|
MBeanServer server = (MBeanServer) this.ctx.getBean("server");
|
|
|
|
|
validateMBeanAttribute(server,"bean:name=testBean4", "TEST");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void validateMBeanAttribute(MBeanServer server, String objectName, String expected) throws Exception {
|
|
|
|
|
ObjectName oname = ObjectNameManager.getInstance(objectName);
|
|
|
|
|
assertNotNull(server.getObjectInstance(oname));
|
|
|
|
|
String name = (String) server.getAttribute(oname, "Name");
|
|
|
|
|
assertEquals("Invalid name returned", expected, name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -271,4 +273,97 @@ public class EnableMBeanExportConfigurationTests {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Configuration
|
|
|
|
|
@EnableMBeanExport(server = "server")
|
|
|
|
|
static class PackagePrivateConfiguration {
|
|
|
|
|
|
|
|
|
|
@Bean
|
|
|
|
|
public MBeanServerFactoryBean server() throws Exception {
|
|
|
|
|
return new MBeanServerFactoryBean();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Bean
|
|
|
|
|
public PackagePrivateTestBean testBean() {
|
|
|
|
|
return new PackagePrivateTestBean();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ManagedResource(objectName = "bean:name=packagePrivate")
|
|
|
|
|
private static class PackagePrivateTestBean {
|
|
|
|
|
|
|
|
|
|
private String name;
|
|
|
|
|
|
|
|
|
|
@ManagedAttribute
|
|
|
|
|
public String getName() {
|
|
|
|
|
return this.name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ManagedAttribute
|
|
|
|
|
public void setName(String name) {
|
|
|
|
|
this.name = name;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Configuration
|
|
|
|
|
@EnableMBeanExport(server = "server")
|
|
|
|
|
static class PackagePrivateExtensionConfiguration {
|
|
|
|
|
|
|
|
|
|
@Bean
|
|
|
|
|
public MBeanServerFactoryBean server() throws Exception {
|
|
|
|
|
return new MBeanServerFactoryBean();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Bean
|
|
|
|
|
public PackagePrivateTestBeanExtension testBean() {
|
|
|
|
|
PackagePrivateTestBeanExtension bean = new PackagePrivateTestBeanExtension();
|
|
|
|
|
bean.setName("TEST");
|
|
|
|
|
return bean;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static class PackagePrivateTestBeanExtension extends AnnotationTestBean {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Configuration
|
|
|
|
|
@EnableMBeanExport(server = "server")
|
|
|
|
|
static class PackagePrivateInterfaceImplementationConfiguration {
|
|
|
|
|
|
|
|
|
|
@Bean
|
|
|
|
|
public MBeanServerFactoryBean server() throws Exception {
|
|
|
|
|
return new MBeanServerFactoryBean();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Bean
|
|
|
|
|
public PackagePrivateAnnotationTestBean testBean() {
|
|
|
|
|
return new PackagePrivateAnnotationTestBean();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static class PackagePrivateAnnotationTestBean implements AnotherAnnotationTestBean {
|
|
|
|
|
|
|
|
|
|
private String bar;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void foo() {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public String getBar() {
|
|
|
|
|
return this.bar;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void setBar(String bar) {
|
|
|
|
|
this.bar = bar;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getCacheEntries() {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|