diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementContextConfigurationsImportSelector.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementContextConfigurationsImportSelector.java index a28c479e2bc..3372cf8767f 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementContextConfigurationsImportSelector.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementContextConfigurationsImportSelector.java @@ -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 factories = new ArrayList( - new LinkedHashSet(SpringFactoriesLoader.loadFactoryNames( - ManagementContextConfiguration.class, this.classLoader))); - AnnotationAwareOrderComparator.sort(factories); - return factories.toArray(new String[0]); + List names = loadFactoryNames(); + Set> classes = new LinkedHashSet>(); + for (String factoryName : names) { + classes.add(ClassUtils.resolveClassName(factoryName, this.classLoader)); + } + return getSortedClassNames(new ArrayList>(classes)); + } + + protected List loadFactoryNames() { + return SpringFactoriesLoader + .loadFactoryNames(ManagementContextConfiguration.class, this.classLoader); + } + + private String[] getSortedClassNames(List> classes) { + AnnotationAwareOrderComparator.sort(classes); + List names = new ArrayList(); + for (Class sourceClass : classes) { + names.add(sourceClass.getName()); + } + return names.toArray(new String[names.size()]); } @Override diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/ManagementContextConfigurationsImportSelectorTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/ManagementContextConfigurationsImportSelectorTests.java new file mode 100644 index 00000000000..41a626db64b --- /dev/null +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/ManagementContextConfigurationsImportSelectorTests.java @@ -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 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 { + + } + +} diff --git a/spring-boot-test/src/main/java/org/springframework/boot/test/web/client/TestRestTemplate.java b/spring-boot-test/src/main/java/org/springframework/boot/test/web/client/TestRestTemplate.java index 7f778441639..4bbfa434f03 100644 --- a/spring-boot-test/src/main/java/org/springframework/boot/test/web/client/TestRestTemplate.java +++ b/spring-boot-test/src/main/java/org/springframework/boot/test/web/client/TestRestTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 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. @@ -48,7 +48,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; -import org.springframework.http.client.InterceptingClientHttpRequestFactory; import org.springframework.http.client.support.BasicAuthorizationInterceptor; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -144,11 +143,19 @@ public class TestRestTemplate { if (username == null) { return; } - List interceptors = Collections - .singletonList( - new BasicAuthorizationInterceptor(username, password)); - restTemplate.setRequestFactory(new InterceptingClientHttpRequestFactory( - restTemplate.getRequestFactory(), interceptors)); + List interceptors = restTemplate.getInterceptors(); + if (interceptors == null) { + interceptors = Collections.emptyList(); + } + interceptors = new ArrayList(interceptors); + Iterator iterator = interceptors.iterator(); + while (iterator.hasNext()) { + if (iterator.next() instanceof BasicAuthorizationInterceptor) { + iterator.remove(); + } + } + interceptors.add(new BasicAuthorizationInterceptor(username, password)); + restTemplate.setInterceptors(interceptors); } /** @@ -985,8 +992,7 @@ public class TestRestTemplate { public TestRestTemplate withBasicAuth(String username, String password) { RestTemplate restTemplate = new RestTemplate(); restTemplate.setMessageConverters(getRestTemplate().getMessageConverters()); - restTemplate.setInterceptors( - removeBasicAuthInterceptorIfPresent(getRestTemplate().getInterceptors())); + restTemplate.setInterceptors(getRestTemplate().getInterceptors()); restTemplate.setRequestFactory(getRestTemplate().getRequestFactory()); restTemplate.setUriTemplateHandler(getRestTemplate().getUriTemplateHandler()); TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplate, username, @@ -996,19 +1002,6 @@ public class TestRestTemplate { return testRestTemplate; } - private List removeBasicAuthInterceptorIfPresent( - List interceptors) { - List updatedInterceptors = new ArrayList( - interceptors); - Iterator iterator = updatedInterceptors.iterator(); - while (iterator.hasNext()) { - if (iterator.next() instanceof BasicAuthorizationInterceptor) { - iterator.remove(); - } - } - return interceptors; - } - /** * Options used to customize the Apache Http Client if it is used. */ diff --git a/spring-boot-test/src/test/java/org/springframework/boot/test/web/client/TestRestTemplateTests.java b/spring-boot-test/src/test/java/org/springframework/boot/test/web/client/TestRestTemplateTests.java index 924e230c278..5b1549df134 100644 --- a/spring-boot-test/src/test/java/org/springframework/boot/test/web/client/TestRestTemplateTests.java +++ b/spring-boot-test/src/test/java/org/springframework/boot/test/web/client/TestRestTemplateTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 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. @@ -160,16 +160,15 @@ public class TestRestTemplateTests { .isInstanceOf(CustomHttpComponentsClientHttpRequestFactory.class); assertThat(basicAuthTemplate.getRestTemplate().getUriTemplateHandler()) .isSameAs(originalTemplate.getRestTemplate().getUriTemplateHandler()); - assertThat(basicAuthTemplate.getRestTemplate().getInterceptors()) - .containsExactlyElementsOf( - originalTemplate.getRestTemplate().getInterceptors()); + assertThat(basicAuthTemplate.getRestTemplate().getInterceptors()).hasSize(1); assertBasicAuthorizationInterceptorCredentials(basicAuthTemplate, "user", "password"); } @Test public void withBasicAuthReplacesBasicAuthInterceptorWhenAlreadyPresent() { - TestRestTemplate original = new TestRestTemplate("foo", "bar"); + TestRestTemplate original = new TestRestTemplate("foo", "bar") + .withBasicAuth("replace", "repalce"); TestRestTemplate basicAuth = original.withBasicAuth("user", "password"); assertThat(basicAuth.getRestTemplate().getMessageConverters()) .containsExactlyElementsOf( @@ -181,8 +180,7 @@ public class TestRestTemplateTests { .isInstanceOf(CustomHttpComponentsClientHttpRequestFactory.class); assertThat(basicAuth.getRestTemplate().getUriTemplateHandler()) .isSameAs(original.getRestTemplate().getUriTemplateHandler()); - assertThat(basicAuth.getRestTemplate().getInterceptors()) - .containsExactlyElementsOf(original.getRestTemplate().getInterceptors()); + assertThat(basicAuth.getRestTemplate().getInterceptors()).hasSize(1); assertBasicAuthorizationInterceptorCredentials(basicAuth, "user", "password"); }