Fix remote shell to support custom banners

Update the remote shell to use the `Banner` interface when possible.

Fixes gh-3988
Closes gh-5453
pull/5670/merge
cjstehno 9 years ago committed by Phillip Webb
parent b567959482
commit 309f8484a7

@ -0,0 +1,8 @@
,--. ,--.
\ /-~-\ /
)' a a `(
( ,---. )
`(_o_o_)'
)`-'(
Spring Boot${spring-boot.formatted-version}

@ -1,8 +1,25 @@
welcome = { -> welcome = { ->
if (!crash.context.attributes['spring.environment'].getProperty("spring.main.show_banner", Boolean.class, Boolean.TRUE)) {
def environment = crash.context.attributes['spring.environment']
def propertyResolver = new org.springframework.boot.bind.RelaxedPropertyResolver(environment, "spring.main.");
def beanFactory = crash.context.attributes['spring.beanfactory']
if (!propertyResolver.getProperty("show-banner", Boolean.class, Boolean.TRUE)) {
return "" return ""
} }
// Try to print using the banner interface
if (beanFactory != null) {
try {
def banner = beanFactory.getBean("springBootBanner")
def out = new java.io.ByteArrayOutputStream()
banner.printBanner(environment, null, new java.io.PrintStream(out))
return out.toString()
} catch (Exception ex) {
// Ignore
}
}
// Resolve hostname // Resolve hostname
def hostName; def hostName;
try { try {

@ -63,13 +63,13 @@ class SpringApplicationBannerPrinter {
catch (UnsupportedEncodingException ex) { catch (UnsupportedEncodingException ex) {
logger.warn("Failed to create String for banner", ex); logger.warn("Failed to create String for banner", ex);
} }
return banner; return new PrintedBanner(banner, sourceClass);
} }
public Banner print(Environment environment, Class<?> sourceClass, PrintStream out) { public Banner print(Environment environment, Class<?> sourceClass, PrintStream out) {
Banner banner = getBanner(environment, this.fallbackBanner); Banner banner = getBanner(environment, this.fallbackBanner);
banner.printBanner(environment, sourceClass, out); banner.printBanner(environment, sourceClass, out);
return banner; return new PrintedBanner(banner, sourceClass);
} }
private Banner getBanner(Environment environment, Banner definedBanner) { private Banner getBanner(Environment environment, Banner definedBanner) {
@ -145,4 +145,28 @@ class SpringApplicationBannerPrinter {
} }
/**
* Decorator that allows a {@link Banner} to be printed again without needing to
* specify the source class.
*/
private static class PrintedBanner implements Banner {
private final Banner banner;
private final Class<?> sourceClass;
PrintedBanner(Banner banner, Class<?> sourceClass) {
this.banner = banner;
this.sourceClass = sourceClass;
}
@Override
public void printBanner(Environment environment, Class<?> sourceClass,
PrintStream out) {
sourceClass = (sourceClass == null ? this.sourceClass : sourceClass);
this.banner.printBanner(environment, sourceClass, out);
}
}
} }

@ -21,14 +21,24 @@ import java.io.PrintStream;
import org.junit.After; import org.junit.After;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.boot.Banner.Mode; import org.springframework.boot.Banner.Mode;
import org.springframework.boot.testutil.InternalOutputCapture; import org.springframework.boot.testutil.InternalOutputCapture;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.test.util.ReflectionTestUtils;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
/** /**
* Tests for {@link Banner} and its usage by {@link SpringApplication}. * Tests for {@link Banner} and its usage by {@link SpringApplication}.
@ -37,6 +47,7 @@ import static org.assertj.core.api.Assertions.assertThat;
* @author Michael Stummvoll * @author Michael Stummvoll
* @author Michael Simons * @author Michael Simons
*/ */
@RunWith(MockitoJUnitRunner.class)
public class BannerTests { public class BannerTests {
private ConfigurableApplicationContext context; private ConfigurableApplicationContext context;
@ -51,6 +62,9 @@ public class BannerTests {
@Rule @Rule
public InternalOutputCapture out = new InternalOutputCapture(); public InternalOutputCapture out = new InternalOutputCapture();
@Captor
private ArgumentCaptor<Class<?>> sourceClassCaptor;
@Test @Test
public void testDefaultBanner() throws Exception { public void testDefaultBanner() throws Exception {
SpringApplication application = new SpringApplication(Config.class); SpringApplication application = new SpringApplication(Config.class);
@ -88,10 +102,18 @@ public class BannerTests {
public void testCustomBannerInContext() throws Exception { public void testCustomBannerInContext() throws Exception {
SpringApplication application = new SpringApplication(Config.class); SpringApplication application = new SpringApplication(Config.class);
application.setWebEnvironment(false); application.setWebEnvironment(false);
final DummyBanner dummyBanner = new DummyBanner(); Banner banner = mock(Banner.class);
application.setBanner(dummyBanner); application.setBanner(banner);
this.context = application.run(); this.context = application.run();
assertThat(this.context.getBean("springBootBanner")).isEqualTo(dummyBanner); Banner printedBanner = (Banner) this.context.getBean("springBootBanner");
assertThat(ReflectionTestUtils.getField(printedBanner, "banner"))
.isEqualTo(banner);
verify(banner).printBanner(any(Environment.class),
this.sourceClassCaptor.capture(), any(PrintStream.class));
reset(banner);
printedBanner.printBanner(this.context.getEnvironment(), null, System.out);
verify(banner).printBanner(any(Environment.class),
eq(this.sourceClassCaptor.getValue()), any(PrintStream.class));
} }
@Test @Test

Loading…
Cancel
Save