Merge branch '1.5.x'

This commit is contained in:
Phillip Webb
2017-01-03 15:14:41 -08:00
20 changed files with 346 additions and 242 deletions

View File

@@ -90,7 +90,7 @@ public class EndpointMBeanExportAutoConfiguration {
@Bean
@ConditionalOnBean(AuditEventRepository.class)
@ConditionalOnEnabledEndpoint("auditevents")
public AuditEventsJmxEndpoint abstractEndpointMBean(
public AuditEventsJmxEndpoint auditEventsEndpoint(
AuditEventRepository auditEventRepository) {
return new AuditEventsJmxEndpoint(this.objectMapper, auditEventRepository);
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2012-2015 the original author or authors.
* Copyright 2012-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@ package org.springframework.boot.actuate.autoconfigure;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.BeanClassLoaderAware;
import org.springframework.context.annotation.DeferredImportSelector;
@@ -27,6 +28,7 @@ import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.support.SpringFactoriesLoader;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.util.ClassUtils;
/**
* Selects configuration classes for the management context configuration. Entries are
@@ -47,11 +49,26 @@ class ManagementContextConfigurationsImportSelector
@Override
public String[] selectImports(AnnotationMetadata metadata) {
// Find all possible auto configuration classes, filtering duplicates
List<String> factories = new ArrayList<String>(
new LinkedHashSet<String>(SpringFactoriesLoader.loadFactoryNames(
ManagementContextConfiguration.class, this.classLoader)));
AnnotationAwareOrderComparator.sort(factories);
return factories.toArray(new String[0]);
List<String> names = loadFactoryNames();
Set<Class<?>> classes = new LinkedHashSet<Class<?>>();
for (String factoryName : names) {
classes.add(ClassUtils.resolveClassName(factoryName, this.classLoader));
}
return getSortedClassNames(new ArrayList<Class<?>>(classes));
}
protected List<String> loadFactoryNames() {
return SpringFactoriesLoader
.loadFactoryNames(ManagementContextConfiguration.class, this.classLoader);
}
private String[] getSortedClassNames(List<Class<?>> classes) {
AnnotationAwareOrderComparator.sort(classes);
List<String> names = new ArrayList<String>();
for (Class<?> sourceClass : classes) {
names.add(sourceClass.getName());
}
return names.toArray(new String[names.size()]);
}
@Override

View File

@@ -22,7 +22,6 @@ import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.boot.actuate.endpoint.EndpointProperties;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.util.ObjectUtils;
/**
@@ -33,7 +32,6 @@ import org.springframework.util.ObjectUtils;
* @author Phillip Webb
* @since 1.5.0
*/
@ManagedResource
public abstract class AbstractJmxEndpoint implements JmxEndpoint, EnvironmentAware {
private final DataConverter dataConverter;

View File

@@ -28,6 +28,7 @@ import org.springframework.boot.actuate.audit.AuditEventRepository;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
* {@link JmxEndpoint} for {@link AuditEventRepository}.
@@ -72,7 +73,10 @@ public class AuditEventsJmxEndpoint extends AbstractJmxEndpoint {
private Date parseDate(String date) {
try {
return new SimpleDateFormat(DATE_FORMAT).parse(date);
if (StringUtils.hasLength(date)) {
return new SimpleDateFormat(DATE_FORMAT).parse(date);
}
return null;
}
catch (ParseException ex) {
throw new IllegalArgumentException(ex);

View File

@@ -20,7 +20,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedResource;
/**
* Simple wrapper around {@link Endpoint} implementations that provide actuator data of
@@ -29,7 +28,6 @@ import org.springframework.jmx.export.annotation.ManagedResource;
* @author Christian Dupuis
* @author Andy Wilkinson
*/
@ManagedResource
public class DataEndpointMBean extends EndpointMBean {
/**

View File

@@ -20,7 +20,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.ObjectUtils;
@@ -35,7 +34,6 @@ import org.springframework.util.ObjectUtils;
* @see JmxEndpoint
* @see DataEndpointMBean
*/
@ManagedResource
public abstract class EndpointMBean implements JmxEndpoint {
private final DataConverter dataConverter;

View File

@@ -46,9 +46,12 @@ import org.springframework.jmx.export.MBeanExporter;
import org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler;
import org.springframework.jmx.export.metadata.InvalidMetadataException;
import org.springframework.jmx.export.metadata.JmxAttributeSource;
import org.springframework.jmx.export.naming.MetadataNamingStrategy;
import org.springframework.jmx.export.naming.SelfNaming;
import org.springframework.jmx.support.ObjectNameManager;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
/**
@@ -70,7 +73,7 @@ public class EndpointMBeanExporter extends MBeanExporter
private static final Log logger = LogFactory.getLog(EndpointMBeanExporter.class);
private final AnnotationJmxAttributeSource attributeSource = new AnnotationJmxAttributeSource();
private final AnnotationJmxAttributeSource attributeSource = new EndpointJmxAttributeSource();
private final MetadataMBeanInfoAssembler assembler = new MetadataMBeanInfoAssembler(
this.attributeSource);
@@ -253,8 +256,8 @@ public class EndpointMBeanExporter extends MBeanExporter
if (bean instanceof SelfNaming) {
return ((SelfNaming) bean).getObjectName();
}
if (bean instanceof EndpointMBean) {
return getObjectName((EndpointMBean) bean, beanKey);
if (bean instanceof JmxEndpoint) {
return getObjectName((JmxEndpoint) bean, beanKey);
}
return this.defaultNamingStrategy.getObjectName(bean, beanKey);
}
@@ -363,4 +366,19 @@ public class EndpointMBeanExporter extends MBeanExporter
}
}
/**
* {@link JmxAttributeSource} for {@link JmxEndpoint JmxEndpoints}.
*/
private static class EndpointJmxAttributeSource extends AnnotationJmxAttributeSource {
@Override
public org.springframework.jmx.export.metadata.ManagedResource getManagedResource(
Class<?> beanClass) throws InvalidMetadataException {
Assert.state(super.getManagedResource(beanClass) == null,
"@ManagedResource annotation found on JmxEndpoint " + beanClass);
return new org.springframework.jmx.export.metadata.ManagedResource();
}
}
}

View File

@@ -17,11 +17,13 @@
package org.springframework.boot.actuate.endpoint.jmx;
import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.jmx.export.annotation.ManagedResource;
/**
* A strategy for the JMX layer on top of an {@link Endpoint}. Implementations are allowed
* to use {@code @ManagedAttribute} and the full Spring JMX machinery. Implementations may
* be backed by an actual {@link Endpoint} or may be specifically designed for JMX only.
* to use {@code @ManagedAttribute} and the full Spring JMX machinery but should not use
* the {@link ManagedResource @ManagedResource} annotation. Implementations may be backed
* by an actual {@link Endpoint} or may be specifically designed for JMX only.
*
* @author Phillip Webb
* @since 1.5.0

View File

@@ -24,7 +24,6 @@ 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;
/**
@@ -33,7 +32,6 @@ import org.springframework.util.Assert;
* @author Vedran Pavic
* @since 1.5.0
*/
@ManagedResource
public class LoggersEndpointMBean extends EndpointMBean {
public LoggersEndpointMBean(String beanName, Endpoint<?> endpoint,

View File

@@ -21,7 +21,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.boot.actuate.endpoint.ShutdownEndpoint;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedResource;
/**
* Special endpoint wrapper for {@link ShutdownEndpoint}.
@@ -29,7 +28,6 @@ import org.springframework.jmx.export.annotation.ManagedResource;
* @author Christian Dupuis
* @author Andy Wilkinson
*/
@ManagedResource
public class ShutdownEndpointMBean extends EndpointMBean {
/**

View File

@@ -0,0 +1,68 @@
/*
* Copyright 2012-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.actuate.autoconfigure;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import org.springframework.core.annotation.Order;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link ManagementContextConfigurationsImportSelector}.
*
* @author Phillip Webb
*/
public class ManagementContextConfigurationsImportSelectorTests {
@Test
public void selectImportsShouldOrderResult() throws Exception {
String[] imports = new TestManagementContextConfigurationsImportSelector()
.selectImports(null);
assertThat(imports).containsExactly(A.class.getName(), B.class.getName(),
C.class.getName());
}
private static class TestManagementContextConfigurationsImportSelector
extends ManagementContextConfigurationsImportSelector {
@Override
protected List<String> loadFactoryNames() {
return Arrays.asList(C.class.getName(), A.class.getName(), B.class.getName());
}
}
@Order(1)
private static class A {
}
@Order(2)
private static class B {
}
@Order(3)
private static class C {
}
}