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
This commit is contained in:
Raphael von der Grün 2014-07-20 00:43:38 +02:00 committed by Phillip Webb
parent 45c8eca4f2
commit a35a79e1a3
6 changed files with 169 additions and 3 deletions

View File

@ -711,7 +711,10 @@ messages to the console you can start your application with a `--debug` flag.
$ 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.

View File

@ -48,6 +48,10 @@ public abstract class AnsiOutput {
AnsiOutput.enabled = enabled;
}
static Enabled getEnabled() {
return AnsiOutput.enabled;
}
/**
* Create a new ANSI string from the specified elements. Any {@link AnsiElement}s will
* be encoded as required.
@ -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 {
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
};
}

View File

@ -0,0 +1,53 @@
/*
* 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;
}
}

View File

@ -14,6 +14,7 @@ org.springframework.boot.context.config.DelegatingApplicationContextInitializer
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.ansi.AnsiOutputApplicationListener,\
org.springframework.boot.builder.ParentContextCloserApplicationListener,\
org.springframework.boot.cloudfoundry.VcapApplicationListener,\
org.springframework.boot.context.FileEncodingApplicationListener,\
@ -22,4 +23,3 @@ org.springframework.boot.context.config.DelegatingApplicationListener,\
org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener,\
org.springframework.boot.logging.ClasspathLoggingApplicationListener,\
org.springframework.boot.logging.LoggingApplicationListener

View File

@ -0,0 +1,85 @@
/*
* 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 {
}
}

View File

@ -0,0 +1 @@
spring.output.ansi.enabled=never