ResourceBanner Class — spring-boot Architecture
Architecture documentation for the ResourceBanner class in ResourceBanner.java from the spring-boot codebase.
Entity Profile
Relationship Graph
Source Code
core/spring-boot/src/main/java/org/springframework/boot/ResourceBanner.java lines 57–195
public class ResourceBanner implements Banner {
private static final Log logger = LogFactory.getLog(ResourceBanner.class);
private final Resource resource;
public ResourceBanner(Resource resource) {
Assert.notNull(resource, "'resource' must not be null");
Assert.isTrue(resource.exists(), "'resource' must exist");
this.resource = resource;
}
@Override
public void printBanner(Environment environment, @Nullable Class<?> sourceClass, PrintStream out) {
try (InputStream input = this.resource.getInputStream()) {
String banner = StreamUtils.copyToString(input,
environment.getProperty("spring.banner.charset", Charset.class, StandardCharsets.UTF_8));
for (PropertyResolver resolver : getPropertyResolvers(environment, sourceClass)) {
banner = resolver.resolvePlaceholders(banner);
}
out.println(banner);
}
catch (Exception ex) {
logger.warn(LogMessage.format("Banner not printable: %s (%s: '%s')", this.resource, ex.getClass(),
ex.getMessage()), ex);
}
}
/**
* Return a mutable list of the {@link PropertyResolver} instances that will be used
* to resolve placeholders.
* @param environment the environment
* @param sourceClass the source class
* @return a mutable list of property resolvers
*/
protected List<PropertyResolver> getPropertyResolvers(Environment environment, @Nullable Class<?> sourceClass) {
List<PropertyResolver> resolvers = new ArrayList<>();
resolvers.add(new PropertySourcesPropertyResolver(createNullDefaultSources(environment, sourceClass)));
resolvers.add(new PropertySourcesPropertyResolver(createEmptyDefaultSources(environment, sourceClass)));
return resolvers;
}
private MutablePropertySources createNullDefaultSources(Environment environment, @Nullable Class<?> sourceClass) {
MutablePropertySources nullDefaultSources = new MutablePropertySources();
if (environment instanceof ConfigurableEnvironment configurableEnvironment) {
configurableEnvironment.getPropertySources().forEach(nullDefaultSources::addLast);
}
nullDefaultSources.addLast(getTitleSource(sourceClass, null));
nullDefaultSources.addLast(getAnsiSource());
nullDefaultSources.addLast(getVersionSource(environment, null));
return nullDefaultSources;
}
private MutablePropertySources createEmptyDefaultSources(Environment environment, @Nullable Class<?> sourceClass) {
MutablePropertySources emptyDefaultSources = new MutablePropertySources();
emptyDefaultSources.addLast(getTitleSource(sourceClass, ""));
emptyDefaultSources.addLast(getVersionSource(environment, ""));
return emptyDefaultSources;
}
private MapWithNullsPropertySource getTitleSource(@Nullable Class<?> sourceClass, @Nullable String defaultValue) {
String applicationTitle = getApplicationTitle(sourceClass);
Map<String, @Nullable Object> titleMap = Collections.singletonMap("application.title",
(applicationTitle != null) ? applicationTitle : defaultValue);
return new MapWithNullsPropertySource("title", titleMap);
}
/**
* Return the application title that should be used for the source class. By default
* will use {@link Package#getImplementationTitle()}.
* @param sourceClass the source class
* @return the application title
*/
protected @Nullable String getApplicationTitle(@Nullable Class<?> sourceClass) {
Package sourcePackage = (sourceClass != null) ? sourceClass.getPackage() : null;
return (sourcePackage != null) ? sourcePackage.getImplementationTitle() : null;
}
private AnsiPropertySource getAnsiSource() {
return new AnsiPropertySource("ansi", true);
}
private MapWithNullsPropertySource getVersionSource(Environment environment, @Nullable String defaultValue) {
return new MapWithNullsPropertySource("version", getVersionsMap(environment, defaultValue));
}
private Map<String, @Nullable Object> getVersionsMap(Environment environment, @Nullable String defaultValue) {
String appVersion = getApplicationVersion(environment);
String bootVersion = getBootVersion();
Map<String, @Nullable Object> versions = new HashMap<>();
versions.put("application.version", getVersionString(appVersion, false, defaultValue));
versions.put("spring-boot.version", getVersionString(bootVersion, false, defaultValue));
versions.put("application.formatted-version", getVersionString(appVersion, true, defaultValue));
versions.put("spring-boot.formatted-version", getVersionString(bootVersion, true, defaultValue));
return versions;
}
private @Nullable String getApplicationVersion(Environment environment) {
return environment.getProperty("spring.application.version");
}
protected @Nullable String getBootVersion() {
return SpringBootVersion.getVersion();
}
private @Nullable String getVersionString(@Nullable String version, boolean format, @Nullable String fallback) {
if (version == null) {
return fallback;
}
return format ? " (v" + version + ")" : version;
}
/**
* Like {@link MapPropertySource}, but allows {@code null} as map values.
*/
private static class MapWithNullsPropertySource extends EnumerablePropertySource<Map<String, @Nullable Object>> {
MapWithNullsPropertySource(String name, Map<String, @Nullable Object> source) {
super(name, source);
}
@Override
public String[] getPropertyNames() {
return StringUtils.toStringArray(this.source.keySet());
}
@Override
public @Nullable Object getProperty(String name) {
return this.source.get(name);
}
@Override
public boolean containsProperty(String name) {
return this.source.containsKey(name);
}
}
}
Domain
Source
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free