Home / Class/ ResourceBanner Class — spring-boot Architecture

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

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free