Commit a35a79e1 authored by Raphael von der Grün's avatar Raphael von der Grün Committed by Phillip Webb

Allow ANSI output to be configured by properties

Add AnsiOutputApplicationListener which configures AnsiOutput.enabled
based on a `spring.output.ansi.enabled` property.

Fixes gh-1243
parent 45c8eca4
...@@ -711,7 +711,10 @@ messages to the console you can start your application with a `--debug` flag. ...@@ -711,7 +711,10 @@ messages to the console you can start your application with a `--debug` flag.
$ java -jar myapp.jar --debug $ java -jar myapp.jar --debug
---- ----
If your terminal supports ANSI, color output will be used to aid readability. If your terminal supports ANSI, color output will be used to aid readability. You can set
`spring.output.ansi.enabled` to a
{dc-spring-boot}/ansi/AnsiOutput.Enabled.{dc-ext}[supported value] to override the auto
detection.
......
...@@ -48,6 +48,10 @@ public abstract class AnsiOutput { ...@@ -48,6 +48,10 @@ public abstract class AnsiOutput {
AnsiOutput.enabled = enabled; AnsiOutput.enabled = enabled;
} }
static Enabled getEnabled() {
return AnsiOutput.enabled;
}
/** /**
* Create a new ANSI string from the specified elements. Any {@link AnsiElement}s will * Create a new ANSI string from the specified elements. Any {@link AnsiElement}s will
* be encoded as required. * be encoded as required.
...@@ -121,8 +125,28 @@ public abstract class AnsiOutput { ...@@ -121,8 +125,28 @@ public abstract class AnsiOutput {
} }
} }
/**
* Possible values to pass to {@link AnsiOutput#setEnabled}. Determines when to output
* ANSI escape sequences for coloring application output.
*/
public static enum Enabled { public static enum Enabled {
DETECT, ALWAYS, NEVER
/**
* Try to detect whether ANSI coloring capabilities are available. The default
* value for {@link AnsiOutput}.
*/
DETECT,
/**
* Enable ANSI-colored output
*/
ALWAYS,
/**
* Disable ANSI-colored output
*/
NEVER
}; };
} }
/*
* Copyright 2012-2014 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.ansi;
import org.springframework.boot.ansi.AnsiOutput.Enabled;
import org.springframework.boot.bind.RelaxedPropertyResolver;
import org.springframework.boot.context.config.ConfigFileApplicationListener;
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.Ordered;
/**
* An {@link ApplicationListener} that configures {@link AnsiOutput} depending on the the
* value of the property <code>spring.output.ansi.enabled</code>. See
* {@link AnsiOutput.Enabled} for valid values.
*
* @author Raphael von der Grün
* @since 1.2.0
*/
public class AnsiOutputApplicationListener implements
ApplicationListener<ApplicationEnvironmentPreparedEvent>, Ordered {
@Override
public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
event.getEnvironment(), "spring.output.ansi.");
if (resolver.containsProperty("enabled")) {
String enabled = resolver.getProperty("enabled");
AnsiOutput.setEnabled(Enum.valueOf(Enabled.class, enabled.toUpperCase()));
}
}
@Override
public int getOrder() {
// Apply after the ConfigFileApplicationListener
return ConfigFileApplicationListener.DEFAULT_ORDER + 1;
}
}
...@@ -14,6 +14,7 @@ org.springframework.boot.context.config.DelegatingApplicationContextInitializer ...@@ -14,6 +14,7 @@ org.springframework.boot.context.config.DelegatingApplicationContextInitializer
# Application Listeners # Application Listeners
org.springframework.context.ApplicationListener=\ org.springframework.context.ApplicationListener=\
org.springframework.boot.ansi.AnsiOutputApplicationListener,\
org.springframework.boot.builder.ParentContextCloserApplicationListener,\ org.springframework.boot.builder.ParentContextCloserApplicationListener,\
org.springframework.boot.cloudfoundry.VcapApplicationListener,\ org.springframework.boot.cloudfoundry.VcapApplicationListener,\
org.springframework.boot.context.FileEncodingApplicationListener,\ org.springframework.boot.context.FileEncodingApplicationListener,\
...@@ -22,4 +23,3 @@ org.springframework.boot.context.config.DelegatingApplicationListener,\ ...@@ -22,4 +23,3 @@ org.springframework.boot.context.config.DelegatingApplicationListener,\
org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener,\ org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener,\
org.springframework.boot.logging.ClasspathLoggingApplicationListener,\ org.springframework.boot.logging.ClasspathLoggingApplicationListener,\
org.springframework.boot.logging.LoggingApplicationListener org.springframework.boot.logging.LoggingApplicationListener
/*
* Copyright 2012-2014 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.ansi;
import java.util.HashMap;
import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.ansi.AnsiOutput.Enabled;
import org.springframework.boot.test.EnvironmentTestUtils;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.StandardEnvironment;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
/**
* Tests for {@link AnsiOutputApplicationListener}.
*
* @author Phillip Webb
*/
public class AnsiOutputApplicationListenerTests {
@Before
@After
public void resetAnsi() {
AnsiOutput.setEnabled(Enabled.DETECT);
}
@Test
public void enabled() {
SpringApplication application = new SpringApplication(Config.class);
application.setWebEnvironment(false);
Map<String, Object> props = new HashMap<String, Object>();
props.put("spring.output.ansi.enabled", "ALWAYS");
application.setDefaultProperties(props);
application.run();
assertThat(AnsiOutput.getEnabled(), equalTo(Enabled.ALWAYS));
}
@Test
public void disabled() throws Exception {
SpringApplication application = new SpringApplication(Config.class);
application.setWebEnvironment(false);
Map<String, Object> props = new HashMap<String, Object>();
props.put("spring.output.ansi.enabled", "never");
application.setDefaultProperties(props);
application.run();
assertThat(AnsiOutput.getEnabled(), equalTo(Enabled.NEVER));
}
@Test
public void disabledViaApplcationProperties() throws Exception {
ConfigurableEnvironment environment = new StandardEnvironment();
EnvironmentTestUtils.addEnvironment(environment, "spring.config.name:ansi");
SpringApplication application = new SpringApplication(Config.class);
application.setWebEnvironment(false);
application.setEnvironment(environment);
application.run();
assertThat(AnsiOutput.getEnabled(), equalTo(Enabled.NEVER));
}
@Configuration
public static class Config {
}
}
spring.output.ansi.enabled=never
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment