Merge branch '1.5.x'
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 {
|
||||
|
||||
/**
|
||||
|
||||
@@ -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 {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user