Merge branch '1.5.x'
This commit is contained in:
commit
519f9c6c54
|
@ -44,16 +44,16 @@ public class InMemoryMetricRepository implements MetricRepository {
|
||||||
final int amount = delta.getValue().intValue();
|
final int amount = delta.getValue().intValue();
|
||||||
final Date timestamp = delta.getTimestamp();
|
final Date timestamp = delta.getTimestamp();
|
||||||
this.metrics.update(metricName, new Callback<Metric<?>>() {
|
this.metrics.update(metricName, new Callback<Metric<?>>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Metric<?> modify(Metric<?> current) {
|
public Metric<?> modify(Metric<?> current) {
|
||||||
if (current != null) {
|
if (current != null) {
|
||||||
return new Metric<Long>(metricName,
|
return new Metric<Long>(metricName,
|
||||||
current.increment(amount).getValue(), timestamp);
|
current.increment(amount).getValue(), timestamp);
|
||||||
}
|
}
|
||||||
else {
|
return new Metric<Long>(metricName, (long) amount, timestamp);
|
||||||
return new Metric<Long>(metricName, (long) amount, timestamp);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@ import java.util.HashSet;
|
||||||
|
|
||||||
import org.springframework.boot.actuate.metrics.Metric;
|
import org.springframework.boot.actuate.metrics.Metric;
|
||||||
import org.springframework.boot.actuate.metrics.writer.Delta;
|
import org.springframework.boot.actuate.metrics.writer.Delta;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link MultiMetricRepository} implementation backed by a
|
* {@link MultiMetricRepository} implementation backed by a
|
||||||
|
@ -36,14 +37,24 @@ public class InMemoryMultiMetricRepository implements MultiMetricRepository {
|
||||||
|
|
||||||
private final Collection<String> groups = new HashSet<String>();
|
private final Collection<String> groups = new HashSet<String>();
|
||||||
|
|
||||||
public InMemoryMultiMetricRepository(InMemoryMetricRepository repository) {
|
/**
|
||||||
this.repository = repository;
|
* Create a new {@link InMemoryMetricRepository} backed by a new
|
||||||
}
|
* {@link InMemoryMetricRepository}.
|
||||||
|
*/
|
||||||
public InMemoryMultiMetricRepository() {
|
public InMemoryMultiMetricRepository() {
|
||||||
this(new InMemoryMetricRepository());
|
this(new InMemoryMetricRepository());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new {@link InMemoryMetricRepository} backed by the specified
|
||||||
|
* {@link InMemoryMetricRepository}.
|
||||||
|
* @param repository the backing repository
|
||||||
|
*/
|
||||||
|
public InMemoryMultiMetricRepository(InMemoryMetricRepository repository) {
|
||||||
|
Assert.notNull(repository, "Repository must not be null");
|
||||||
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void set(String group, Collection<Metric<?>> values) {
|
public void set(String group, Collection<Metric<?>> values) {
|
||||||
String prefix = group;
|
String prefix = group;
|
||||||
|
|
|
@ -145,7 +145,7 @@ public class JolokiaAutoConfigurationTests {
|
||||||
Collection<? extends MvcEndpoint> endpoints) {
|
Collection<? extends MvcEndpoint> endpoints) {
|
||||||
EndpointHandlerMapping mapping = new EndpointHandlerMapping(endpoints);
|
EndpointHandlerMapping mapping = new EndpointHandlerMapping(endpoints);
|
||||||
mapping.setSecurityInterceptor(
|
mapping.setSecurityInterceptor(
|
||||||
new MvcEndpointSecurityInterceptor(false, Collections.EMPTY_LIST));
|
new MvcEndpointSecurityInterceptor(false, Collections.emptyList()));
|
||||||
return mapping;
|
return mapping;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,8 +54,8 @@ public class PrefixMetricGroupExporterTests {
|
||||||
@Test
|
@Test
|
||||||
public void countersIncremented() {
|
public void countersIncremented() {
|
||||||
this.writer.increment("counter.foo", new Delta<Long>("bar", 1L));
|
this.writer.increment("counter.foo", new Delta<Long>("bar", 1L));
|
||||||
this.reader.set("counter", Collections.<Metric<?>>singletonList(
|
this.reader.set("counter", Collections
|
||||||
new Metric<Number>("counter.foo.bar", 1)));
|
.<Metric<?>>singletonList(new Metric<Number>("counter.foo.bar", 1)));
|
||||||
this.exporter.setGroups(Collections.singleton("counter.foo"));
|
this.exporter.setGroups(Collections.singleton("counter.foo"));
|
||||||
this.exporter.export();
|
this.exporter.export();
|
||||||
assertThat(this.writer.findAll("counter.foo").iterator().next().getValue())
|
assertThat(this.writer.findAll("counter.foo").iterator().next().getValue())
|
||||||
|
@ -65,8 +65,7 @@ public class PrefixMetricGroupExporterTests {
|
||||||
@Test
|
@Test
|
||||||
public void unprefixedMetricsNotCopied() {
|
public void unprefixedMetricsNotCopied() {
|
||||||
this.reader.set("foo", Arrays.<Metric<?>>asList(
|
this.reader.set("foo", Arrays.<Metric<?>>asList(
|
||||||
new Metric<Number>("foo.bar", 2.3),
|
new Metric<Number>("foo.bar", 2.3), new Metric<Number>("foo.spam", 1.3)));
|
||||||
new Metric<Number>("foo.spam", 1.3)));
|
|
||||||
this.exporter.setGroups(Collections.singleton("bar"));
|
this.exporter.setGroups(Collections.singleton("bar"));
|
||||||
this.exporter.export();
|
this.exporter.export();
|
||||||
assertThat(Iterables.collection(this.writer.groups())).isEmpty();
|
assertThat(Iterables.collection(this.writer.groups())).isEmpty();
|
||||||
|
@ -84,10 +83,9 @@ public class PrefixMetricGroupExporterTests {
|
||||||
@Test
|
@Test
|
||||||
public void onlyPrefixedMetricsCopied() {
|
public void onlyPrefixedMetricsCopied() {
|
||||||
this.reader.set("foo", Arrays.<Metric<?>>asList(
|
this.reader.set("foo", Arrays.<Metric<?>>asList(
|
||||||
new Metric<Number>("foo.bar", 2.3),
|
new Metric<Number>("foo.bar", 2.3), new Metric<Number>("foo.spam", 1.3)));
|
||||||
new Metric<Number>("foo.spam", 1.3)));
|
this.reader.set("foobar", Collections
|
||||||
this.reader.set("foobar", Collections.<Metric<?>>singletonList(
|
.<Metric<?>>singletonList(new Metric<Number>("foobar.spam", 1.3)));
|
||||||
new Metric<Number>("foobar.spam", 1.3)));
|
|
||||||
this.exporter.setGroups(Collections.singleton("foo"));
|
this.exporter.setGroups(Collections.singleton("foo"));
|
||||||
this.exporter.export();
|
this.exporter.export();
|
||||||
assertThat(Iterables.collection(this.writer.groups())).hasSize(1);
|
assertThat(Iterables.collection(this.writer.groups())).hasSize(1);
|
||||||
|
|
|
@ -28,6 +28,8 @@ import static org.assertj.core.api.Assertions.offset;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for {@link InMemoryMetricRepository}.
|
* Tests for {@link InMemoryMetricRepository}.
|
||||||
|
*
|
||||||
|
* @author Dave Syer
|
||||||
*/
|
*/
|
||||||
public class InMemoryMetricRepositoryTests {
|
public class InMemoryMetricRepositoryTests {
|
||||||
|
|
||||||
|
|
|
@ -29,12 +29,13 @@ import org.springframework.boot.actuate.metrics.writer.Delta;
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Tests for {@link InMemoryMultiMetricRepository}.
|
||||||
|
*
|
||||||
* @author Dave Syer
|
* @author Dave Syer
|
||||||
*/
|
*/
|
||||||
public class InMemoryMultiMetricRepositoryTests {
|
public class InMemoryMultiMetricRepositoryTests {
|
||||||
|
|
||||||
private final InMemoryMultiMetricRepository repository =
|
private final InMemoryMultiMetricRepository repository = new InMemoryMultiMetricRepository();
|
||||||
new InMemoryMultiMetricRepository();
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void registeredPrefixCounted() {
|
public void registeredPrefixCounted() {
|
||||||
|
|
|
@ -20,7 +20,9 @@ import com.datastax.driver.core.Cluster;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback interface that can be implemented by beans wishing to customize the
|
* Callback interface that can be implemented by beans wishing to customize the
|
||||||
* {@link Cluster} via {@link Cluster.Builder} retaining its default auto-configuration.
|
* {@link com.datastax.driver.core.Cluster} via
|
||||||
|
* {@link com.datastax.driver.core.Cluster.Builder} retaining its default
|
||||||
|
* auto-configuration.
|
||||||
*
|
*
|
||||||
* @author Eddú Meléndez
|
* @author Eddú Meléndez
|
||||||
* @since 1.5.0
|
* @since 1.5.0
|
||||||
|
@ -28,7 +30,7 @@ import com.datastax.driver.core.Cluster;
|
||||||
public interface ClusterBuilderCustomizer {
|
public interface ClusterBuilderCustomizer {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Customize the {@link Cluster.Builder}.
|
* Customize the {@link com.datastax.driver.core.Cluster.Builder}.
|
||||||
* @param clusterBuilder the builder to customize
|
* @param clusterBuilder the builder to customize
|
||||||
*/
|
*/
|
||||||
void customize(Cluster.Builder clusterBuilder);
|
void customize(Cluster.Builder clusterBuilder);
|
||||||
|
|
|
@ -29,32 +29,54 @@ import org.springframework.boot.devtools.restart.classloader.ClassLoaderFile.Kin
|
||||||
import org.springframework.boot.devtools.restart.classloader.ClassLoaderFileURLStreamHandler;
|
import org.springframework.boot.devtools.restart.classloader.ClassLoaderFileURLStreamHandler;
|
||||||
import org.springframework.boot.devtools.restart.classloader.ClassLoaderFiles;
|
import org.springframework.boot.devtools.restart.classloader.ClassLoaderFiles;
|
||||||
import org.springframework.boot.devtools.restart.classloader.ClassLoaderFiles.SourceFolder;
|
import org.springframework.boot.devtools.restart.classloader.ClassLoaderFiles.SourceFolder;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
import org.springframework.core.io.AbstractResource;
|
import org.springframework.core.io.AbstractResource;
|
||||||
|
import org.springframework.core.io.DefaultResourceLoader;
|
||||||
import org.springframework.core.io.Resource;
|
import org.springframework.core.io.Resource;
|
||||||
|
import org.springframework.core.io.ResourceLoader;
|
||||||
import org.springframework.core.io.UrlResource;
|
import org.springframework.core.io.UrlResource;
|
||||||
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
|
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
|
||||||
import org.springframework.core.io.support.ResourcePatternResolver;
|
import org.springframework.core.io.support.ResourcePatternResolver;
|
||||||
import org.springframework.util.AntPathMatcher;
|
import org.springframework.util.AntPathMatcher;
|
||||||
|
import org.springframework.util.ClassUtils;
|
||||||
|
import org.springframework.util.PathMatcher;
|
||||||
|
import org.springframework.web.context.WebApplicationContext;
|
||||||
|
import org.springframework.web.context.support.ServletContextResource;
|
||||||
|
import org.springframework.web.context.support.ServletContextResourcePatternResolver;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A {@code ResourcePatternResolver} that considers {@link ClassLoaderFiles} when
|
* A {@code ResourcePatternResolver} that considers {@link ClassLoaderFiles} when
|
||||||
* resolving resources.
|
* resolving resources.
|
||||||
*
|
*
|
||||||
* @author Andy Wilkinson
|
* @author Andy Wilkinson
|
||||||
|
* @author Phillip Webb
|
||||||
*/
|
*/
|
||||||
final class ClassLoaderFilesResourcePatternResolver implements ResourcePatternResolver {
|
final class ClassLoaderFilesResourcePatternResolver implements ResourcePatternResolver {
|
||||||
|
|
||||||
private static final String[] LOCATION_PATTERN_PREFIXES = { CLASSPATH_ALL_URL_PREFIX,
|
private static final String[] LOCATION_PATTERN_PREFIXES = { CLASSPATH_ALL_URL_PREFIX,
|
||||||
CLASSPATH_URL_PREFIX };
|
CLASSPATH_URL_PREFIX };
|
||||||
|
|
||||||
private final ResourcePatternResolver delegate = new PathMatchingResourcePatternResolver();
|
private static final String WEB_CONTEXT_CLASS = "org.springframework.web.context."
|
||||||
|
+ "WebApplicationContext";
|
||||||
|
|
||||||
private final AntPathMatcher antPathMatcher = new AntPathMatcher();
|
private final ResourcePatternResolver delegate;
|
||||||
|
|
||||||
|
private final PathMatcher antPathMatcher = new AntPathMatcher();
|
||||||
|
|
||||||
private final ClassLoaderFiles classLoaderFiles;
|
private final ClassLoaderFiles classLoaderFiles;
|
||||||
|
|
||||||
ClassLoaderFilesResourcePatternResolver(ClassLoaderFiles classLoaderFiles) {
|
ClassLoaderFilesResourcePatternResolver(ApplicationContext applicationContext,
|
||||||
|
ClassLoaderFiles classLoaderFiles) {
|
||||||
this.classLoaderFiles = classLoaderFiles;
|
this.classLoaderFiles = classLoaderFiles;
|
||||||
|
this.delegate = getResourcePatternResolverFactory()
|
||||||
|
.getResourcePatternResolver(applicationContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ResourcePatternResolverFactory getResourcePatternResolverFactory() {
|
||||||
|
if (ClassUtils.isPresent(WEB_CONTEXT_CLASS, null)) {
|
||||||
|
return new WebResourcePatternResolverFactory();
|
||||||
|
}
|
||||||
|
return new ResourcePatternResolverFactory();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -137,7 +159,7 @@ final class ClassLoaderFilesResourcePatternResolver implements ResourcePatternRe
|
||||||
* A {@link Resource} that represents a {@link ClassLoaderFile} that has been
|
* A {@link Resource} that represents a {@link ClassLoaderFile} that has been
|
||||||
* {@link Kind#DELETED deleted}.
|
* {@link Kind#DELETED deleted}.
|
||||||
*/
|
*/
|
||||||
private final class DeletedClassLoaderFileResource extends AbstractResource {
|
static final class DeletedClassLoaderFileResource extends AbstractResource {
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
|
@ -162,4 +184,60 @@ final class ClassLoaderFilesResourcePatternResolver implements ResourcePatternRe
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Factory used to create the {@link ResourcePatternResolver} delegate.
|
||||||
|
*/
|
||||||
|
private static class ResourcePatternResolverFactory {
|
||||||
|
|
||||||
|
public ResourcePatternResolver getResourcePatternResolver(
|
||||||
|
ApplicationContext applicationContext) {
|
||||||
|
return new PathMatchingResourcePatternResolver();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link ResourcePatternResolverFactory} to be used when the classloader can access
|
||||||
|
* {@link WebApplicationContext}.
|
||||||
|
*/
|
||||||
|
private static class WebResourcePatternResolverFactory
|
||||||
|
extends ResourcePatternResolverFactory {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResourcePatternResolver getResourcePatternResolver(
|
||||||
|
ApplicationContext applicationContext) {
|
||||||
|
if (applicationContext instanceof WebApplicationContext) {
|
||||||
|
return new ServletContextResourcePatternResolver(
|
||||||
|
new WebApplicationContextResourceLoader(
|
||||||
|
(WebApplicationContext) applicationContext));
|
||||||
|
}
|
||||||
|
return super.getResourcePatternResolver(applicationContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link ResourceLoader} that optionally supports {@link ServletContextResource
|
||||||
|
* ServletContextResources}.
|
||||||
|
*/
|
||||||
|
private static class WebApplicationContextResourceLoader
|
||||||
|
extends DefaultResourceLoader {
|
||||||
|
|
||||||
|
private final WebApplicationContext applicationContext;
|
||||||
|
|
||||||
|
WebApplicationContextResourceLoader(WebApplicationContext applicationContext) {
|
||||||
|
this.applicationContext = applicationContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Resource getResourceByPath(String path) {
|
||||||
|
if (this.applicationContext.getServletContext() != null) {
|
||||||
|
return new ServletContextResource(
|
||||||
|
this.applicationContext.getServletContext(), path);
|
||||||
|
}
|
||||||
|
return super.getResourceByPath(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,6 +52,7 @@ import org.springframework.context.ConfigurableApplicationContext;
|
||||||
import org.springframework.context.support.GenericApplicationContext;
|
import org.springframework.context.support.GenericApplicationContext;
|
||||||
import org.springframework.core.ResolvableType;
|
import org.springframework.core.ResolvableType;
|
||||||
import org.springframework.core.annotation.AnnotationUtils;
|
import org.springframework.core.annotation.AnnotationUtils;
|
||||||
|
import org.springframework.core.io.ResourceLoader;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.util.ReflectionUtils;
|
import org.springframework.util.ReflectionUtils;
|
||||||
|
|
||||||
|
@ -433,8 +434,9 @@ public class Restarter {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void prepare(GenericApplicationContext applicationContext) {
|
private void prepare(GenericApplicationContext applicationContext) {
|
||||||
applicationContext.setResourceLoader(
|
ResourceLoader resourceLoader = new ClassLoaderFilesResourcePatternResolver(
|
||||||
new ClassLoaderFilesResourcePatternResolver(this.classLoaderFiles));
|
applicationContext, this.classLoaderFiles);
|
||||||
|
applicationContext.setResourceLoader(resourceLoader);
|
||||||
}
|
}
|
||||||
|
|
||||||
private LeakSafeThread getLeakSafeThread() {
|
private LeakSafeThread getLeakSafeThread() {
|
||||||
|
|
|
@ -20,7 +20,6 @@ import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.nio.ByteBuffer;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
|
@ -57,8 +56,6 @@ public class LiveReloadServerTests {
|
||||||
private static final String HANDSHAKE = "{command: 'hello', "
|
private static final String HANDSHAKE = "{command: 'hello', "
|
||||||
+ "protocols: ['http://livereload.com/protocols/official-7']}";
|
+ "protocols: ['http://livereload.com/protocols/official-7']}";
|
||||||
|
|
||||||
private static final ByteBuffer NO_DATA = ByteBuffer.allocate(0);
|
|
||||||
|
|
||||||
private int port = SocketUtils.findAvailableTcpPort();
|
private int port = SocketUtils.findAvailableTcpPort();
|
||||||
|
|
||||||
private MonitoredLiveReloadServer server;
|
private MonitoredLiveReloadServer server;
|
||||||
|
|
|
@ -0,0 +1,120 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2012-2016 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.devtools.restart;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Rule;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.rules.TemporaryFolder;
|
||||||
|
|
||||||
|
import org.springframework.boot.devtools.restart.ClassLoaderFilesResourcePatternResolver.DeletedClassLoaderFileResource;
|
||||||
|
import org.springframework.boot.devtools.restart.classloader.ClassLoaderFile;
|
||||||
|
import org.springframework.boot.devtools.restart.classloader.ClassLoaderFile.Kind;
|
||||||
|
import org.springframework.boot.devtools.restart.classloader.ClassLoaderFiles;
|
||||||
|
import org.springframework.context.support.GenericApplicationContext;
|
||||||
|
import org.springframework.core.io.ClassPathResource;
|
||||||
|
import org.springframework.core.io.Resource;
|
||||||
|
import org.springframework.mock.web.MockServletContext;
|
||||||
|
import org.springframework.util.FileCopyUtils;
|
||||||
|
import org.springframework.web.context.support.GenericWebApplicationContext;
|
||||||
|
import org.springframework.web.context.support.ServletContextResource;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests for {@link ClassLoaderFilesResourcePatternResolver}.
|
||||||
|
*
|
||||||
|
* @author Phillip Webb
|
||||||
|
*/
|
||||||
|
public class ClassLoaderFilesResourcePatternResolverTests {
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public TemporaryFolder temp = new TemporaryFolder();
|
||||||
|
|
||||||
|
private ClassLoaderFiles files;
|
||||||
|
|
||||||
|
private ClassLoaderFilesResourcePatternResolver resolver;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
this.files = new ClassLoaderFiles();
|
||||||
|
this.resolver = new ClassLoaderFilesResourcePatternResolver(
|
||||||
|
new GenericApplicationContext(), this.files);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getClassLoaderShouldReturnClassLoader() throws Exception {
|
||||||
|
assertThat(this.resolver.getClassLoader()).isNotNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getResourceShouldReturnResource() throws Exception {
|
||||||
|
Resource resource = this.resolver.getResource("index.html");
|
||||||
|
assertThat(resource).isNotNull().isInstanceOf(ClassPathResource.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getResourceWhenHasServeletContextShouldReturnServletResource()
|
||||||
|
throws Exception {
|
||||||
|
GenericWebApplicationContext context = new GenericWebApplicationContext(
|
||||||
|
new MockServletContext());
|
||||||
|
this.resolver = new ClassLoaderFilesResourcePatternResolver(context, this.files);
|
||||||
|
Resource resource = this.resolver.getResource("index.html");
|
||||||
|
assertThat(resource).isNotNull().isInstanceOf(ServletContextResource.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getResourceWhenDeletedShouldReturnDeletedResource() throws Exception {
|
||||||
|
File folder = this.temp.newFolder();
|
||||||
|
File file = createFile(folder, "name.class");
|
||||||
|
this.files.addFile(folder.getName(), "name.class",
|
||||||
|
new ClassLoaderFile(Kind.DELETED, null));
|
||||||
|
Resource resource = this.resolver.getResource("file:" + file.getAbsolutePath());
|
||||||
|
assertThat(resource).isNotNull()
|
||||||
|
.isInstanceOf(DeletedClassLoaderFileResource.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getResourcesShouldReturnResources() throws Exception {
|
||||||
|
File folder = this.temp.newFolder();
|
||||||
|
createFile(folder, "name.class");
|
||||||
|
Resource[] resources = this.resolver
|
||||||
|
.getResources("file:" + folder.getAbsolutePath() + "/**");
|
||||||
|
assertThat(resources).isNotEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getResourcesWhenDeletedShouldFilterDeleted() throws Exception {
|
||||||
|
File folder = this.temp.newFolder();
|
||||||
|
createFile(folder, "name.class");
|
||||||
|
this.files.addFile(folder.getName(), "name.class",
|
||||||
|
new ClassLoaderFile(Kind.DELETED, null));
|
||||||
|
Resource[] resources = this.resolver
|
||||||
|
.getResources("file:" + folder.getAbsolutePath() + "/**");
|
||||||
|
assertThat(resources).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
private File createFile(File folder, String name) throws IOException {
|
||||||
|
File file = new File(folder, name);
|
||||||
|
FileCopyUtils.copy("test".getBytes(), file);
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -42,6 +42,13 @@
|
||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!-- Provided -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-devtools</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<!-- Test -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-test</artifactId>
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
|
|
@ -38,6 +38,7 @@ import org.springframework.core.annotation.AnnotatedElementUtils;
|
||||||
import org.springframework.core.env.ConfigurableEnvironment;
|
import org.springframework.core.env.ConfigurableEnvironment;
|
||||||
import org.springframework.core.env.MapPropertySource;
|
import org.springframework.core.env.MapPropertySource;
|
||||||
import org.springframework.core.env.MutablePropertySources;
|
import org.springframework.core.env.MutablePropertySources;
|
||||||
|
import org.springframework.core.env.PropertySources;
|
||||||
import org.springframework.core.env.PropertySourcesPropertyResolver;
|
import org.springframework.core.env.PropertySourcesPropertyResolver;
|
||||||
import org.springframework.core.env.StandardEnvironment;
|
import org.springframework.core.env.StandardEnvironment;
|
||||||
import org.springframework.core.io.DefaultResourceLoader;
|
import org.springframework.core.io.DefaultResourceLoader;
|
||||||
|
@ -160,15 +161,21 @@ public class SpringBootContextLoader extends AbstractContextLoader {
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean hasCustomServerPort(List<String> properties) {
|
private boolean hasCustomServerPort(List<String> properties) {
|
||||||
Map<String, Object> props = TestPropertySourceUtils.convertInlinedPropertiesToMap(
|
PropertySources sources = convertToPropertySources(properties);
|
||||||
properties.toArray(new String[properties.size()]));
|
|
||||||
MutablePropertySources sources = new MutablePropertySources();
|
|
||||||
sources.addFirst(new MapPropertySource("inline", props));
|
|
||||||
RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
|
RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
|
||||||
new PropertySourcesPropertyResolver(sources), "server.");
|
new PropertySourcesPropertyResolver(sources), "server.");
|
||||||
return resolver.containsProperty("port");
|
return resolver.containsProperty("port");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private PropertySources convertToPropertySources(List<String> properties) {
|
||||||
|
Map<String, Object> source = TestPropertySourceUtils
|
||||||
|
.convertInlinedPropertiesToMap(
|
||||||
|
properties.toArray(new String[properties.size()]));
|
||||||
|
MutablePropertySources sources = new MutablePropertySources();
|
||||||
|
sources.addFirst(new MapPropertySource("inline", source));
|
||||||
|
return sources;
|
||||||
|
}
|
||||||
|
|
||||||
private List<ApplicationContextInitializer<?>> getInitializers(
|
private List<ApplicationContextInitializer<?>> getInitializers(
|
||||||
MergedContextConfiguration config, SpringApplication application) {
|
MergedContextConfiguration config, SpringApplication application) {
|
||||||
List<ApplicationContextInitializer<?>> initializers = new ArrayList<ApplicationContextInitializer<?>>();
|
List<ApplicationContextInitializer<?>> initializers = new ArrayList<ApplicationContextInitializer<?>>();
|
||||||
|
|
|
@ -27,8 +27,8 @@ import org.springframework.test.context.junit4.SpringRunner;
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test for {@link SpringBootTest} with a custom inline server.port in a non-embedded
|
* Test for {@link SpringBootTest} with a custom inline server.port in a non-embedded web
|
||||||
* web environment.
|
* environment.
|
||||||
*
|
*
|
||||||
* @author Stephane Nicoll
|
* @author Stephane Nicoll
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -38,7 +38,8 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||||
*/
|
*/
|
||||||
@RunWith(SpringRunner.class)
|
@RunWith(SpringRunner.class)
|
||||||
@DirtiesContext
|
@DirtiesContext
|
||||||
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = { "server.port=12345" })
|
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = {
|
||||||
|
"server.port=12345" })
|
||||||
public class SpringBootTestWebEnvironmentRandomPortCustomPortTests {
|
public class SpringBootTestWebEnvironmentRandomPortCustomPortTests {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
|
@ -55,4 +56,5 @@ public class SpringBootTestWebEnvironmentRandomPortCustomPortTests {
|
||||||
protected static class Config extends AbstractConfig {
|
protected static class Config extends AbstractConfig {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ import org.slf4j.LoggerFactory;
|
||||||
* to use the new Gradle Plugin Portal-compatible ID {@code org.springframework.boot}.
|
* to use the new Gradle Plugin Portal-compatible ID {@code org.springframework.boot}.
|
||||||
*
|
*
|
||||||
* @author Andy Wilkinson
|
* @author Andy Wilkinson
|
||||||
* @deprecated since 1.4.2 in favor of {@link SpringBootPlugin}
|
* @deprecated as of 1.4.2 in favor of {@link SpringBootPlugin}
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public class DeprecatedSpringBootPlugin extends SpringBootPlugin {
|
public class DeprecatedSpringBootPlugin extends SpringBootPlugin {
|
||||||
|
|
|
@ -554,7 +554,7 @@ public class TomcatEmbeddedServletContainerFactory
|
||||||
* A comma-separated list of jars to ignore for TLD scanning. See Tomcat's
|
* A comma-separated list of jars to ignore for TLD scanning. See Tomcat's
|
||||||
* catalina.properties for typical values. Defaults to a list drawn from that source.
|
* catalina.properties for typical values. Defaults to a list drawn from that source.
|
||||||
* @param tldSkip the jars to skip when scanning for TLDs etc
|
* @param tldSkip the jars to skip when scanning for TLDs etc
|
||||||
* @deprecated since 1.5.0 in favor of {@link #setTldSkipPatterns(Collection)}
|
* @deprecated as of 1.5 in favor of {@link #setTldSkipPatterns(Collection)}
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public void setTldSkip(String tldSkip) {
|
public void setTldSkip(String tldSkip) {
|
||||||
|
|
|
@ -29,7 +29,7 @@ import org.springframework.core.env.Environment;
|
||||||
* state too much at this early stage since it might be modified later in the lifecycle.
|
* state too much at this early stage since it might be modified later in the lifecycle.
|
||||||
*
|
*
|
||||||
* @author Dave Syer
|
* @author Dave Syer
|
||||||
* @deprecated since 1.5.0 in favor of {@link ApplicationStartingEvent}
|
* @deprecated as of 1.5 in favor of {@link ApplicationStartingEvent}
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
@SuppressWarnings("serial")
|
@SuppressWarnings("serial")
|
||||||
|
|
|
@ -97,6 +97,7 @@ public class LoggingApplicationListener implements GenericApplicationListener {
|
||||||
/**
|
/**
|
||||||
* The name of the Spring property that contains the directory where log files are
|
* The name of the Spring property that contains the directory where log files are
|
||||||
* written.
|
* written.
|
||||||
|
* @deprecated as of 1.5 in favor of {@link LogFile#PATH_PROPERTY}
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static final String PATH_PROPERTY = LogFile.PATH_PROPERTY;
|
public static final String PATH_PROPERTY = LogFile.PATH_PROPERTY;
|
||||||
|
@ -104,6 +105,7 @@ public class LoggingApplicationListener implements GenericApplicationListener {
|
||||||
/**
|
/**
|
||||||
* The name of the Spring property that contains the name of the log file. Names can
|
* The name of the Spring property that contains the name of the log file. Names can
|
||||||
* be an exact location or relative to the current directory.
|
* be an exact location or relative to the current directory.
|
||||||
|
* @deprecated as of 1.5 in favor of {@link LogFile#FILE_PROPERTY}
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static final String FILE_PROPERTY = LogFile.FILE_PROPERTY;
|
public static final String FILE_PROPERTY = LogFile.FILE_PROPERTY;
|
||||||
|
|
Loading…
Reference in New Issue