From f560f338ab8df8dd0377d3bbbf4089986f709b34 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 16 Dec 2016 11:58:26 +0100 Subject: [PATCH] Polish contribution Closes gh-7219 --- .../endpoint/jmx/LoggersEndpointMBean.java | 11 +++-- .../jmx/EndpointMBeanExporterTests.java | 47 +++++++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/LoggersEndpointMBean.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/LoggersEndpointMBean.java index 048efe71be..b95aea460b 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/LoggersEndpointMBean.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/jmx/LoggersEndpointMBean.java @@ -24,6 +24,8 @@ import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint; import org.springframework.boot.logging.LogLevel; import org.springframework.jmx.export.annotation.ManagedAttribute; import org.springframework.jmx.export.annotation.ManagedOperation; +import org.springframework.jmx.export.annotation.ManagedResource; +import org.springframework.util.Assert; /** * Adapter to expose {@link LoggersEndpoint} as an {@link MvcEndpoint}. @@ -31,6 +33,7 @@ import org.springframework.jmx.export.annotation.ManagedOperation; * @author Vedran Pavic * @since 1.5.0 */ +@ManagedResource public class LoggersEndpointMBean extends EndpointMBean { public LoggersEndpointMBean(String beanName, Endpoint endpoint, @@ -38,19 +41,21 @@ public class LoggersEndpointMBean extends EndpointMBean { super(beanName, endpoint, objectMapper); } - @ManagedAttribute(description = "Get levels for all known loggers") + @ManagedAttribute(description = "Get log levels for all known loggers") public Object getLoggers() { return convert(getEndpoint().invoke()); } - @ManagedOperation(description = "Get level for a given logger") + @ManagedOperation(description = "Get log level for a given logger") public Object getLogger(String loggerName) { return convert(getEndpoint().invoke(loggerName)); } @ManagedOperation(description = "Set log level for a given logger") public void setLogLevel(String loggerName, String logLevel) { - getEndpoint().setLogLevel(loggerName, LogLevel.valueOf(logLevel)); + Assert.notNull(logLevel, "LogLevel must not be null"); + LogLevel level = LogLevel.valueOf(logLevel.toUpperCase()); + getEndpoint().setLogLevel(loggerName, level); } @Override diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/jmx/EndpointMBeanExporterTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/jmx/EndpointMBeanExporterTests.java index c50fff0165..981459dcd2 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/jmx/EndpointMBeanExporterTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/jmx/EndpointMBeanExporterTests.java @@ -26,18 +26,23 @@ import java.util.List; import java.util.Map; import java.util.Properties; +import javax.management.MBeanException; import javax.management.MBeanInfo; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.After; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.factory.config.ConstructorArgumentValues; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.boot.actuate.endpoint.AbstractEndpoint; +import org.springframework.boot.actuate.endpoint.LoggersEndpoint; +import org.springframework.boot.logging.logback.LogbackLoggingSystem; import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericApplicationContext; import org.springframework.jmx.export.MBeanExporter; @@ -45,15 +50,21 @@ import org.springframework.jmx.support.ObjectNameManager; import org.springframework.util.ObjectUtils; import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.junit.internal.matchers.ThrowableMessageMatcher.hasMessage; /** * Tests for {@link EndpointMBeanExporter} * * @author Christian Dupuis * @author Andy Wilkinson + * @author Stephane Nicoll */ public class EndpointMBeanExporterTests { + @Rule + public ExpectedException thrown = ExpectedException.none(); + GenericApplicationContext context = null; @After @@ -253,6 +264,42 @@ public class EndpointMBeanExporterTests { assertThat(((List) response).get(0)).isInstanceOf(Long.class); } + @Test + public void loggerEndpointLowerCaseLogLevel() throws Exception { + MBeanExporter mbeanExporter = registerLoggersEndpoint(); + Object response = mbeanExporter.getServer().invoke( + getObjectName("loggersEndpoint", this.context), "setLogLevel", + new Object[]{"com.example", "trace"}, + new String[]{String.class.getName(), String.class.getName()}); + assertThat(response).isNull(); + } + + @Test + public void loggerEndpointUnknownLogLevel() throws Exception { + MBeanExporter mbeanExporter = registerLoggersEndpoint(); + this.thrown.expect(MBeanException.class); + this.thrown.expectCause(hasMessage(containsString("No enum constant"))); + this.thrown.expectCause(hasMessage(containsString("LogLevel.INVALID"))); + mbeanExporter.getServer().invoke( + getObjectName("loggersEndpoint", this.context), "setLogLevel", + new Object[]{"com.example", "invalid"}, + new String[]{String.class.getName(), String.class.getName()}); + } + + private MBeanExporter registerLoggersEndpoint() { + this.context = new GenericApplicationContext(); + this.context.registerBeanDefinition("endpointMbeanExporter", + new RootBeanDefinition(EndpointMBeanExporter.class)); + RootBeanDefinition bd = new RootBeanDefinition(LoggersEndpoint.class); + ConstructorArgumentValues values = new ConstructorArgumentValues(); + values.addIndexedArgumentValue(0, + new LogbackLoggingSystem(getClass().getClassLoader())); + bd.setConstructorArgumentValues(values); + this.context.registerBeanDefinition("loggersEndpoint", bd); + this.context.refresh(); + return this.context.getBean(EndpointMBeanExporter.class); + } + private ObjectName getObjectName(String beanKey, GenericApplicationContext context) throws MalformedObjectNameException { return getObjectName("org.springframework.boot", beanKey, false, context);