parent
							
								
									65a27ef6d6
								
							
						
					
					
						commit
						7f79c26b6b
					
				| 
						 | 
				
			
			@ -28,7 +28,6 @@ import java.util.Map;
 | 
			
		|||
import org.apache.commons.logging.Log;
 | 
			
		||||
import org.apache.commons.logging.LogFactory;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.ansi.Ansi256PropertySource;
 | 
			
		||||
import org.springframework.boot.ansi.AnsiPropertySource;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.core.env.MapPropertySource;
 | 
			
		||||
| 
						 | 
				
			
			@ -82,7 +81,6 @@ public class ResourceBanner implements Banner {
 | 
			
		|||
		resolvers.add(environment);
 | 
			
		||||
		resolvers.add(getVersionResolver(sourceClass));
 | 
			
		||||
		resolvers.add(getAnsiResolver());
 | 
			
		||||
		resolvers.add(getAnsi256Resolver());
 | 
			
		||||
		resolvers.add(getTitleResolver(sourceClass));
 | 
			
		||||
		return resolvers;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -126,12 +124,6 @@ public class ResourceBanner implements Banner {
 | 
			
		|||
		return new PropertySourcesPropertyResolver(sources);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private PropertyResolver getAnsi256Resolver() {
 | 
			
		||||
		MutablePropertySources sources = new MutablePropertySources();
 | 
			
		||||
		sources.addFirst(new Ansi256PropertySource("ansi256"));
 | 
			
		||||
		return new PropertySourcesPropertyResolver(sources);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private PropertyResolver getTitleResolver(Class<?> sourceClass) {
 | 
			
		||||
		MutablePropertySources sources = new MutablePropertySources();
 | 
			
		||||
		String applicationTitle = getApplicationTitle(sourceClass);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,84 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2019 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
 | 
			
		||||
 *
 | 
			
		||||
 *      https://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;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * {@link AnsiElement} implementation for Ansi 256 colors.
 | 
			
		||||
 * <p>
 | 
			
		||||
 * use {@link Ansi256Color.Foreground} or {@link Ansi256Color.Background} as a concrete
 | 
			
		||||
 * class.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Toshiaki Maki
 | 
			
		||||
 * @since 2.2.0
 | 
			
		||||
 */
 | 
			
		||||
public abstract class Ansi256Color implements AnsiElement {
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * color code
 | 
			
		||||
	 */
 | 
			
		||||
	final int colorCode;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param colorCode color code (must be 0-255)
 | 
			
		||||
	 * @throws IllegalArgumentException if color code is not between 0 and 255.
 | 
			
		||||
	 */
 | 
			
		||||
	Ansi256Color(int colorCode) {
 | 
			
		||||
		if (colorCode < 0 || colorCode > 255) {
 | 
			
		||||
			throw new IllegalArgumentException("'colorCode' must be between 0 and 255.");
 | 
			
		||||
		}
 | 
			
		||||
		this.colorCode = colorCode;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * {@link Ansi256Color} foreground colors.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @author Toshiaki Maki
 | 
			
		||||
	 * @since 2.2.0
 | 
			
		||||
	 */
 | 
			
		||||
	public static class Foreground extends Ansi256Color {
 | 
			
		||||
 | 
			
		||||
		public Foreground(int colorCode) {
 | 
			
		||||
			super(colorCode);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
		public String toString() {
 | 
			
		||||
			return "38;5;" + super.colorCode;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * {@link Ansi256Color} background colors.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @author Toshiaki Maki
 | 
			
		||||
	 * @since 2.2.0
 | 
			
		||||
	 */
 | 
			
		||||
	public static class Background extends Ansi256Color {
 | 
			
		||||
 | 
			
		||||
		public Background(int colorCode) {
 | 
			
		||||
			super(colorCode);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
		public String toString() {
 | 
			
		||||
			return "48;5;" + super.colorCode;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,63 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2019 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
 | 
			
		||||
 *
 | 
			
		||||
 *      https://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.core.env.PropertyResolver;
 | 
			
		||||
import org.springframework.core.env.PropertySource;
 | 
			
		||||
import org.springframework.util.StringUtils;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * {@link PropertyResolver} for {@link Ansi256Color.Background} and
 | 
			
		||||
 * {@link Ansi256Color.Foreground} elements. Supports properties of the form
 | 
			
		||||
 * {@code Ansi256Color.Foreground_N} and {@code Ansi256Color.Background_N} ({@code N} must
 | 
			
		||||
 * be between 0 and 255).
 | 
			
		||||
 *
 | 
			
		||||
 * @author Toshiaki Maki
 | 
			
		||||
 * @since 2.2.0
 | 
			
		||||
 */
 | 
			
		||||
public class Ansi256PropertySource extends PropertySource<AnsiElement> {
 | 
			
		||||
 | 
			
		||||
	private static final String PREFIX = "Ansi256Color.";
 | 
			
		||||
 | 
			
		||||
	private static final String FOREGROUND_PREFIX = PREFIX + "Foreground_";
 | 
			
		||||
 | 
			
		||||
	private static final String BACKGROUND_PREFIX = PREFIX + "Background_";
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Create a new {@link Ansi256PropertySource} instance.
 | 
			
		||||
	 * @param name the name of the property source
 | 
			
		||||
	 */
 | 
			
		||||
	public Ansi256PropertySource(String name) {
 | 
			
		||||
		super(name);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Object getProperty(String name) {
 | 
			
		||||
		if (StringUtils.hasLength(name)) {
 | 
			
		||||
			if (name.startsWith(FOREGROUND_PREFIX)) {
 | 
			
		||||
				final int colorCode = Integer.parseInt(name.substring(FOREGROUND_PREFIX.length()));
 | 
			
		||||
				return AnsiOutput.encode(new Ansi256Color.Foreground(colorCode));
 | 
			
		||||
			}
 | 
			
		||||
			else if (name.startsWith(BACKGROUND_PREFIX)) {
 | 
			
		||||
				final int colorCode = Integer.parseInt(name.substring(BACKGROUND_PREFIX.length()));
 | 
			
		||||
				return AnsiOutput.encode(new Ansi256Color.Background(colorCode));
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,88 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2019 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
 | 
			
		||||
 *
 | 
			
		||||
 *      https://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.util.Assert;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * {@link AnsiElement} implementation for ANSI 8-bit foreground or background color codes.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Toshiaki Maki
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @since 2.2.0
 | 
			
		||||
 * @see #foreground(int)
 | 
			
		||||
 * @see #background(int)
 | 
			
		||||
 */
 | 
			
		||||
public final class Ansi8BitColor implements AnsiElement {
 | 
			
		||||
 | 
			
		||||
	private final String prefix;
 | 
			
		||||
 | 
			
		||||
	private final int code;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Create a new {@link Ansi8BitColor} instance.
 | 
			
		||||
	 * @param prefix the prefix escape chars
 | 
			
		||||
	 * @param code color code (must be 0-255)
 | 
			
		||||
	 * @throws IllegalArgumentException if color code is not between 0 and 255.
 | 
			
		||||
	 */
 | 
			
		||||
	private Ansi8BitColor(String prefix, int code) {
 | 
			
		||||
		Assert.isTrue(code >= 0 && code <= 255, "Code must be between 0 and 255");
 | 
			
		||||
		this.prefix = prefix;
 | 
			
		||||
		this.code = code;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean equals(Object obj) {
 | 
			
		||||
		if (this == obj) {
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
		if (obj == null || getClass() != obj.getClass()) {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		Ansi8BitColor other = (Ansi8BitColor) obj;
 | 
			
		||||
		return this.prefix.equals(other.prefix) && this.code == other.code;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public int hashCode() {
 | 
			
		||||
		return this.prefix.hashCode() * 31 + this.code;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		return this.prefix + this.code;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Return a foreground ANSI color code instance for the given code.
 | 
			
		||||
	 * @param code the color code
 | 
			
		||||
	 * @return an ANSI color code instance
 | 
			
		||||
	 */
 | 
			
		||||
	public static Ansi8BitColor foreground(int code) {
 | 
			
		||||
		return new Ansi8BitColor("38;5;", code);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Return a background ANSI color code instance for the given code.
 | 
			
		||||
	 * @param code the color code
 | 
			
		||||
	 * @return an ANSI color code instance
 | 
			
		||||
	 */
 | 
			
		||||
	public static Ansi8BitColor background(int code) {
 | 
			
		||||
		return new Ansi8BitColor("48;5;", code);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -21,34 +21,43 @@ import java.util.Collections;
 | 
			
		|||
import java.util.EnumSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.function.IntFunction;
 | 
			
		||||
 | 
			
		||||
import org.springframework.core.env.PropertyResolver;
 | 
			
		||||
import org.springframework.core.env.PropertySource;
 | 
			
		||||
import org.springframework.util.StringUtils;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * {@link PropertyResolver} for {@link AnsiStyle}, {@link AnsiColor} and
 | 
			
		||||
 * {@link AnsiBackground} elements. Supports properties of the form
 | 
			
		||||
 * {@code AnsiStyle.BOLD}, {@code AnsiColor.RED} or {@code AnsiBackground.GREEN}. Also
 | 
			
		||||
 * supports a prefix of {@code Ansi.} which is an aggregation of everything (with
 | 
			
		||||
 * {@link PropertyResolver} for {@link AnsiStyle}, {@link AnsiColor},
 | 
			
		||||
 * {@link AnsiBackground} and {@link Ansi8BitColor} elements. Supports properties of the
 | 
			
		||||
 * form {@code AnsiStyle.BOLD}, {@code AnsiColor.RED} or {@code AnsiBackground.GREEN}.
 | 
			
		||||
 * Also supports a prefix of {@code Ansi.} which is an aggregation of everything (with
 | 
			
		||||
 * background colors prefixed {@code BG_}).
 | 
			
		||||
 * <p>
 | 
			
		||||
 * ANSI 8-bit color codes can be used with {@code AnsiColor} and {@code AnsiBackground}.
 | 
			
		||||
 * For example, {@code AnsiColor.208} will render orange text.
 | 
			
		||||
 * <a href="https://en.wikipedia.org/wiki/ANSI_escape_code">Wikipedia</a> has a complete
 | 
			
		||||
 * list of the 8-bit color codes that can be used.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @author Toshiaki Maki
 | 
			
		||||
 * @since 1.3.0
 | 
			
		||||
 */
 | 
			
		||||
public class AnsiPropertySource extends PropertySource<AnsiElement> {
 | 
			
		||||
 | 
			
		||||
	private static final Iterable<MappedEnum<?>> MAPPED_ENUMS;
 | 
			
		||||
	private static final Iterable<Mapping> MAPPINGS;
 | 
			
		||||
 | 
			
		||||
	static {
 | 
			
		||||
		List<MappedEnum<?>> enums = new ArrayList<>();
 | 
			
		||||
		enums.add(new MappedEnum<>("AnsiStyle.", AnsiStyle.class));
 | 
			
		||||
		enums.add(new MappedEnum<>("AnsiColor.", AnsiColor.class));
 | 
			
		||||
		enums.add(new MappedEnum<>("AnsiBackground.", AnsiBackground.class));
 | 
			
		||||
		enums.add(new MappedEnum<>("Ansi.", AnsiStyle.class));
 | 
			
		||||
		enums.add(new MappedEnum<>("Ansi.", AnsiColor.class));
 | 
			
		||||
		enums.add(new MappedEnum<>("Ansi.BG_", AnsiBackground.class));
 | 
			
		||||
		MAPPED_ENUMS = Collections.unmodifiableList(enums);
 | 
			
		||||
		List<Mapping> mappings = new ArrayList<>();
 | 
			
		||||
		mappings.add(new EnumMapping<>("AnsiStyle.", AnsiStyle.class));
 | 
			
		||||
		mappings.add(new EnumMapping<>("AnsiColor.", AnsiColor.class));
 | 
			
		||||
		mappings.add(new Ansi8BitColorMapping("AnsiColor.", Ansi8BitColor::foreground));
 | 
			
		||||
		mappings.add(new EnumMapping<>("AnsiBackground.", AnsiBackground.class));
 | 
			
		||||
		mappings.add(new Ansi8BitColorMapping("AnsiBackground.", Ansi8BitColor::background));
 | 
			
		||||
		mappings.add(new EnumMapping<>("Ansi.", AnsiStyle.class));
 | 
			
		||||
		mappings.add(new EnumMapping<>("Ansi.", AnsiColor.class));
 | 
			
		||||
		mappings.add(new EnumMapping<>("Ansi.BG_", AnsiBackground.class));
 | 
			
		||||
		MAPPINGS = Collections.unmodifiableList(mappings);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private final boolean encode;
 | 
			
		||||
| 
						 | 
				
			
			@ -66,16 +75,13 @@ public class AnsiPropertySource extends PropertySource<AnsiElement> {
 | 
			
		|||
	@Override
 | 
			
		||||
	public Object getProperty(String name) {
 | 
			
		||||
		if (StringUtils.hasLength(name)) {
 | 
			
		||||
			for (MappedEnum<?> mappedEnum : MAPPED_ENUMS) {
 | 
			
		||||
				if (name.startsWith(mappedEnum.getPrefix())) {
 | 
			
		||||
					String enumName = name.substring(mappedEnum.getPrefix().length());
 | 
			
		||||
					for (Enum<?> ansiEnum : mappedEnum.getEnums()) {
 | 
			
		||||
						if (ansiEnum.name().equals(enumName)) {
 | 
			
		||||
							if (this.encode) {
 | 
			
		||||
								return AnsiOutput.encode((AnsiElement) ansiEnum);
 | 
			
		||||
							}
 | 
			
		||||
							return ansiEnum;
 | 
			
		||||
						}
 | 
			
		||||
			for (Mapping mapping : MAPPINGS) {
 | 
			
		||||
				String prefix = mapping.getPrefix();
 | 
			
		||||
				if (name.startsWith(prefix)) {
 | 
			
		||||
					String postfix = name.substring(prefix.length());
 | 
			
		||||
					AnsiElement element = mapping.getElement(postfix);
 | 
			
		||||
					if (element != null) {
 | 
			
		||||
						return (this.encode) ? AnsiOutput.encode(element) : element;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -84,26 +90,79 @@ public class AnsiPropertySource extends PropertySource<AnsiElement> {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Mapping between an enum and the pseudo property source.
 | 
			
		||||
	 * Mapping between a name and the pseudo property source.
 | 
			
		||||
	 */
 | 
			
		||||
	private static class MappedEnum<E extends Enum<E>> {
 | 
			
		||||
	private abstract static class Mapping {
 | 
			
		||||
 | 
			
		||||
		private final String prefix;
 | 
			
		||||
 | 
			
		||||
		private final Set<E> enums;
 | 
			
		||||
 | 
			
		||||
		MappedEnum(String prefix, Class<E> enumType) {
 | 
			
		||||
		Mapping(String prefix) {
 | 
			
		||||
			this.prefix = prefix;
 | 
			
		||||
			this.enums = EnumSet.allOf(enumType);
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		String getPrefix() {
 | 
			
		||||
			return this.prefix;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		Set<E> getEnums() {
 | 
			
		||||
			return this.enums;
 | 
			
		||||
		abstract AnsiElement getElement(String postfix);
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * {@link Mapping} for {@link AnsiElement} enums.
 | 
			
		||||
	 */
 | 
			
		||||
	private static class EnumMapping<E extends Enum<E> & AnsiElement> extends Mapping {
 | 
			
		||||
 | 
			
		||||
		private final Set<E> enums;
 | 
			
		||||
 | 
			
		||||
		EnumMapping(String prefix, Class<E> enumType) {
 | 
			
		||||
			super(prefix);
 | 
			
		||||
			this.enums = EnumSet.allOf(enumType);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
		AnsiElement getElement(String postfix) {
 | 
			
		||||
			for (Enum<?> candidate : this.enums) {
 | 
			
		||||
				if (candidate.name().equals(postfix)) {
 | 
			
		||||
					return (AnsiElement) candidate;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * {@link Mapping} for {@link Ansi8BitColor}.
 | 
			
		||||
	 */
 | 
			
		||||
	private static class Ansi8BitColorMapping extends Mapping {
 | 
			
		||||
 | 
			
		||||
		private final IntFunction<Ansi8BitColor> factory;
 | 
			
		||||
 | 
			
		||||
		Ansi8BitColorMapping(String prefix, IntFunction<Ansi8BitColor> factory) {
 | 
			
		||||
			super(prefix);
 | 
			
		||||
			this.factory = factory;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
		AnsiElement getElement(String postfix) {
 | 
			
		||||
			if (containsOnlyDigits(postfix)) {
 | 
			
		||||
				try {
 | 
			
		||||
					return this.factory.apply(Integer.parseInt(postfix));
 | 
			
		||||
				}
 | 
			
		||||
				catch (IllegalArgumentException ex) {
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private boolean containsOnlyDigits(String postfix) {
 | 
			
		||||
			for (int i = 0; i < postfix.length(); i++) {
 | 
			
		||||
				if (!Character.isDigit(postfix.charAt(i))) {
 | 
			
		||||
					return false;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			return postfix.length() > 0;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,6 +47,12 @@
 | 
			
		|||
      "description": "Whether images should be inverted for dark terminal themes.",
 | 
			
		||||
      "defaultValue": false
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "spring.banner.image.bitdepth",
 | 
			
		||||
      "type": "java.lang.Integer",
 | 
			
		||||
      "description": "The bit depth to use for ANSI colors. Supported values are 4 (16 color) or 8 (256 color).",
 | 
			
		||||
      "defaultValue": 4
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "debug",
 | 
			
		||||
      "type": "java.lang.Boolean",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,6 +23,7 @@ import org.junit.jupiter.api.AfterEach;
 | 
			
		|||
import org.junit.jupiter.api.BeforeEach;
 | 
			
		||||
import org.junit.jupiter.api.Test;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.ansi.Ansi8BitColor;
 | 
			
		||||
import org.springframework.boot.ansi.AnsiBackground;
 | 
			
		||||
import org.springframework.boot.ansi.AnsiColor;
 | 
			
		||||
import org.springframework.boot.ansi.AnsiOutput;
 | 
			
		||||
| 
						 | 
				
			
			@ -168,6 +169,16 @@ class ImageBannerTests {
 | 
			
		|||
		assertThat(lines).hasSize(frames * linesPerFrame - 1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	void printBannerWhenBitDepthIs8ShouldUseColors() {
 | 
			
		||||
		String banner = printBanner("colors.gif", "spring.banner.image.bitdepth=8");
 | 
			
		||||
		assertThat(banner.contains(AnsiOutput.encode(Ansi8BitColor.foreground(124))));
 | 
			
		||||
		assertThat(banner.contains(AnsiOutput.encode(Ansi8BitColor.foreground(130))));
 | 
			
		||||
		assertThat(banner.contains(AnsiOutput.encode(Ansi8BitColor.foreground(19))));
 | 
			
		||||
		assertThat(banner.contains(AnsiOutput.encode(Ansi8BitColor.foreground(127))));
 | 
			
		||||
		assertThat(banner.contains(AnsiOutput.encode(Ansi8BitColor.foreground(37))));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private int getBannerHeight(String banner) {
 | 
			
		||||
		return banner.split(System.lineSeparator()).length - 3;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -98,8 +98,7 @@ class ResourceBannerTests {
 | 
			
		|||
 | 
			
		||||
	@Test
 | 
			
		||||
	void renderWith256Colors() {
 | 
			
		||||
		Resource resource = new ByteArrayResource(
 | 
			
		||||
				"${Ansi256Color.Foreground_208}This is orange.${Ansi.NORMAL}".getBytes());
 | 
			
		||||
		Resource resource = new ByteArrayResource("${AnsiColor.208}This is orange.${Ansi.NORMAL}".getBytes());
 | 
			
		||||
		AnsiOutput.setEnabled(AnsiOutput.Enabled.ALWAYS);
 | 
			
		||||
		String banner = printBanner(resource, null, null, null);
 | 
			
		||||
		assertThat(banner).startsWith("\033[38;5;208mThis is orange.\u001B[0m");
 | 
			
		||||
| 
						 | 
				
			
			@ -107,8 +106,7 @@ class ResourceBannerTests {
 | 
			
		|||
 | 
			
		||||
	@Test
 | 
			
		||||
	void renderWith256ColorsButDisabled() {
 | 
			
		||||
		Resource resource = new ByteArrayResource(
 | 
			
		||||
				"${Ansi256Color.Foreground_208}This is orange.${Ansi.NORMAL}".getBytes());
 | 
			
		||||
		Resource resource = new ByteArrayResource("${AnsiColor.208}This is orange.${Ansi.NORMAL}".getBytes());
 | 
			
		||||
		AnsiOutput.setEnabled(AnsiOutput.Enabled.NEVER);
 | 
			
		||||
		String banner = printBanner(resource, null, null, null);
 | 
			
		||||
		assertThat(banner).startsWith("This is orange.");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,54 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2019 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
 | 
			
		||||
 *
 | 
			
		||||
 *      https://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.junit.jupiter.api.Test;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests for {@link Ansi256Color}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Toshiaki Maki
 | 
			
		||||
 */
 | 
			
		||||
class Ansi256ColorTest {
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	void testForeground() {
 | 
			
		||||
		final Ansi256Color ansi256Color = new Ansi256Color.Foreground(208);
 | 
			
		||||
		assertThat(ansi256Color.toString()).isEqualTo("38;5;208");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	void testBackground() {
 | 
			
		||||
		final Ansi256Color ansi256Color = new Ansi256Color.Background(208);
 | 
			
		||||
		assertThat(ansi256Color.toString()).isEqualTo("48;5;208");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	void testIllegalColorCode() {
 | 
			
		||||
		try {
 | 
			
		||||
			new Ansi256Color.Foreground(256);
 | 
			
		||||
			failBecauseExceptionWasNotThrown(IllegalArgumentException.class);
 | 
			
		||||
		}
 | 
			
		||||
		catch (IllegalArgumentException ex) {
 | 
			
		||||
			assertThat(ex.getMessage()).isEqualTo("'colorCode' must be between 0 and 255.");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,59 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2019 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
 | 
			
		||||
 *
 | 
			
		||||
 *      https://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.junit.jupiter.api.AfterEach;
 | 
			
		||||
import org.junit.jupiter.api.Test;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests for {@link Ansi256PropertySource}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Toshiaki Maki
 | 
			
		||||
 */
 | 
			
		||||
class Ansi256PropertySourceTest {
 | 
			
		||||
 | 
			
		||||
	private Ansi256PropertySource source = new Ansi256PropertySource("ansi256");
 | 
			
		||||
 | 
			
		||||
	@AfterEach
 | 
			
		||||
	void reset() {
 | 
			
		||||
		AnsiOutput.setEnabled(AnsiOutput.Enabled.DETECT);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	void getPropertyShouldConvertAnsi256ColorForeground() {
 | 
			
		||||
		AnsiOutput.setEnabled(AnsiOutput.Enabled.ALWAYS);
 | 
			
		||||
		final Object property = this.source.getProperty("Ansi256Color.Foreground_100");
 | 
			
		||||
		assertThat(property).isEqualTo("\033[38;5;100m");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	void getPropertyShouldConvertAnsi256ColorBackground() {
 | 
			
		||||
		AnsiOutput.setEnabled(AnsiOutput.Enabled.ALWAYS);
 | 
			
		||||
		final Object property = this.source.getProperty("Ansi256Color.Background_100");
 | 
			
		||||
		assertThat(property).isEqualTo("\033[48;5;100m");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	void getMissingPropertyShouldReturnNull() {
 | 
			
		||||
		AnsiOutput.setEnabled(AnsiOutput.Enabled.ALWAYS);
 | 
			
		||||
		final Object property = this.source.getProperty("Ansi256Color.ForeGround_100");
 | 
			
		||||
		assertThat(property).isNull();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,67 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2019 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
 | 
			
		||||
 *
 | 
			
		||||
 *      https://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.junit.jupiter.api.Test;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Tests for {@link Ansi8BitColor}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Toshiaki Maki
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 */
 | 
			
		||||
class Ansi8BitColorTests {
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	void toStringWhenForegroundAddsCorrectPrefix() {
 | 
			
		||||
		assertThat(Ansi8BitColor.foreground(208).toString()).isEqualTo("38;5;208");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	void toStringWhenBackgroundAddsCorrectPrefix() {
 | 
			
		||||
		assertThat(Ansi8BitColor.background(208).toString()).isEqualTo("48;5;208");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	void forgroundWhenOutsideBoundsThrowsException() {
 | 
			
		||||
		assertThatIllegalArgumentException().isThrownBy(() -> Ansi8BitColor.foreground(-1))
 | 
			
		||||
				.withMessage("Code must be between 0 and 255");
 | 
			
		||||
		assertThatIllegalArgumentException().isThrownBy(() -> Ansi8BitColor.foreground(256))
 | 
			
		||||
				.withMessage("Code must be between 0 and 255");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	void backgroundWhenOutsideBoundsThrowsException() {
 | 
			
		||||
		assertThatIllegalArgumentException().isThrownBy(() -> Ansi8BitColor.background(-1))
 | 
			
		||||
				.withMessage("Code must be between 0 and 255");
 | 
			
		||||
		assertThatIllegalArgumentException().isThrownBy(() -> Ansi8BitColor.background(256))
 | 
			
		||||
				.withMessage("Code must be between 0 and 255");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	void equalsAndHashCode() {
 | 
			
		||||
		Ansi8BitColor one = Ansi8BitColor.foreground(123);
 | 
			
		||||
		Ansi8BitColor two = Ansi8BitColor.foreground(123);
 | 
			
		||||
		Ansi8BitColor three = Ansi8BitColor.background(123);
 | 
			
		||||
		assertThat(one.hashCode()).isEqualTo(two.hashCode());
 | 
			
		||||
		assertThat(one).isEqualTo(one).isEqualTo(two).isNotEqualTo(three).isNotEqualTo(null).isNotEqualTo("foo");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -27,6 +27,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		|||
 * Tests for {@link AnsiPropertySource}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @author Toshiaki Maki
 | 
			
		||||
 */
 | 
			
		||||
class AnsiPropertySourceTests {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -45,11 +46,13 @@ class AnsiPropertySourceTests {
 | 
			
		|||
	@Test
 | 
			
		||||
	void getAnsiColor() {
 | 
			
		||||
		assertThat(this.source.getProperty("AnsiColor.RED")).isEqualTo(AnsiColor.RED);
 | 
			
		||||
		assertThat(this.source.getProperty("AnsiColor.100")).isEqualTo(Ansi8BitColor.foreground(100));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	void getAnsiBackground() {
 | 
			
		||||
		assertThat(this.source.getProperty("AnsiBackground.GREEN")).isEqualTo(AnsiBackground.GREEN);
 | 
			
		||||
		assertThat(this.source.getProperty("AnsiBackground.100")).isEqualTo(Ansi8BitColor.background(100));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
| 
						 | 
				
			
			@ -69,6 +72,8 @@ class AnsiPropertySourceTests {
 | 
			
		|||
		AnsiOutput.setEnabled(Enabled.ALWAYS);
 | 
			
		||||
		AnsiPropertySource source = new AnsiPropertySource("ansi", true);
 | 
			
		||||
		assertThat(source.getProperty("Ansi.RED")).isEqualTo("\033[31m");
 | 
			
		||||
		assertThat(source.getProperty("AnsiColor.100")).isEqualTo("\033[38;5;100m");
 | 
			
		||||
		assertThat(source.getProperty("AnsiBackground.100")).isEqualTo("\033[48;5;100m");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
| 
						 | 
				
			
			@ -76,6 +81,8 @@ class AnsiPropertySourceTests {
 | 
			
		|||
		AnsiOutput.setEnabled(Enabled.NEVER);
 | 
			
		||||
		AnsiPropertySource source = new AnsiPropertySource("ansi", true);
 | 
			
		||||
		assertThat(source.getProperty("Ansi.RED")).isEqualTo("");
 | 
			
		||||
		assertThat(source.getProperty("AnsiColor.100")).isEqualTo("");
 | 
			
		||||
		assertThat(source.getProperty("AnsiBackground.100")).isEqualTo("");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue